본문 바로가기
DevOps/Kubernetes & Docker

Dockerfile 작성하기

by Hwan,. 2023. 9. 16.
728x90
반응형

Dockerfile?

  • Dockerfile은 원하는 Docker Container Image를 생성하기 위한 스크립트 파일이다.
  • Docker는 build 옵션을 통해 Dockerfile에 나열된 명령문을 차례대로 수행하며 Container Image를 생성해준다.
  • Dockerfile을 읽을 줄 안다는 것은 해당 이미지가 어떻게 구성되어 있는지 알 수 있다는 의미이다.

 

Dockerfile 작성 방법

키워드

FROM: 시작점이 될 베이스 이미지를 지정한다.

 

MAINTAINER: 이미지를 생성한 개발자의 정보를 표시한다. (1.13.0 이후에는 권장되지 않고, LABEL을 사용하는 것이 좋다.)

 

LABEL: 이미지에 메타데이터를 추가한다. key-value 형태로 지정된다.

 

RUN:
이미지 내에서 명령어를 실행한다. 실행 결과는 새로운 레이어에 기록되고, 이 레이어는 최종 이미지에 포함된다.
각 RUN 명령은 새로운 레이어를 생성하며, 이러한 레이어들은 캐시되어 재사용될 수 있다.

 

WORKDIR:
컨테이너 내에서의 작업 디렉토리를 지정한다.
해당 디렉토리가 없으면 자동으로 생성되며, 이후의 작업들은 이 디렉토리 내에서 실행된다.

 

EXPOSE:
이미지를 실행할 때 열려야 하는 포트를 지정한다.
이 포트는 컨테이너 실행 시 -p 옵션으로 호스트와 매핑될 수 있다.

 

USER: 컨테이너가 실행될 때 사용될 사용자를 지정한다. (기본값 root)

 

COPY / ADD:
호스트 시스템의 파일이나 디렉토리를 이미지에 복사한다.
ADD는 COPY보다 확장된 기능을 제공한다. ADD는 URL로부터 파일을 가져오거나 압축 해제 기능도 제공한다.
특별한 기능이 필요하지 않은 경우, COPY를 사용하는 것이 권장된다.

 

ENV: 컨테이너 내에서 사용될 환경 변수를 설정한다.

 

CMD / ENTRYPOINT:
컨테이너를 생성하거나 실행할 때 수행될 명령어를 정의한다.
docker run 명령으로 새 컨테이너를 생성하거나, docker start 명령으로 정지된 컨테이너를 시작할 때 해당 명령어가 실행된다.
주로 컨테이너 내부에서 지속적으로 실행되어야 하는 서버나 애플리케이션을 시작할 때 사용된다.

 

CMD:
CMD는 docker run 실행 시 추가적인 명령어가 주어지면, 해당 명령어를 ENTRYPOINT에 지정된 명령어의 인자로 사용한다. 만약 ENTRYPOINT가 정의되어 있지 않다면, CMD에서 지정한 명령어를 실행한다.

Dockerfile 내에서 CMD를 여러 번 정의할 수 있지만, 마지막으로 정의된 CMD만 최종적으로 사용된다.

 

CMD는 3가지 형태로 작성될 수 있다:
- CMD ["executable", "param1", "param2"]: 실행할 프로그램과 그에 대한 인자를 지정한다.
- CMD ["param1", "param2"]: ENTRYPOINT로 지정된 실행 가능한 파일의 인자로 사용된다.
- CMD command param1 param2: shell 형태로 명령어를 실행한다. 여기서는 /bin/sh -c를 사용하여 해당 명령어를 실행한다.

 

ENTRYPOINT :
ENTRYPOINT는 docker run 실행 시, 추가적인 명령어가 주어지면 이 명령어는 ENTRYPOINT에 지정된 명령어에 대한 인자로 사용된다. CMD에서 기본 인자가 제공되었을 때 docker run에서 명령어를 추가로 주게 되면, CMD의 인자는 덮어쓰여진다.

ENTRYPOINT 명령은 2가지 형태로 제공된다:
- exec 형태: ENTRYPOINT ["executable", "param1", "param2"]. 이 형태는 명령어가 PID 1로 실행되어 신호 처리가 올바르게 이루어진다.
- shell 형태: ENTRYPOINT command param1 param2. 이 형태를 사용할 때, 명령어는 실제로 /bin/sh -c 내에서 실행되므로 신호 처리에 주의가 필요하다.

 

ENTRYPOINT는 CMD와 함께 사용될 때, ENTRYPOINT는 실행할 명령어를, CMD는 그 명령어의 기본 인자로 사용된다.

 

 

Docker 빌드

  • Dockerfile의 기본이름은 Dockerfile이다.
    파일명을 이렇게 설정하면 파일이 위치한 경로에서 docker build . 만 해도 빌드가 가능하다.
    하지만 이렇게 생성하면  이미지의 이름과 태그가 없기 때문에 -t 옵션으로 태그와 파일명 지정이 가능하다.
docker build . -t container_name:tag
  • Dockerfile은 파일명 변경이 가능하다.
    위에서 파일명을 다르게 지정했다면  -f 옵션으로 지정이 가능하다.
docker build -t container_name:tag -f my.Dockerfile .

 

728x90
반응형

댓글