본문 바로가기
Server/Docker

[Docker] Dockerfile 명령어

by Youngs_ 2022. 5. 19.

ㅁ 컨테이너 변경사항을 commit 명령어를 사용하여 신규 이미지 생성하기

베이스 이미지로 실행된 컨테이너의 변경사항을 이미지화 하는 방법이다.

 
1
$ docker commit [옵션] 컨테이너명 [이미지명[:태그]]

ㅁ Dockerfile 생성하여 직접 이미지 제작하기

Dockerfile은 이미지를 직접 만들고자 할때 설정에 대한 정보를 담는 파일이다.

Dockerfile을 만들어 이미지를 직접 제작해보자

 

우선 테스트를 진행할 폴더를 신규 생성해서 해당 폴더에서 테스트를 진행하자

 
1
2
$ mkdir image-test
$ cd image-test

폴더에서 Dockerfile이라는 파일을 신규 생성해주고 안에 해당 내용을 붙여넣어주자

 
1
2
3
4
5
FROM ubuntu:latest
MAINTAINER jaehonglee <jaehong.lee@solarconnect.kr>
 
RUN apt-get -y update
RUN apt-get -y install vim

설정파일 내용을 살펴보면 ubuntu 파일을 베이스 이미지로 저자는 jaehonglee 이고 이미지를 생성하면서 update하고 vim을설치하는 .. 뭐 그런내용이다.

( Dockerfile 설정에 대한 내용은 테스트 이미지를 만들어보고 아래에서 자세하게 알아보기로 하자)

 

이후 터미널에서 build 명령어를 입력한다   ex.  docker build -t testimage .

 
1
$ docker build -t <이미지명> <Dockerfile경로>

 

build 후 images 목록을 확인하면 정상 이미지 생성이 된것을 알 수 있다.

 

ㅁ Dockerfile 명령어 알아보기

이미지를 생성하는데 사용했었던 Dockerfile의 명령어에 대해서 알아보자

 

FROM

베이스 이미지를 설정하는 명령어 

 
1
2
3
4
5
FROM <이미지명:태그>
 
 
// 사용 예
FROM ubuntu:latest

 

MAINTAINER

관리자의 정보를 기재하는 부분, 빌드에 영향을 주지 않기 때문에 생략하는 경우도 있다.

 
1
2
3
4
MAINTAINER <name>
 
// 사용 예
MAINTAINER jaehong <jaehong.lee@solarconnect.kr>

 

COPY

파일이나 디렉토리를 이미지로 복사하는 명령어
소스를 복사할때 많이 사용된다. 이미지 파일이 위치할 경로는 절대경로 방식으로 설정해야한다.
URL을 사용할 수 없고 압축이 해제되지 않고 그대로 복사된다

 
1
2
3
4
COPY <복사할 파일 경로> <이미지 파일이 위치할 절대경로>
 
// 사용 예
COPY . /app

 

ADD

파일이나 디렉토리를 이미지로 복사하는 명령어이다. COPY와 사용법까지 유사하지만 차이점이 있다.
ADD는 이미지 파일이 위치할 경로를 상대경로로 사용할 수 있고, URL을 사용할 수 있다.
또한 압축파일이 있으면 압축파일을 풀어서 추가된다. 

 
1
2
3
4
ADD <복사할 파일 경로> <이미지 파일이 위치할 경로>
 
// 사용 예
ADD . /app

 

RUN

이미지를 만드는 과정에서 이미지에서 사용해야하는 명령어를 실행해주는 명령어

 
1
2
3
4
RUN <명령어>
 
// 사용 예
RUN mkdir -p /app

 

CMD

컨테이너가 실행되었을때 실행되는 명령어를 정의하는 명령어
Dockerfile에 CMD명령어가 여러번 사용되어도 맨 마지막 명령어만 유효하다.
여러 명령어를 사용하고자 한다면 run.sh 파일을 만들어 해당 파일에 실행하고자 하는 명령어를 입력 해주어야 한다.
docker run 을 통해 인자값을 전달하게되면 CMD 명령어에 명시된 인자는 무시된다.

 
1
2
3
4
5
6
7
8
9
CMD ["executable","param1","param2"]
CMD ["param1","param2"]
CMD command param1 param2
 
 
// 사용 예
 
CMD touch test.txt
CMD ./bin/run.sh

 

ENTRYPOINT

컨테이너가 run으로 실행 되었을때 실행되는 명령어를 정의하는 명령어이다.
CMD명령어와 유사해 보이는데 차이점은 run을 통해 인자값이 전달 되어도 ENTRYPOINT로 지정 해놓은 명령어가 그대로 실행된다.

 
1
2
3
4
5
ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2
 
// 사용 예
ENTRYPOINT ["/entrypoint.sh"]

 

ENTRYPOINT와 CMD 비교

ENTRYPOINTCMD형태를 같게하여 이미지 생성 후run을 했을때 결과를 비교해보자

CMD Dockerfile

 
1
2
3
FROM ubuntu:latest
 
CMD ["echo", "Hello World"]

ENTRYPOINT Dockerfile

 
1
2
3
FROM ubuntu:latest
 
ENTRYPOINT ["echo", "Hello World"]

두개의 이미지를 각각 cmdtest, entrytest의 이름으로 생성하였고 이미지에 매개변수를 전달하면서 run 해보자

 

 
1
2
3
4
5
6
7
$ docker run -it --rm cmdtest echo "hi"
$ docker run -it --rm entrytest echo "hi"
 
 
# 결과
hi
Hello world echo hi

CMD 에서는 매개변수에 영향을 받아 매개변수를 출력시킨것을 볼수 있고 ENTRYPOINT 는 매개변수를 무시하고 기존 명령어를 실행한 후 전달된 매개변수는 단순 출력된것을 알 수 있다.

 

 

 

WORKDIR

COPYADDRUNCMD등이 수행될 기본 디렉토리를 설정해주는 명령어.

 
1
2
3
4
WORKDIR <경로>
 
// 사용 예
WORKDIR /app

 

EXPOSE

컨테이너와 호스트를 연결할 포트를 지정해주는 명령어.

 
1
2
3
4
5
EXPOSE <포트번호>
 
// 사용 예
EXPOSE 80
EXPOSE 3000

 

ENV

RUNCMDENTRYPOINT 명령어에서 사용하는 환경 변수를 지정하는 명령어
사용할떄는 환경변수명 앞에 $를 붙여주면 된다

 
1
2
3
4
5
6
7
8
9
10
11
12
13
ENV <key> <value>
 
// 사용 예
FROM ubuntu:latest
ENV age 27CMD echo $age
 
// build & run 실행 시
docker build -t envtest .
docker run -it --rm envtest
 
 
#결과
27

 

 

VOLUME

VOLUME 은 컨테이너의 외부에 파일시스템을 연결하기 위해 사용한다.

 

댓글