컨테이너 이미지, 그 복잡한 내부 구조를 파헤치다!

by DD
2개월 전
조회수 20

OCI 이미지 스펙(OCI Image Specification)을 기반으로 컨테이너 이미지의 핵심 구성 요소인 레이어, 설정, 매니페스트, 인덱스 등을 상세히 분석함

이미지 ID(Image ID)와 다이제스트(Digest)의 차이점을 설명하고, 멀티 플랫폼 이미지(Multi-platform Image)의 동작 원리를 제시함

컨테이너 이미지의 저장 및 배포 방식에 대한 이해를 돕고, 이미지의 무결성(Integrity)을 보장하는 기술적 측면을 강조함

이미지 레이아웃(Image Layout)을 통해 컨테이너 이미지의 구조를 시각적으로 이해하고, 디버깅 및 학습에 활용할 수 있는 방법을 제시함

컨테이너 이미지의 핵심 구성 요소: 레이어(Layer)와 설정(Configuration)

컨테이너 이미지는 애플리케이션, 종속성, OS 패키지, 실행 설정을 묶은 아카이브다. 핵심은 파일 시스템(Filesystem)설정(Configuration)으로, 파일 시스템은 tar 아카이브로 구성되며, 설정은 이미지와 컨테이너의 기본 파라미터를 정의하는 JSON 형식이다. 특히, 설정은 단일 플랫폼을 지향하며, 파일 시스템 레이어의 다이제스트를 포함하여 이미지의 고유성을 보장한다. 데이터 격리 아키텍처(Data Isolation Architecture)를 위해 레이어는 변경 사항만 저장하는 방식으로, 중복을 최소화한다.

이미지 ID(Image ID)와 다이제스트(Digest)의 차이점

이미지 ID는 이미지 설정 파일의 SHA-256 해시로, 단일 플랫폼 이미지의 고유 식별자 역할을 한다. 반면, 다이제스트는 이미지 참조가 가리키는 최상위 문서(매니페스트 또는 인덱스)의 다이제스트를 의미한다. 이미지-ID는 1:1 관계를 가지지만, 이미지-다이제스트는 1:N 관계를 가질 수 있다. 이는 레이어 압축 방식이나 주석(Annotation) 변경으로 인해 동일한 이미지라도 다른 다이제스트를 가질 수 있기 때문이다. 따라서, 다이제스트는 특정 위치에 저장된 매니페스트를 식별하는 데 사용된다.

OCI 매니페스트(Manifest)와 인덱스(Index)의 역할

OCI 매니페스트는 이미지의 구성 요소들을 한 곳에 모아두는 역할을 한다. 이는 이미지 배포를 위한 필수 요소로, 이미지 설정 파일과 파일 시스템 레이어들을 가리킨다. OCI Image Manifest는 이미지의 플랫폼 정보를 직접적으로 포함하지 않지만, 이미지 설정을 참조하여 단일 플랫폼 이미지를 구성한다. OCI Image Index는 멀티 플랫폼 이미지 지원을 위해 도입되었으며, 여러 매니페스트를 묶어 단일 참조로 관리할 수 있게 한다.

멀티 플랫폼 이미지(Multi-Platform Image)의 동작 원리

멀티 플랫폼 이미지는 OCI Image Index를 사용하여 구현된다. Index는 각 플랫폼에 맞는 매니페스트를 포함하며, 각 매니페스트는 해당 플랫폼의 이미지 설정과 파일 시스템 레이어를 가리킨다. 예를 들어, `docker pull my-img:v1` 명령은 amd64 호스트에서는 amd64 매니페스트를, arm64 호스트에서는 arm64 매니페스트를 선택하여 이미지를 다운로드한다. 즉, 멀티 플랫폼 이미지는 여러 단일 플랫폼 이미지 매니페스트의 집합이다.

이미지 레이아웃(Image Layout)과 OCI

OCI Image Layout은 OCI 블롭(blob)과 참조를 위한 표준화된 디렉토리 구조를 제공한다. 이는 로컬 디렉토리에 컨테이너 이미지의 내용을 저장하는 방식으로, 이미지 구성 요소들을 시각적으로 확인할 수 있게 해준다. OCI Image Layout은 이미지 설정, 레이어, 매니페스트, 인덱스 등을 포함하며, 학습 및 디버깅에 유용하다. 또한, 레지스트리 HTTP API를 사용하지 않는 도구 간의 OCI 콘텐츠 교환을 위한 편리한 전송 형식으로 활용된다.

How Container Images Actually Work: Layers, Configs, Manifests, Indexes, and More