[Docker] 도커 파일(Dockerfile)

Sungwoo·2025년 1월 23일

Docker

목록 보기
4/4
post-thumbnail

Dockerfile

도커 파일은 도커 이미지를 만들고 빌드하기 위한 텍스트 파일로, 컨테이너 이미지를 구성하는데 필요한 모든 단계와 명령을 정의한다.
쉽게 만들 이미지에 대한 정보를 기술해둔 템플릿(template)이라고 볼 수 있다.

반복적이고 일관적인 컨테이너 이미지 빌드 프로세스를 자동화할 수 있게된다.

도커 파일 예시

FROM ubuntu:20.04
COPY . /app
RUN make /app
CMD python /app/app.py

도커파일은 위와 같이 명령어들을 나열한 형태로 작성한다.
각 line의 맨 앞은 대문자로 이루어진 명령어(Instruction)로 시작한다.

다음과 같은 명령어(Instruction)들이 있다.

명령어설명
ADD로컬 또는 원격 파일 디렉토리 추가
ARG빌드 시간 변수 사용
CMD기본 명령어 지정
COPY파일 및 디렉토리 복사
ENTRYPOINT기본 실행 가능한 파일 지정
ENV환경 변수 설정
EXPOSE애플리케이션이 수신 대기중인 포트 설명
FROM기본 이미지에서 새로운 빌드 스테이지 생성
HEALTHCHECK컨테이너의 시작 시 건강 상태 확인
LABEL이미지에 메타데이터 추가
MAINTAINER이미지의 작성자 지정
ONBUILD빌드 시 이미지가 사용될 때의 지침 설정
RUN빌드 명령어 실행
SHELL이미지의 기본 쉘 설정
STOPSIGNAL컨테이너 종료 시스템 콜 신호 지정
USER사용자 및 그룹 ID 설정
VOLUME볼륨 마운트 생성
WORKDIR                  작업 디렉토리 변경                                                 

Dockerfile 특징

텍스트 기반
일반 텍스트 파일로 작성되어 코드 버전 관리 시스템을 통해 추적하고 관리할 수 있다.

실행 명령어
Docker 이미지를 구성하는 데 필요한 명령어를 포함한다.
명령어들은 순차적으로 실행되며, 각 명령어가 새로운 레이어를 Docker 이미지에 추가한다.

고정된 환경
Dockerfile을 통해 생성된 이미지는 이를 실행하는 환경에 상관없이 항상 동일한 결과를 생성한다.

재사용 가능
Dockerfile은 재사용 가능하며, 다른 Dockerfile에 기반을 제공할 수 있다.
예를 들어 Python 환경을 설정한 Dockerfile을 작성한 다음, 이를 기반으로 Django를 설치하는 Dockerfile을 작성할 수 있다.

빌드 자동화
Dockerfile을 사용하면 이미지 빌드 과정을 자동화할 수 있다.
docker build 명령을 사용하여 Dockerfile을 바탕으로 Docker 이미지를 생성할 수 있다.

Dockerfile process

  1. Dockerfile
    Dockerfile에서 일련의 명령을 작성해 이미지를 빌드하는 방법을 지정한다.
    이미지를 지정하고 필요한 패키지를 설치하고 파일을 복사하여 명령을 실행하는 등의 작업을 수행한다.

  2. Dockerfile -> (build)
    Docker 엔진이 Dockerfile을 한 줄씩 읽어서 이미지를 빌드한다.
    = Dockerfile Layer

  3. Docker Image -> (Run) -> Docker Container
    빌드된 이미지를 실행하여 도커 컨테이너를 구성한다.

Dockerfile Layer

Dockerfile을 빌드하여 이미지를 생성할 때 각 명령어를 한 줄씩 읽어가며 이미지의 레이어를 생성하며, 각 생성된 레이어는 변경 사항이 있는 경우에만 다시 빌드된다.

Dockerfile Cached Layer

명령의 결과를 캐싱한 후 동일한 명령어를 실행할 때 재사용해 이미지 빌드 속도를 향상시킬 수 있다.

이전에 빌드한 이미지의 레이어가 변경되지 않았다면 이전에 캐싱된 결과를 사용하여 다시 빌드하지 않는다.
이를 통해 빌드 프로세스를 가속화하고 최종 이미지의 크기를 줄일 수 있다.

Dockerfile Update the instruction order


명령어 순서를 변경해 빌드 과정에서 캐시를 효율적으로 활용할 수 있다.
Docker에서 각 명령어를 별도의 레이어에 저장하고 이전에 빌드한 적이 레이어는 캐시에서 가져온다.

예시로 위 사진의 명령어 중 COPY..명령어를 COPY go.mod go.sum. COPY..로 분리하고 RUN go mod download를 두 명령어 사이에 배치해 의존성 다운로드를 캐시할 수 있게 했다.
이렇게 하면 코드가 변경되었을 때 의존성 다운로드 단계를 건너뛸 수 있어 빌드 속도를 향상시킬 수 있다.


References
https://docs.docker.com/
https://adjh54.tistory.com/414

0개의 댓글