Введение
Развертывание контейнеров – это практический метод обеспечения переносимости, масштабируемости и гибкости в мире 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.
см. также:
- ☸️ Внедрили Kubernetes? Попробуйте эти 5 инструментов для аудита прав Rbac
- ☸️ Ломаем и чиним Kubernetes
- ☸️ Управление автогенерируемыми секретами в чартах helm
- ☸️ Побег из контейнера Kubernetes с помощью монтирования HostPath
- ☸️ Какие типы сервисов существуют в Kubernetes?
- ☸️ Kubernetes и RBAC: ограничение доступа пользователя в одном namespace