Введение
OCI Image – открытый стандарт формата образа контейнера, разработанный Open Container Initiative (OCI). OCI основана в июне 2015 года при Linux Foundation совместно Docker и CoreOS с целью стандартизировать форматы контейнеров и предотвратить фрагментацию экосистемы.
До OCI каждый движок контейнеров имел собственный формат образов. Стандартизация позволила создавать образ один раз и запускать на любом OCI-совместимом runtime: Docker, Podman, containerd, CRI-O, Kata Containers и других.
История и контекст
OCI Image Specification v1.0 опубликована в 2017 году. Она основана на формате образов Docker v2, donated Docker'ом в OCI. Одновременно была стандартизирована OCI Runtime Specification (runc – референсная реализация) и OCI Distribution Specification (протокол реестра образов).
Kubernetes в версии 1.20+ перешёл на containerd как стандартный container runtime вместо dockershim, что закрепило OCI Image как единственный стандарт в production K8s-средах.
Как это работает
OCI Image состоит из четырёх компонентов:
- Image Index (опционально): указатель на манифесты для разных архитектур (amd64, arm64) и ОС – multi-platform образ.
- Image Manifest: JSON-документ, описывающий образ: версию, конфигурацию и список слоёв.
mediaTypeсодержит строку "oci" для OCI-образов. - Image Configuration: JSON с метаданными: CMD, ENTRYPOINT, ENV, Labels, архитектура, история слоёв.
- Filesystem Layers: набор слоёв (tar.gz archives), каждый из которых содержит изменения файловой системы (добавление/изменение/удаление файлов). Слои накладываются через overlay filesystem (OverlayFS).
Уникальность образа определяется SHA256-дайджестом манифеста: image@sha256:abc.... Это обеспечивает immutability и верифицируемость образов.
Где применяется
- Kubernetes: все образы деплоятся в K8s-кластерах в формате OCI через containerd или CRI-O.
- CI/CD pipelines: сборка и публикация образов через docker build, buildah или Kaniko – все создают OCI-совместимые образы.
- Container Registries: Docker Hub, Harbor, Yandex Container Registry, Nexus хранят OCI Image по протоколу OCI Distribution Spec.
- Artifact Storage: OCI Image spec используется для хранения не только контейнеров, но и Helm-чартов, WASM-модулей и других артефактов.
Преимущества и ограничения
Преимущества: полная переносимость образов между движками; иммутабельность и верифицируемость через SHA256; экономия хранилища через дедупликацию слоёв; открытый стандарт без vendor lock-in.
Ограничения: глубокий стек слоёв увеличивает время pull'а; большие базовые образы; сложность отладки многослойной файловой системы.
Связь с другими понятиями
OCI Image – фундамент для Docker, Podman, containerd и CRI-O. Helm-чарты могут храниться в OCI-реестрах. Kubernetes использует OCI Image через Container Runtime Interface (CRI). CNI обеспечивает сетевое подключение для запущенных OCI-контейнеров.