🐳 Docker, containerd и CRI-O: Углубленное сравнение

Статьи

Введение

Развертывание контейнеров – это практический метод обеспечения переносимости, масштабируемости и гибкости в мире DevOps.

От тестирования до продакшена, контейнеры облегчают весь процесс разработки программного обеспечения.

Платформы для управления и оркестрации контейнеров разработаны так, чтобы быть интуитивно понятными и простыми для конечного пользователя.

Однако сами платформы сложны и состоят из множества скоординированных проектов.

В этой статье мы объясним различия между тремя важными частями экосистемы управления контейнерами – Docker, containerd и CRI-O.

Экосистема контейнеров

Docker и Kubernetes – две ведущие платформы в экосистеме контейнеров.

🐳 Где хранятся образы, контейнеры и тома Docker в хост-системе Linux?

Для обеспечения совместимости сообщество согласовало несколько стандартов.

Двумя наиболее важными стандартами являются:

  • CRI – Container Runtime Interface. Он позволяет Kubernetes быть совместимым с различными режимами выполнения контейнеров, включая containerd от Docker.
  • OCI – Open Container Initiative. Она стандартизирует образы контейнеров и время выполнения.

Docker

Docker – это набор проектов по управлению контейнерами, осуществляемых компанией под названием Docker.

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

Наиболее важными проектами являются:

  • docker CLI – программа интерфейса командной строки. Пользователи создают и управляют контейнерами Docker, вводя команды docker CLI.
  • containerd – демон, который слушает команды пользователя. Он извлекает и хранит запрошенные образы, а также контролирует жизненный цикл контейнера.
  • runC – Легкая, переносимая среда выполнения контейнеров. runC – низкоуровневый компонент, объединяющий компоненты, необходимые для взаимодействия Docker с локальной системой. Контейнеры, создаваемые этим инструментом, совместимы с OCI.

Образы Docker

Образ Docker – это шаблон, доступный только для чтения, который содержит код приложения, а также библиотеки, инструменты и другие зависимости, необходимые для правильной работы приложения.

Когда пользователь выполняет команду run в Docker, шаблон образа используется для развертывания контейнера приложения.

Образы Docker создаются с помощью Dockerfile – текстового документа, содержащего необходимую информацию об образе.

Команда build использует Dockerfile и контекст для создания образа.

Docker для Kubernetes

Container Runtime Interface – это плагин, который позволяет Kubernetes взаимодействовать с другими контейнерными режимами.

Однако, поскольку Docker не реализует CRI, Kubernetes создал слой совместимости под названием dockershim.

Этот слой соединяет два API.

Начиная с версии 1.23, Kubernetes требует, чтобы исполнительные механизмы были совместимы с CRI.

Это означает, что dockershim теперь устарел, а Docker Engine больше не поддерживается в качестве среды выполнения.

Однако Kubernetes по-прежнему может взаимодействовать с Docker через containerd, который может быть совместим с CRI с помощью плагина.

Container Runtime Interface (CRI)

Хотя Kubernetes является платформой для оркестрации контейнеров, на самом низком уровне ей также необходимо создавать контейнеры и управлять ими.

Для этого Kubernetes использует контейнерные container runtime.

Вначале Docker Engine был единственной доступной средой выполнения на платформе.

Но популярность контейнеризации привела к появлению конкурирующих решений и необходимости для Kubernetes поддерживать их все.

С помощью плагина Container Runtime Interface Kubernetes может взаимодействовать со всеми основными системами container runtime.

containerd

containerd – это решение для выполнения Docker.

Этот демон доступен для операционных систем Linux и Windows.

Являясь частью проекта Docker, containerd управляет передачей и хранением образов, а также созданием, выполнением и контролем контейнеров.

Kubernetes не требуется вся платформа Docker для использования containerd.

С помощью плагина совместимости CRI Kubernetes и containerd могут взаимодействовать напрямую.

CRI-O

CRI-O – это совместимая с OCI облегченная реализация CRI.

Она была создана как альтернатива Docker Engine.

С помощью CRI-O вы можете запускать Kubernetes pods и извлекать необходимые образы.

Однако он не является средой выполнения.

Вместо этого он используется для запуска других низкоуровневых OCI-совместимых программ, таких как runC или Kata.

Открытая контейнерная инициатива (OCI)

В 2015 году компания Docker и другие важные участники контейнерной индустрии создали Открытую контейнерную инициативу (Open Container Initiative, OCI).

Целью OCI является создание стандартов для форматов контейнеров и режимов выполнения.

В настоящее время OCI имеет две спецификации:

  • image-spec – спецификация образа, которая описывает, как создать образ, соответствующий OCI.
  • runtime-spec – спецификация времени выполнения для распаковки пакета файловой системы.

runC

runC – это универсальная среда выполнения контейнеров, созданная компанией Docker.

Хотя она является частью набора инструментов Docker, для ее работы не требуется платформа Docker.

Важными особенностями runC являются:

  • Полная поддержка пространств имен Linux.
  • Встроенная поддержка функций безопасности Linux, таких как AppArmor, SELinux и т.д.
  • Встроенная поддержка контейнеров Windows 10.
  • Контейнеры, которые создает и которыми управляет runC, соответствуют стандарту OCI.

Заключение

Статья была посвящена выяснению различий между Docker, containerd и CRI-O.

см. также:

 

Добавить комментарий