DevOps/Docker

[Docker] Dockerfile 빌드 과정, 문법 정리, Docker Layer

yubi5050 2022. 8. 16. 17:11

Dockerfile 이란?

Docker image 생성(빌드)시 컨테이너에 설치될 패키지, 소스코드, 실행 명령어 등을 기록된 이미지 설정 파일

 

 

Dockerfile 문법

문법 역할
FROM Base 이미지 
LABEL 이미지에 대한 LABEL
RUN shell 명령어 실행
- 주로 package 설치나 기본 설정에 많이 사용
- chaining 활용하여 되도록 한줄에 작성하는 것이 권장
- 설치 과정에 -y 옵션 적용 필요
ex) RUN apk add curl
ex) RUN ['python', 'manage.py', 'runserver']
CMD 컨테이너 내부에서 실행 명령
- Dockerfile에서 한번만 사용 가능
- 명령, 인자값 설정 가능하며 없을시 기본값으로 
ENTRYPOINT 컨테이너 내부에서 실행 명령
- 명령 수정 불가능
- 고정적으로 실행될 명령 주로 작성 (항상실행)
COPY 로컬 파일 or 디렉토리 파일을 도커 이미지에 복사
- 단순 복사의 역할이라 투명성이 있다고 표현 (생성 파일 추적 가능)
ADD . 로컬 파일 or 디렉토리 파일을 도커 이미지에 복사 (COPY 보다 조금 더 확장)
- Auto extraction : 압축 파일(.tar)을 대상 디렉토리에 추출
- Remote URL : 원격지의 파일(wget)을 대상 디렉토리로 복사
- 압축 해제 등의 절차를 거치다 보니 투명성이 없다고 표현 (생성 파일 추적 불가능)
EXPOSE Expose : 호스트 내부의 다른 컨테이너들만 액세스 가능
Port : 호스트 외부의 다른 호스트들도 호스트 포트번호로 액세스 가능
WORKDIR 작업 디렉토리 지정 (= cd )
ENV 컨테이너 안에서 환경 변수로 사용 가능
ARG Dockerfile에서만 변수 사용 가능 (Build에 필요한)
VOLUME 볼륨 마운트
ONBUILD 빌드 완료 후 생성한 이미지를 다른 Dockerfile에서 FROM으로 사용할 때

 

Dockerfile 빌드 과정

빌드 컨텍스트 (Build context)

  • docker build 시작시 작업중인 디렉토리, 파일들을 빌드 컨텍스트라고 지칭함.
  • Dockerfile 위치와 상관 없이 현재 위치의 모든 파일/디렉토리는 daemon에 빌드 컨텍스트로 전달됨

 

daemon에 context 전달하는 것

 

Docker Layer

  • RUN, ADD, COPY : 레이어로 저장됨 (실제 변화를 일으킴)
  • CMD, LABEL, ENV, EXPOSE : 임시 레이어로 저장되어 도커 이미지 사이즈에 영향 X
  • Docker란 Layer들의 묶음으로, 이미지 Layer들은 읽기 전용으로 컨테이너 실행시 최종 컨테이너 Layer가 추가 됨
  • Union File System 기반 동작으로 하위 파일 시스템 (이미지 Layer) 에 대한 CoW(Copy on Write) 전략을 따름
  • 이미지 Lyer은 읽기 전용으로 상위 레이어로 복사해서 작업

 

 

Dockerfile 기반의 Layer 생성 및 이미지 커밋

  • Dockerfile의 한 Line씩 실행하며 Line마다 (1)~(4)의 과정을 거침
  • (1) 새로운 Layer마다 하나의 컨테이너가 생성
  • (2) 명령어 실행
  • (3) 레이어 생성 완료
  • (4) 이미지 커밋 및 Container 삭제

 

 

Dockerfile Cache를 이용한 이미지 빌드

  • 만약 재빌드 간의 Layer의 변경 사항이 없거나 이미 Layer를 가지고 있는 경우 발생
  • 아래 예제와 같이 cached 된 Layer를 자동 사용하게 된다.
  • 이전에 빌드했던 Dockerfile에 같은 내용이 있다면, 같은 명령어 줄까지 이미지 생성

 

 

※ (주의) 만약 자주 변경되는 부분 (app.py, templates/ 등)이 dockerfile의 위쪽에 있게 된다면 layer caching을 잘 활용하지 못하므로 Layer 구성시 주의 필요