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에 빌드 컨텍스트로 전달됨
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 구성시 주의 필요
'DevOps > Docker' 카테고리의 다른 글
[Docker] Docker-compose란? (작동 구조, yaml 구성) (1) | 2022.08.17 |
---|---|
[Docker] Docker Network 종류 (0) | 2022.08.17 |
[Docker] Docker Volume 3가지 구성 방법 (0) | 2022.08.16 |
[Docker] Docker, Docker-compose 명령어 (0) | 2022.08.16 |
[Docker] Docker 란? (chroot, 생명주기 등) (0) | 2022.08.16 |