1. Docker 이미지 레이어란?
Docker 이미지는 여러 불변의 레이어(Immutable Layers)로 구성됩니다. 각 레이어는 이미지의 파일 시스템 변화(추가, 수정, 삭제)를 나타내며, 이러한 레이어들이 결합되어 최종적으로 하나의 이미지가 됩니다.
특징
- 불변성: 각 레이어는 읽기 전용이며, 생성된 이후 변경되지 않습니다.
- 효율성: 여러 이미지는 공통된 레이어를 공유하여 저장 공간을 절약합니다.
- 캐싱: Docker는 레이어를 캐싱하여 빌드와 배포 속도를 높입니다.
2. Docker 레이어의 구성
Docker 이미지는 다음과 같은 방식으로 레이어를 구성합니다:
- 베이스 레이어(Base Layer)
- Dockerfile의
FROM
명령어에서 지정된 기본 이미지입니다. - 예:
FROM ubuntu:20.04
는 Ubuntu 20.04를 기반으로 한 이미지를 가져옵니다.
- Dockerfile의
- 중간 레이어(Intermediate Layer)
- Dockerfile의 각 명령(
RUN
,COPY
,ADD
등)은 새로운 레이어를 생성합니다. - 예:
위의 두RUN apt-get update RUN apt-get install -y curl
RUN
명령은 각각 하나의 레이어를 생성합니다.
- Dockerfile의 각 명령(
- 최종 레이어(Final Layer)
- Dockerfile의 마지막 명령으로 생성된 레이어입니다.
- 예: 애플리케이션 바이너리, 실행 스크립트 등이 포함될 수 있습니다.
3. 레이어의 동작 원리
Docker 이미지 레이어는 Union File System(합쳐진 파일 시스템)을 사용하여 동작합니다.
- 읽기 전용 레이어(Read-only Layers): 이미지의 모든 레이어는 불변이며 읽기 전용입니다.
- 쓰기 가능한 레이어(Writeable Layer): 컨테이너 실행 시, 최상단에 쓰기 가능한 레이어가 추가됩니다. 이 레이어를 컨테이너 레이어라고 합니다.
레이어의 파일 시스템 동작
- 추가(ADD): 새로운 파일은 현재 레이어에 저장됩니다.
- 수정(MODIFY): 파일을 수정하면 기존 파일을 삭제하고, 새로운 파일을 추가한 것처럼 처리됩니다.
- 삭제(DELETE): 파일 삭제는 "파일 삭제" 플래그를 설정하여 처리됩니다.
4. Docker 레이어의 장점
1. 중복 제거 및 저장 공간 절약
- 동일한 레이어를 공유하기 때문에 여러 이미지가 같은 레이어를 참조하면 저장 공간이 절약됩니다.
2. 빌드 속도 최적화
- Docker는 이전 빌드에서 생성된 레이어를 캐싱하여, 변경되지 않은 레이어를 재사용합니다. 이를 통해 빌드 시간을 단축할 수 있습니다.
3. 네트워크 효율성
- Docker 이미지를 다운로드할 때 이미 로컬에 있는 레이어는 건너뛰고, 변경된 레이어만 다운로드합니다.
5. 레이어 확인 방법
Docker 이미지의 레이어를 확인하려면 다음 명령어를 사용합니다:
docker image history <IMAGE_ID>
출력 예시
IMAGE CREATED CREATED BY SIZE COMMENT
<layer_id> 2 minutes ago /bin/sh -c apt-get install -y curl 24.5MB
<layer_id> 3 minutes ago /bin/sh -c apt-get update 22.3MB
<layer_id> 4 minutes ago /bin/sh -c #(nop) ADD file:1234567890.tar.gz 5.3MB
6. 레이어 최적화 방법
1. 명령어 결합
- 불필요한 레이어 생성을 줄이기 위해 여러 명령어를 하나로 결합합니다.
- 예:
# 비효율적인 방식 RUN apt-get update RUN apt-get install -y curl # 효율적인 방식 RUN apt-get update && apt-get install -y curl
2. 불필요한 파일 제거
- 불필요한 파일은 빌드 과정에서 제거하여 이미지 크기를 줄입니다.
- 예:
RUN apt-get update && apt-get install -y curl && rm -rf /var/lib/apt/lists/*
3. 멀티스테이지 빌드
- 빌드 환경과 최종 실행 환경을 분리하여 이미지 크기를 최소화합니다.
- 예:
FROM golang:1.19 as builder WORKDIR /app COPY . . RUN go build -o main . FROM alpine:latest WORKDIR /root/ COPY --from=builder /app/main . CMD ["./main"]
7. 레이어 캐싱 동작 이해
Docker는 Dockerfile의 각 명령을 실행할 때 캐싱 여부를 판단합니다.
- 명령이 이전과 동일한 경우, 캐시된 레이어를 사용합니다.
- 명령이 변경된 경우, 해당 명령 이후의 모든 레이어를 다시 빌드합니다.
FROM ubuntu:20.04
RUN apt-get update
RUN apt-get install -y curl
COPY . /app
위 Dockerfile에서 COPY
명령이 변경되면, RUN apt-get install
도 다시 실행됩니다.
'Docker' 카테고리의 다른 글
도커 볼륨 (Docker Volumes) (1) | 2024.12.04 |
---|---|
Surface Area (0) | 2024.12.04 |
Makefile (0) | 2024.12.03 |
Docker 레지스트리 (0) | 2024.12.03 |
Dockerfile과 Alpine (0) | 2024.12.03 |