본문으로 건너뛰기
김신건의 로그

[Container] OCI Image: spec, manifest, layer 표준

· 수정 · 📖 약 1분 · 280자/단어 #oci #container #docker #image #cloud
OCI, Open Container Initiative, OCI image spec, image manifest, image index, OCI distribution, containerd

정의

OCI (Open Container Initiative) = 컨테이너 표준 (Linux Foundation, 2015). image format + runtime + distribution 3가지 spec.

3개 OCI Spec

Spec의미
Imagetarball + JSON metadata 구조
Runtimerunc 같은 컨테이너 실행 표준
Distributiondocker push/pull 같은 레지스트리 API

Image 구조

manifest.json
  - config.json (image config)
  - layers
    - layer0.tar.gz
    - layer1.tar.gz
    - layer2.tar.gz
flowchart TB
    Idx["Image Index (멀티 아키)"]
    Idx --> Mfst_amd64[Manifest amd64]
    Idx --> Mfst_arm64[Manifest arm64]
    Mfst_amd64 --> Cfg_a[Config JSON]
    Mfst_amd64 --> L1_a[Layer tarball 1]
    Mfst_amd64 --> L2_a[Layer tarball 2]

Image Index (멀티 아키)

{
  "schemaVersion": 2,
  "manifests": [
    {
      "mediaType": "application/vnd.oci.image.manifest.v1+json",
      "digest": "sha256:abc...",
      "platform": { "os": "linux", "architecture": "amd64" }
    },
    {
      "mediaType": "application/vnd.oci.image.manifest.v1+json",
      "digest": "sha256:def...",
      "platform": { "os": "linux", "architecture": "arm64" }
    }
  ]
}

한 tag (nginx:1.27) 으로 여러 아키 자동 선택. pull 시 클라이언트 아키 매칭.

Manifest

{
  "schemaVersion": 2,
  "config": {
    "mediaType": "application/vnd.oci.image.config.v1+json",
    "digest": "sha256:abc..."
  },
  "layers": [
    { "mediaType": "application/vnd.oci.image.layer.v1.tar+gzip",
      "digest": "sha256:111..." },
    { "mediaType": "application/vnd.oci.image.layer.v1.tar+gzip",
      "digest": "sha256:222..." }
  ]
}

Image vs OCI Artifact

flowchart LR
    OCI[OCI Distribution] --> Image["OCI Image (전통 컨테이너)"]
    OCI --> Artifact["OCI Artifact (임의 데이터)"]
    Artifact --> Helm[Helm chart]
    Artifact --> WASM[WebAssembly]
    Artifact --> SBOM[SBOM]
    Artifact --> Sig[Cosign signature]

OCI registry 가 컨테이너 image 만이 아닌 일반 artifact store 로 진화. Helm chart, WASM, SBOM, signature 모두.

구현체

의미
runcOCI Runtime 의 표준 구현
containerdcontainer 라이프사이클 (Docker / K8s 가 사용)
CRI-OK8s 전용 OCI runtime
podmanDocker 호환, daemonless
buildahimage build 전용
skopeoimage 복사 / 검사

Content-Addressed Storage

image digest = sha256(manifest JSON)
layer digest = sha256(layer tarball)

tag변할 수 있지만 digest불변. 프로덕션 배포 는 항상 digest 로:

nginx:1.27                            ← tag (mutable)
nginx@sha256:abc123...                ← digest (immutable)

흔한 함정

WARNING

  1. Tag mutability = 어제 build 한 image 가 오늘 다른 내용. digest pinning.
  2. Image scan 누락 = 취약점 image. Trivy / Grype / Clair.
  3. Cross-arch test 안 함 = AMD64 만 build → ARM 노드 실패.
  4. Layer 너무 많음 = layer 한도 (보통 127). 가능하면 묶기.

관련 위키

이 글의 용어 (4개)
[Container] cgroups + namespaces: 컨테이너의 두 기둥virtualization
정의 컨테이너 = namespaces + cgroups + 파일시스템 (overlay). VM 이 아니라 host 의 프로세스 + 격리. Namespaces (격리) | Name…
[Container] Docker: image, layer, registryvirtualization
정의 Docker = 컨테이너 빌드 + 실행 + 배포 의 표준 도구. 2013 출시 → 컨테이너 시대 의 시작. 현재는 OCI 표준 으로 진화 ( , , 등 호환). Layere…
[Container] Image Best Practices: 작게, 안전하게virtualization
5가지 원칙 1. Base Image 선택 | Base | 크기 | 적합 | |---|---|---| | | 70 MB | 개발 / 디버깅 친화 | | | 40 MB | 일반 |…
[K8s] Pod: 컨테이너의 최소 단위, sidecar, lifecyclekubernetes
정의 Pod = K8s 의 가장 작은 배포 단위. 1개 이상의 컨테이너 + 공유 네트워크 + 공유 스토리지. [!IMPORTANT] Pod 는 컨테이너의 wrapping 이 아니…

💬 댓글

사이트 검색 / 명령어

검색

스크롤 = 확대/축소 · 드래그 = 이동 · 0 = 원래 크기 · ESC = 닫기