Continuous Challenge

[Docker] Dockerfile 작성하기 본문

Programming/[2020] Docker Project

[Docker] Dockerfile 작성하기

응굥 2020. 3. 13. 16:42
728x90
728x90

Dockerfile : Docker 이미지 설정 파일. Dockerfile에 설정된 내용대로 이미지를 생성한다.

 

Dockerfile은 <명령> <매개 변수> 형식으로 작성한다. #은 주석이다. 명령은 대소문자를 구분하지 않지만 보통 대문자로 작성한다.

Docker는 Dockerfile에 작성된 명령을 순서대로 처리한다. 그리고 Dockerfile에서 명령은 항상 FROM으로 시작해야 한다.

FROM이 없거나 FROM 앞에 다른 명령이 있으면 이미지가 생성되지 않는다. 또한, 각 명령은 독립적으로 실행된다.

 

이미지를 생성할 때는 Dockerfile이 있는 디렉터리에서 docker build 명령을 사용한다.

 

  • .dockerignore

Dockerfile과 같은 디렉터리에 들어있는 모든 파일을 컨텍스트(context)라고 한다. 특히 이미지를 생성할 때 컨텍스트를 모두 Docker 데몬에 전송하므로 필요없는 파일이 포함되지 않도록 주의한다.

컨텍스트에서 파일이나 디렉터리를 제외하고 싶을 때는 .dockerignore 파일을 사용하면 된다. Docker는 Go 언어로 작성되어 있기 때문에 파일 매칭도 Go 언어의 규칙을 따른다.

 

특정 파일이나 디렉터리를 제외할 수 있고, 보통 *를 주로 사용한다. 버전 관리 시스템을 이용하여 Dockerfile과 필요한 파일을 관리할 때, .git, .svn과 같은 디렉터리는 제외해준다.

 

  • FROM

FROM은 어떤 이미지를 기반으로 이미지를 생성할지 설정한다. Dockerfile로 이미지를 생성할 때는 항상 기존에 있는 이미지를 기반으로 생성하기 때문에 FROM은 반드시 설정해야 한다.

 

<형식>

- FROM <이미지>

- FROM <이미지>:<태그> 

 

이미지를 생성할 때 FROM에 설정한 이미지가 로컬에 있으면 바로 사용하고, 없으면 Docker Hub에서 받아온다.

Dockerfile 파일 하나에 FROM을 여러 개 설정할 수 있다. FROM을 두 개 설정했다면 이미지가 두 개 생성된다.

--tag 옵션으로 이미지 이름을 설정했다면 이는 맨 마지막 FROM에 적용된다.

 

  • MAINTAINER

MAINTAINER는 이미지를 생성한 사람의 정보를 설정한다. 형식은 자유이며 보통 이름과 이메일을 입력한다.

 

  • RUN

RUN은 FROM에서 설정한 이미지 위에서 스크립트 혹은 명령을 실행한다. 여기서 RUN으로 실행한 결과가 새 이미지로 생성되고, 실행 내역은 이미지의 히스토리에 기록된다.

 

  • CMD

CMD는 컨테이너가 시작되었을 때 스크립트 혹은 명령을 실행한다. 즉 docker run 명령으로 컨테이너를 생성하거나, docker start 명령으로 정지된 컨테이너를 시작할 때 실행된다. CMD는 Dockerfile에서 한 번만 사용할 수 있다.

 

  • ENTRYPOINT

ENTRYPOINT는 컨테이너가 시작되었을 때 스크립트 혹은 명령을 실행한다. 즉 docker run 명령으로 컨테이너를 생성하거나, docker start 명령으로 정지된 컨테이너를 시작할 때 실행된다. ENTRY POINT는 Dockerfile에서 단 한번만 사용할 수 있다.

 

CMD 와 ENTRYPOINT는 컨테이너가 생성될 때 명령이 실행되는 것은 동일하지만 docker run 명령에서 동작 방식이 다르다.

 

  • EXPOSE

EXPOSE는 호스트와 연결할 포트 번호를 설정한다. docker run 명령의 --expose 옵션과 동일하다.

EXPOSE는 호스트와 연결만 할 뿐 외부에 노출은 되지 않는다. 포트를 외부에 노출하려면 docker run 명령의 -p, -P 옵션을 사용해야 한다.

 

  • ENV

ENV는 환경 변수를 설정한다. ENV로 설정한 환경 변수는 RUN, CMD, ENTRYPOINT에 적용된다.

 

  • ADD

ADD는 파일을 이미지에 추가한다. 

 

<형식>

- ADD <복사할 파일 경로> <이미지에서 파일이 위치할 경로>

 

  • COPY

COPY는 파일을 이미지에 추가한다. ADD와는 달리 COPY는 압축 파일을 추가할 때 압축을 해제하지 않고, 파일 URL도 사용할 수 없다. 

 

<형식>

- COPY <복사할 파일 경로> <이미지에서 파일이 위치할 경로>

 

  • VOLUME

VOLUME은 디렉터리의 내용을 컨테이너에 저장하지 않고 호스트에 저장하도록 설정한다. 

 

<형식>

- VOLUME <컨테이너 디렉터리> 

- VOLUME ["컨테이너 디렉터리 1", "컨테이너 디렉터리2"]

 

/data 처럼 바로 경로를 설정할 수도 있고, ["/data", "/var/log/hello"] 처럼 배열 형태로 설정할 수도 있다. 단, VOLUME으로는 호스트의 특정 디렉터리와 연결할 수는 없다.

 

데이터 볼륨을 호스트의 특정 디렉터리와 연결하려면 docker run 명령에서 -v 옵션을 사용해야 한다.

옵션은 -v <호스트 디렉터리>:<컨테이너 디렉터리> 형식이다.

 

  • USER

USER는 명령을 실행할 사용자 계정을 설정한다. RUN, CM, ENTRYPOINT에 적용된다.

USER 뒤에 오는 모든 RUN, CMD, ENTRYPOINT에 적용되며, 중간에 다른 사용자를 설정하여 사용자를 바꿀 수 있다.

 

<형식>

USER <계정 사용자명>

 

  • WORKDIR

WORKDIR은 RUN, CMD, ENTRYPOINT의 명령이 실행될 디렉터리를 설정한다.

WORKDIR 뒤에 오는 모든 RUN, CMD, ENTRYPOINT에 적용되며, 중간에 다른 디렉터리를 설정하여 디렉터리를 바꿀 수 있다.

 

<형식>

WORKDIR <경로>

 

WORKDIR은 절대 경로 대신 상대 경로도 사용할 수 있다. 상대 경로를 사용하면 먼저 설정한 WORKDIR의 경로를 기준으로 디렉터리를 변경한다. 최초 기준은 / 이다.

 

  • ONBUILD

ONBUILD는 생성한 이미지를 기반으로 다른 이미지가 생성될 때 명령을 실행(trigger)한다. 최초에 ONBUILD를 사용한 상태에서는 아무 명령도 실행하지 않는다. 다음번에 이미지가 FROM으로 사용될 때 실행할 명령을 예약하는 기능이라 할 수 있다.

 

<형식>

ONBUILD <Dockerfile 명령> <Dockerfile 명령의 매개 변수>

 

FROM, MAINTAINER, ONBUILD를 제외한 모든 Dockerfile 명령을 사용할 수 있다.

 

ONBUILD는 이미지를 생성한 뒤 해당 이미지를 기반으로 커스터마이징을 할 때 활용할 수 있다.

ONBUILD는 바로 아래 자식 이미지를 생성할 때만 적용되고, 손자 이미지에는 적용되지 않는다. 즉, ONBUILD 설정은 상속되지 않는다.

 

 

참고 : http://pyrasis.com/book/DockerForTheReallyImpatient/Chapter07

 

가장 빨리 만나는 Docker 7장 Dockerfile 자세히 알아보기

 

pyrasis.com

 

728x90
728x90
Comments