Под капотом Docker и Kubernetes что такое containerd и зачем он вам нужен
Каждый, кто работает с контейнерами, знает команды docker run или kubectl apply. Мы привыкли, что они просто работают. Но задумывались ли вы, какой невидимый механизм на самом деле запускает, останавливает и управляет нашими контейнерами? Сегодня мы заглянем в машинное отделение и поговорим о проекте, который лежит в основе современной контейнеризации — containerd.

Возможно, вы удивитесь, но если вы используете Docker или Kubernetes, вы уже работаете с containerd, даже не подозревая об этом. Это тот самый "незаметный герой", который выполняет всю черновую работу. Давайте разберемся, что это за зверь и почему понимание его роли может быть полезно любому разработчику или DevOps-инженеру.
Что такое containerd? Это не еще один Docker!
Первое и самое важное: containerd — это не замена Docker. Это его бывшая часть, которую выделили в отдельный, независимый проект и передали под крыло Cloud Native Computing Foundation (CNCF), где он дорос до статуса "graduated" — так же, как Kubernetes, Prometheus и Envoy.
Простыми словами, containerd — это среда выполнения контейнеров (container runtime). Его задача — управлять всем жизненным циклом контейнера на хост-системе:
- Загрузка и хранение образов.
- Запуск и остановка контейнеров.
- Управление хранилищем и сетью на низком уровне.
- Наблюдение за состоянием контейнеров.
Ключевая идея, заложенная в README проекта, звучит так: "containerd спроектирован для встраивания в более крупные системы, а не для прямого использования разработчиками или конечными пользователями".
Это как двигатель в автомобиле. Вы не взаимодействуете с ним напрямую, вы жмете на педали и крутите руль. Так и здесь: Docker или Kubernetes — это "руль и педали", а containerd — тот самый мощный и надежный "двигатель" под капотом.
Зачем он нужен, если есть Docker?
Знакомая ситуация? Раньше Docker был монолитом: клиент, демон, система сборки, оркестратор (Swarm) — все в одном. Это было удобно для старта, но для больших систем, вроде Kubernetes, создавало проблемы. Kubernetes'у не нужна была вся магия Docker, ему требовалась только одна вещь: надежно запускать и останавливать контейнеры.
Чтобы решить эту проблему, сообщество создало стандарт CRI (Container Runtime Interface) — своего рода API, который позволяет Kubernetes общаться с любой средой выполнения контейнеров, будь то containerd, CRI-O или что-то еще.
И тут containerd вышел на сцену. Он идеально подошел на эту роль:
- Минималистичность: Он делает только то, что нужно для управления контейнерами, без лишних функций. Это делает его легким, быстрым и надежным.
- Стабильность: Как проект CNCF с "graduated" статусом, он прошел проверку временем и используется в тысячах продакшн-систем.
- Прямая интеграция с Kubernetes: containerd имеет встроенный плагин CRI, что делает его "родным" рантаймом для K8s. Это устраняет прослойку в виде Docker Shim, что повышает производительность и упрощает архитектуру.

Ключевые возможности, которые стоит знать
Хотя мы и не работаем с containerd напрямую, полезно понимать, из чего он состоит.
1. Управление образами
containerd умеет работать с любыми OCI-совместимыми (Open Container Initiative) реестрами. Он эффективно скачивает, распаковывает и хранит слои образов.
2. Управление снимками (Snapshots)
Это одна из самых интересных частей. containerd использует систему "снимков" для управления файловыми системами контейнеров. По умолчанию используется overlayfs, которая позволяет десяткам контейнеров, созданным из одного образа, переиспользовать общие данные, экономя место на диске. Поддерживаются и другие файловые системы, например, btrfs.
3. Исполнение контейнеров
Сам по себе containerd не запускает процессы внутри контейнера. Он делегирует эту задачу другой утилите — runc. Это еще один стандарт OCI, который фактически создает контейнер, используя возможности ядра Linux (namespaces, cgroups). Такая модульность повышает безопасность и гибкость.
Вот как выглядит общая архитектура системы:

Видно, что containerd — это скорее API-сервер, который координирует работу разных компонентов: хранилища, сети и исполнителей вроде runc.
Практическое применение: где живет containerd?
- В Kubernetes: Сегодня containerd — это де-факто стандартный рантайм для Kubernetes. Если вы разворачиваете кластер с помощью
kubeadmили используете управляемые решения вроде GKE, EKS или AKS, скорее всего, под капотом у вас именно он. Это обеспечивает лучшую производительность и меньшее потребление ресурсов. - В Docker: Современные версии Docker Engine используют containerd для управления контейнерами. Docker-демон теперь — это, по сути, клиент, который отправляет команды в containerd.
- В кастомных платформах: Благодаря своей встраиваемой природе, containerd стал основой для множества CI/CD систем, PaaS-решений и других инструментов, которым нужно программно управлять контейнерами, не таща за собой весь стек Docker.
Выводы: стоит ли копать глубже?
Вам вряд ли придется каждый день запускать контейнеры через утилиту ctr (CLI-клиент для containerd). Однако понимать, что это за проект и какую роль он играет, — значит лучше понимать, как устроена современная облачная инфраструктура.
Кому особенно стоит обратить внимание на containerd:
- DevOps/SRE-инженерам: Глубокое понимание рантайма помогает эффективнее отлаживать проблемы в Kubernetes-кластерах.
- Разработчикам платформ: Если вы создаете инструменты, которые работают с контейнерами, containerd предоставляет стабильный и мощный API без лишних зависимостей.
- Всем, кто хочет знать, как "оно работает": Если вам интересно, что происходит после
kubectl run, изучение архитектуры containerd даст много ответов.
Это отличный пример успешного open-source проекта: он решает конкретную, важную задачу, делает это надежно и становится незаметной, но незаменимой частью глобальной IT-экосистемы.
