Docker & Kubernetes

도커 이미지의 레이어는 무엇인가?

떡쇠 2025. 1. 12. 17:54
반응형
반응형

도커 이미지는 여러 개의 레이어(layer) 로 구성되어 있으며 각 레이어는 이미지의 특정 변경 사항을 나타낸다. 이러한 레이어들은 불변성(Immutability) 을 가지며 이전 레이어 위에 순차적으로 쌓여 최종 이미지를 형성한다. 레이어는 파일 시스템의 스냅샷(snapshots)이나 델타(delta) 변경 사항으로 생각할 수 있다.

 


레이어의 스냅샷(베이스 레이어)과 델타

스냅샷 (Snapshot)

  • 특정 시점의 전체 파일 시스템 상태를 그대로 저장한 “사진”과 같다.
  • Dorkerfile 의 FROM에 지정하는 기반 이미지가 베이스 레이어가 된다.

델타 (Delta)

  • 이전 상태와의 변경 사항만 기록하는 방식이다.
  •  베이스 이미지 위에 프로그램 설치, 파일 추가 등 변경된 부분만 별도의 레이어(델타 레이어)로 저장된다. 즉, Dorkerfile 의 FROM 외 부분이 델타 레이어

 

도커 이미지의 레이어 구조

베이스 레이어

  • 전체 운영체제 등의 스냅샷 역할을 하는 레이어

델타 레이어

  • 베이스 레이어 위에 추가되는 레이어로 패키지 설치나 애플리케이션 파일 복사와 같은 변경 사항만 기록한다.

최종 이미지

  • 도커 엔진은 Dockerfile의 각 명령어(FROM, RUN, COPY 등)에 의해 생성된 레이어들을 순차적으로 쌓아 하나의 최종 이미지를 만든다.
  • 최종 이미지는 여러 개의 레이어 파일들이 하나의 단일 파일로 합쳐지는 것이 아니라 도커 엔진의 메타데이터(매니페스트 파일)를 통해 순서대로 관리되고 컨테이너가 실행될 때 마치 하나의 파일 시스템처럼 보이도록 Union File System( OverlayFS)같은 기술로 결합한다.

 

최종 이미지를 간단한 Dockerfile 예시를 통한 설명

# 1. 베이스 이미지 선택
FROM ubuntu:20.04

# 2. 패키지 업데이트 및 Python3 설치
RUN apt-get update && apt-get install -y python3

# 3. 애플리케이션 코드 복사
COPY app.py /app/app.py

# 4. 실행 명령어 설정
CMD ["python3", "/app/app.py"]

이 Dockerfile을 빌드하면 다음과 같은 레이어가 생성된다.

  1. ubuntu:20.04 레이어: 베이스 이미지로 사용된 우분투 20.04의 파일 시스템 상태.
  2. RUN 명령어 레이어: 패키지 업데이트와 Python3 설치가 적용된 상태.
  3. COPY 명령어 레이어: app.py 파일이 /app/app.py로 복사된 상태.
  4. CMD 명령어 레이어: 컨테이너 실행 시 기본 명령어가 설정된 상태.

 

최종 이미지의 구조와 도커 레이어의 통합 원리

실제 레이어 파일

각 레이어는 실제로 별도의 파일(대개 압축된 tar 파일 등)로 존재한다.

 

매니페스트

도커 이미지는 매니페스트라는 메타데이터를 통해 각 레이어의 순서와 내용을 정의한다. 이 메타데이터는 어떤 레이어가 가장 밑에 있고 그 위에 어떤 레이어가 쌓였는지를 명시한다.

# 위 Dockerfile을 기반으로 빌드한 이미지의 매니페스트(manifest)를 단순화한 예시
{
  "schemaVersion": 2,
  "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
  "config": {
    "mediaType": "application/vnd.docker.container.image.v1+json",
    "size": 7023,
    "digest": "sha256:abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890"
  },
  "layers": [
    {
      "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
      "size": 2812543,
      "digest": "sha256:layer1hashabcdef1234567890abcdef1234567890abcdef1234567890abcdef"
    },
    {
      "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
      "size": 153246,
      "digest": "sha256:layer2hashabcdef1234567890abcdef1234567890abcdef1234567890abcdef"
    },
    {
      "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
      "size": 87432,
      "digest": "sha256:layer3hashabcdef1234567890abcdef1234567890abcdef1234567890abcdef"
    },
    {
      "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
      "size": 1234,
      "digest": "sha256:layer4hashabcdef1234567890abcdef1234567890abcdef1234567890abcdef"
    }
  ]
}

schemaVersion

  • 스키마 버전은 매니페스트 포맷의 버전을 나타내며 Docker 분산 이미지 저장소(Distribution)의 v2 스키마를 사용한다.

config

  • 이 필드는 컨테이너 설정 정보를 담고 있는 JSON 객체의 메타데이터를 가리킨다.
  • "digest" 는 config 객체의 해시값을 나타내며 실제 이미지 설정(예: 환경 변수, 실행 명령어 등)이 포함되어 있다.

layers

  • layers 배열은 이미지가 구성된 각 레이어를 순서대로 나열한다.
  • 배열의 순서는 베이스 레이어부터 시작하여 위로 쌓이는 순서로 기록된다.
  • mediaType: "application/vnd.docker.image.rootfs.diff.tar.gzip"는 해당 레이어가 압축된 tar 파일 형태로 저장된 파일 시스템 변경사항(델타 레이어)임을 의미
  • size: 파일의 크기를 바이트 단위로 표시
  • digest: sha256 해시 알고리즘을 사용한 해시값 정보가 기록되어 있으며 이 정보는 도커 엔진이 각 레이어를 식별하고 결합하는 데 사용된다.
  •  

 

하나의 파일 시스템처럼 인식

도커 엔진은 컨테이너 실행 시 이러한 여러 레이어 파일들을 Union File System (예: OverlayFS)을 이용해 하나의 통합된 파일 시스템으로 병합하여 사용자에게 하나의 완성된 이미지처럼 보이게 한다.

 

즉, 실제로는 여러 개의 레이어 파일이 존재하지만 매니페스트에 정의된 순서대로 이들을 결합하여 마치 하나의 파일(또는 파일 시스템)처럼 동작한다.

 

 

반응형