[Docker] 03-Docker Image 만들기
[Docker] 03-Docker Image 만들기
도커 이미지 만들기
Dockerfile
Dockerfile은 애플리케이션을 도커 이미지로 패키징하기 위한 설정 파일이자 스크립트이다. 사용자가 정의한 일련의 인스트럭션(Instruction)에 따라 도커 이미지가 빌드된다.
주요 인스트럭션
FROM: 베이스 이미지를 지정 (OS나 런타임 환경)ENV: 컨테이너 내부에서 사용할 환경 변수를 지정WORKDIR: 컨테이너 내부의 작업 디렉토리를 생성하고 지정 (이후 명령어는 이 곳에서 실행됨)COPY: 호스트(로컬)의 파일이나 디렉토리를 컨테이너 내부로 복사CMD: 컨테이너가 실행(Start)될 때 기본적으로 실행할 명령어를 지정
컨테이너 이미지 빌드부터 실행
작성된 Dockerfile을 기반으로 이미지를 생성하려면 docker image build 명령어를 사용한다.
1
2
3
4
docker image build --tag [IMAGE_NAME] [PATH]
- `-t` or `--tag` : 이미지 이름 지정
- [PATH] : 파일의 위치. 현재 작업 디렉토리는 .으로 표현한다.
이렇게 생성한 이미지는 다음과 같이 내려받을 수 있다.
1
`docker image pull [IMAGE_NAME]` : 도커 이미지 내려받기
도커 이미지는 빌드 과정에서 설정값에 기본값을 포함하여 패키징된다. 그러나 컨테이너 실행 과정에서 --env 플래그를 사용하여 다른 값을 지정할 수 있다.
1
`docker container run --env [KEY]=[VALUE] [IMAGE_NAME]` : 환경변수(KEY)에 원하는 설정(VALUE)으로 변경하여 실행
도커 이미지
도커 이미지는 거대한 단일 파일처럼 보이지만, 실제로는 여러 개의 읽기 전용(Read-Only) 레이어가 겹겹이 쌓인 구조다. 도커는 이 레이어들을 조립(Union File System)하여 하나의 통합된 파일 시스템으로 보여준다.
이미지 레이어의 특징
- 계층 구조: Dockerfile의 인스트럭션 하나가 실행될 때마다 새로운 레이어가 생성되어 쌓인다.
- 독립성과 공유: 각 레이어는 독립적으로 도커 엔진의 캐시에 저장된다. 만약 다른 이미지에서 동일한 레이어(예: 동일한 Base OS)를 사용한다면, 이를 새로 다운로드하지 않고 공유하여 재사용한다.
- 효율성: 이 구조 덕분에 이미지의 논리적 용량 합계보다 실제 디스크 점유 용량이 훨씬 적다.
이미지 레이어를 통해 도커 이미지의 논리적 용량보다 적은 디스크 용량으로 실행 가능
이미지 레이어 캐시를 이용한 Dockerfile 최적화
도커가 Dockerfile을 통해 이미지를 빌드할 때 빌드 캐시(Build Cache)를 적극적으로 활용하여 빌드 시간을 단축한다.
캐시 동작 원리
- 빌드 과정에서 생성되는 이미지 레이어에 해시값 지정(인스트럭션 + 인스트럭션 결과 기반)
- 재빌드 시, 변경되지 않은 인스트럭션은 기존에 생성된 레이어(캐시)를 그대로 가져와 사용
- 만약 특정 인스트럭션의 내용(또는 복사되는 파일)이 변경되어 캐시가 깨지면, 그 이후의 모든 인스트럭션은 캐시를 사용하지 않고 새로 실행
이러한 특징으로 인해 Dockerfile을 작성할 때는 인스트럭션이 잘 수정되지 않는 순서로 배치해야한다. 이를 통해 레이어 캐시 재사용률을 높여서 최적화를 수행할 수 있다.
This post is licensed under CC BY 4.0 by the author.