OCI
OCI (Open Container Initiative) — стандарты контейнеров. Родился в 2015 после Docker vs rkt войн — Docker пожертвовал спеки. Теперь все runtime и image (Docker, Podman, containerd, K8s) совместимы через OCI.
Три спецификации
- image-spec — формат образа (JSON manifest + слои)
- runtime-spec — как рантайм должен запускать контейнер (bundle + config.json)
- distribution-spec — HTTP API registry
OCI Image Manifest
{
"schemaVersion": 2,
"mediaType": "application/vnd.oci.image.manifest.v1+json",
"config": {
"mediaType": "application/vnd.oci.image.config.v1+json",
"digest": "sha256:...", "size": 1234
},
"layers": [
{"mediaType":"application/vnd.oci.image.layer.v1.tar+gzip",
"digest":"sha256:...", "size":5000000}
]
}
Runtime Bundle
bundle/
├── config.json # OCI runtime-spec
└── rootfs/ # распакованный образ
Registry API
GET /v2/ # ping
GET /v2/library/alpine/manifests/3.19
GET /v2/library/alpine/blobs/sha256:...
POST /v2/library/alpine/blobs/uploads/
Один API — работают все: Docker Hub, ghcr.io, quay.io, ECR, GAR, Harbor.
Multi-arch (index)
{"manifests":[
{"digest":"...","platform":{"os":"linux","architecture":"amd64"}},
{"digest":"...","platform":{"os":"linux","architecture":"arm64"}}
]}
OCI artifacts
Registry — не только образы. Helm chart, WASM-модули, SBOM, cosign signatures. Всё OCI blobs с другим mediaType.
Runtime-имплементации
- runc — референс
- crun — C, быстрее
- kata-runtime — VM-based
- gVisor (runsc) — user-space kernel
- youki — Rust