Открыть сервис

Open Container Initiative

Open Container Initiative (OCI) — это проект с открытым исходным кодом, основанный под эгидой Linux Foundation, который разрабатывает и поддерживает открытые промышленные стандарты для форматов образов контейнеров и сред выполнения контейнеров. Основная цель OCI — обеспечить совместимость и интероперабельность между различными технологиями контейнеризации, независимо от конкретного программного обеспечения, используемого для создания, распространения и запуска контейнеров.

История

Идея создания единого стандарта для контейнеров возникла на фоне быстрого роста популярности Docker и появления альтернативных решений, таких как rkt (произносится как «rocket») от CoreOS. К середине 2015 года стало очевидно, что отсутствие общепринятых спецификаций приводит к фрагментации экосистемы: образы, созданные для одного рантайма, не всегда могли быть запущены в другом, а инструменты для работы с контейнерами были тесно привязаны к конкретным платформам.

22 июня 2015 года на конференции DockerCon компания Docker Inc. объявила о передаче спецификации формата образов (Image Format) и спецификации среды выполнения (Runtime Specification) в новую некоммерческую организацию — Open Container Initiative. Это решение было поддержано ключевыми игроками индустрии, включая Google, Microsoft, IBM, Red Hat, Amazon Web Services и CoreOS. OCI была создана как нейтральная площадка для совместной разработки стандартов, свободных от контроля какой-либо одной компании.

Первая версия спецификации (OCI Runtime Specification v1.0) была выпущена в июле 2017 года, а вслед за ней — OCI Image Specification v1.0. Эти документы закрепили базовые требования к тому, как должен выглядеть контейнерный образ и как его следует запускать.

Основные компоненты

Стандарты OCI состоят из двух ключевых спецификаций, которые вместе определяют жизненный цикл контейнера.

OCI Runtime Specification (runtime-spec)

Эта спецификация описывает, что именно представляет собой среда выполнения контейнера и как она должна взаимодействовать с операционной системой. Она определяет:

  • Конфигурационный файл (config.json): JSON-документ, который содержит все параметры для запуска контейнера: точки монтирования, переменные окружения, рабочий каталог, пользовательские ID, ограничения ресурсов (CPU, память), системные вызовы (capabilities) и точки входа (entrypoint).
  • Жизненный цикл контейнера: Стандартные состояния (creating, created, running, stopped) и операции над ними (create, start, kill, delete).
  • Требования к файловой системе: Корневая файловая система (rootfs) должна быть представлена в виде набора файлов и каталогов, упакованных в соответствии с OCI Image Specification.

Любая среда выполнения (runtime), соответствующая этой спецификации, может запускать любой OCI-совместимый образ. Наиболее известные реализации — runc (используется по умолчанию в Docker и containerd), crun (от Red Hat, написан на C) и youki (написан на Rust).

OCI Image Specification (image-spec)

Эта спецификация определяет стандартный формат для контейнерных образов. Образ представляет собой неизменяемый снимок файловой системы, который может быть развёрнут в контейнере. Ключевые элементы:

  • Манифест (Manifest): JSON-файл, который ссылается на слои образа и конфигурацию. Он является точкой входа для загрузки образа.
  • Индекс (Index): Список манифестов для разных платформ (архитектур, операционных систем). Позволяет создавать мультиархитектурные образы (например, один и тот же образ для x86_64 и ARM64).
  • Конфигурация (Configuration): JSON-файл, содержащий метаданные образа: историю слоёв, команды по умолчанию (CMD, ENTRYPOINT), порты, метки (labels) и т.д.
  • Слои (Layers): Набор tar-архивов, каждый из которых представляет собой разницу в файловой системе. Слои упаковываются и хэшируются (обычно с использованием SHA256) для обеспечения целостности. Для сжатия чаще всего используется gzip, но спецификация поддерживает и другие алгоритмы (zstd).

Формат образа OCI является прямым наследником формата Docker Image Specification v2 и на сегодняшний день является де-факто стандартом для всех современных систем контейнеризации.

Реализации и совместимость

Стандарты OCI реализованы в большинстве популярных инструментов:

  • runc: Эталонная реализация OCI Runtime. Написана на Go и лежит в основе Docker, containerd, Podman и CRI-O.
  • containerd: Промышленный контейнерный рантайм, который использует runc для непосредственного запуска контейнеров. Сам containerd является частью стека Docker и Kubernetes.
  • Podman: Демон-менеджер контейнеров, разработанный Red Hat. Он полностью совместим с OCI-образами и может использовать runc или crun в качестве рантайма.
  • Docker: Хотя Docker и инициировал создание OCI, его собственная экосистема (Docker Engine) теперь также опирается на OCI-стандарты, используя containerd и runc.
  • Kubernetes: Оркестратор контейнеров Kubernetes использует CRI (Container Runtime Interface), который позволяет подключать любые OCI-совместимые рантаймы (через containerd, CRI-O или напрямую).

Благодаря OCI, пользователь может создать образ с помощью Docker, сохранить его в реестре, поддерживающем OCI (например, Docker Hub, Harbor, Quay), а затем запустить с помощью Podman или другого совместимого инструмента без каких-либо изменений.

Критика и ограничения

Несмотря на широкое признание, OCI не лишена критики:

  • Сложность спецификации: Некоторые разработчики отмечают, что спецификации OCI, особенно Image Specification, являются излишне сложными и содержат много необязательных полей, что может приводить к несовместимости на практике.
  • Отсутствие стандартизации сетей и хранилищ: OCI фокусируется исключительно на образе и рантайме. Вопросы управления сетью (сетевые плагины, DNS), томами данных (persistent storage) и логированием остаются за рамками стандарта, что приводит к появлению множества несовместимых решений.
  • Медленная эволюция: Как проект под управлением Linux Foundation, OCI развивается относительно медленно. Внесение изменений в спецификацию требует длительного обсуждения и консенсуса между участниками, что может тормозить внедрение новых технологий (например, поддержка новых типов сжатия или улучшенная безопасность).
  • Конкуренция с новыми форматами: Появляются альтернативные форматы образов, такие как WASM (WebAssembly) и Nix, которые предлагают иные подходы к изоляции и воспроизводимости. Однако OCI остаётся доминирующим стандартом для Linux-контейнеров.

Значение и влияние

Open Container Initiative сыграла ключевую роль в индустриализации контейнерных технологий. До появления OCI контейнеры были тесно связаны с конкретным продуктом (Docker). После принятия стандартов OCI контейнеры стали универсальным форматом распространения приложений, аналогичным тому, как ZIP или TAR стали универсальными форматами архивации.

OCI позволила:

  • Снизить зависимость от одного поставщика (vendor lock-in).
  • Создать конкурентную среду для разработчиков рантаймов и инструментов.
  • Упростить интеграцию контейнеров в различные платформы (облачные провайдеры, CI/CD системы, операционные системы).
  • Стать фундаментом для экосистемы Kubernetes, которая сегодня является стандартом для оркестрации контейнеров.

Источники

  1. Open Container Initiative. Official Website and Specifications.
  2. Linux Foundation. Open Container Initiative Project Charter.
  3. Docker Inc. "Docker Launches Open Container Initiative". June 2015.
  4. Red Hat. "Podman and the OCI Standard".
  5. Kubernetes Documentation. Container Runtimes.

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →