Docker / / 2024. 12. 4. 09:43

Docker 이미지 레이어

1. Docker 이미지 레이어란?

Docker 이미지는 여러 불변의 레이어(Immutable Layers)로 구성됩니다. 각 레이어는 이미지의 파일 시스템 변화(추가, 수정, 삭제)를 나타내며, 이러한 레이어들이 결합되어 최종적으로 하나의 이미지가 됩니다.

특징

  • 불변성: 각 레이어는 읽기 전용이며, 생성된 이후 변경되지 않습니다.
  • 효율성: 여러 이미지는 공통된 레이어를 공유하여 저장 공간을 절약합니다.
  • 캐싱: Docker는 레이어를 캐싱하여 빌드와 배포 속도를 높입니다.

2. Docker 레이어의 구성

Docker 이미지는 다음과 같은 방식으로 레이어를 구성합니다:

  1. 베이스 레이어(Base Layer)
    • Dockerfile의 FROM 명령어에서 지정된 기본 이미지입니다.
    • 예: FROM ubuntu:20.04는 Ubuntu 20.04를 기반으로 한 이미지를 가져옵니다.
  2. 중간 레이어(Intermediate Layer)
    • Dockerfile의 각 명령(RUN, COPY, ADD 등)은 새로운 레이어를 생성합니다.
    • 예:
      RUN apt-get update
      RUN apt-get install -y curl
      위의 두 RUN 명령은 각각 하나의 레이어를 생성합니다.
  3. 최종 레이어(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
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유