Dockerfile 빌드 프로세스 상세 설명

Dockerfile 소개

Dockerfile은 Docker 이미지를 빌드하기 위한 명령어 스크립트 파일입니다.

빌드 단계:

  1. Dockerfile 파일 작성
  2. docker build 명령어로 이미지 빌드
  3. docker run 명령어로 이미지 실행
  4. docker push 명령어로 이미지 배포(DockerHub, Alibaba Cloud 이미지 저장소 등)

Dockerfile 빌드 과정

기본 개념

  • 모든 예약어(명령어)는 반드시 대문자로 작성
  • 위에서 아래로 순차적으로 실행
  • # 기호로 주석 처리
  • 각 명령어는 새로운 이미지 레이어를 생성하고 커밋

Dockerfile 레이어 구조

Dockerfile은 개발자의 주요 도구로, 프로젝트 배포와 이미지 생성을 위해 반드시 작성해야 합니다. Docker 이미지는 기업의 표준 전달 방식으로 자리잡고 있으며, 개발, 배포, 운영의 모든 단계에서 중요합니다.

세 가지 주요 요소:

  • Dockerfile: 빌드 파일로, 모든 단계와 소스 코드를 정의
  • Docker 이미지: Dockerfile로 생성된 최종 제품으로, 배포 및 실행에 사용
  • Docker 컨테이너: 이미지가 실행되어 서비스를 제공하는 환경

Dockerfile 명령어

FROM            # 기본 이미지, 모든 빌드의 시작점
MAINTAINER      # 이미지 작성자 정보 (이름 + 이메일)
RUN             # 이미지 빌드 중 실행할 명령어
ADD             # 파일/디렉토리를 이미지에 추가 (압축 파일 자동 해제)
WORKDIR         # 이미지의 작업 디렉토리 설정
VOLUME          # 마운트할 디렉토리 지정
EXPOSE          # 컨테이너가 사용할 포트 설정
CMD             # 컨테이너 시작 시 실행할 명령어 (마지막 하나만 적용, 덮어쓰기 가능)
ENTRYPOINT      # 컨테이너 시작 시 실행할 명령어 (명령어 추가 가능)
ONBUILD         # 현재 Dockerfile을 기반으로 다른 이미지 빌드 시 실행될 트리거 명령어
COPY            # ADD와 유사, 파일을 이미지로 복사
ENV             # 이미지 빌드 시 환경 변수 설정

Dockerfile 명령어 다이어그램

실전 테스트

Docker Hub에 있는 대부분의 이미지는 FROM scratch에서 시작하여 필요한 소프트웨어와 구성을 추가합니다.

기본 이미지 예시

사용자 정의 CentOS 이미지 생성

# 1. Dockerfile 작성
$ vim Dockerfile-centos
$ cat Dockerfile-centos

FROM centos:7
MAINTAINER developer <dev@example.com>

ENV WORK_PATH /usr/local
WORKDIR $WORK_PATH

RUN yum -y install vim net-tools

EXPOSE 80

CMD echo $WORK_PATH
CMD echo "----end----"
CMD /bin/bash

# 2. 이미지 빌드
# docker build -f Dockerfile 경로 -t 이미지명:[태그] .
# Dockerfile이라는 이름을 사용하면 -f 옵션 생략 가능
# 마지막 .은 현재 디렉토리를 의미
$ docker build -f Dockerfile-centos -t my-centos:0.1 .

# 3. 실행 테스트
$ docker images | grep centos
my-centos   0.1   6627b0adacef   54 seconds ago   501MB

$ docker run -it my-centos:0.1
[root@775d3babc008 local]# pwd
/usr/local   # WORKDIR로 설정한 디렉토리로 바로 진입

기본 CentOS와 비교

기본 CentOS 이미지

커스터마이징된 이미지

커스터마이징된 이미지

이미지 빌드 히스토리 확인

이미지 히스토리

이를 통해 이미지의 구성 과정을 이해할 수 있습니다.

CMD와 ENTRYPOINT의 차이

CMD         # 컨테이너 시작 시 실행할 명령어, 마지막 하나만 적용되며 덮어쓰기 가능
ENTRYPOINT  # 컨테이너 시작 시 실행할 명령어, 추가 명령어를 덧붙일 수 있음

CMD 테스트

# Dockerfile 작성
$ cat Dockerfile-cmd
FROM centos:7
CMD ["ls", "-a"]

# 이미지 빌드
$ docker build -f Dockerfile-cmd -t cmd-test .
$ docker images | grep cmd-test
cmd-test   latest   c757e3a723ae   2 years ago   204MB

# 실행: ls -a 명령어 실행
$ docker run cmd-test
.
..
.dockerenv
anaconda-post.log
bin
dev
etc
...

# 추가 명령어 시도
$ docker run cmd-test -l
docker: Error response ...: executable file not found in $PATH.

# -l이 CMD의 ["ls", "-a"]를 대체하여 명령어 오류 발생

ENTRYPOINT 테스트

# Dockerfile 작성
$ cat Dockerfile-entrypoint
FROM centos:7
ENTRYPOINT ["ls", "-a"]

# 이미지 빌드
$ docker build -f Dockerfile-entrypoint -t entrypoint-test .
$ docker images | grep entrypoint-test
entrypoint-test   latest   5184c7d459a0   2 years ago   204MB

# 실행
$ docker run entrypoint-test
.
..
.dockerenv
anaconda-post.log
bin
dev
etc
...

# 추가 명령어 적용
$ docker run entrypoint-test -l
total 64
drwxr-xr-x   1 root root  4096 Mar  3 12:06 .
drwxr-xr-x   1 root root  4096 Mar  3 12:06 ..
-rwxr-xr-x   1 root root     0 Mar  3 12:06 .dockerenv
...

핵심 차이점: CMD는 지정된 명령어가 완전히 대체되지만, ENTRYPOINT는 추가 명령어를 덧붙일 수 있습니다.

태그: docker Dockerfile 컨테이너 이미지빌드 CMD

7월 12일 16:22에 게시됨