Docker — платформа и инструменты для сборки образов, их распространения и запуска контейнеров. Kubernetes — система оркестрации: размещает workload в кластере, поддерживает заданное число реплик и управляет обновлениями. Kubernetes использует совместимую контейнерную среду выполнения, например containerd или CRI-O, и не требует Docker Engine. Образ, собранный Docker, может использоваться в Kubernetes.
Чем Docker отличается от Kubernetes?
Docker помогает собирать и запускать контейнеры, Kubernetes управляет контейнерными приложениями в кластере. Почему это разные уровни и Docker Engine не обязателен.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Docker и Kubernetes решают связанные, но разные задачи. При сравнении полезно уточнить, говорим ли мы о Docker Engine или обо всей экосистеме Docker.
Docker предоставляет инструменты для подготовки образа приложения, его публикации в registry и запуска контейнеров. Dockerfile описывает сборку, образ служит шаблоном, а контейнер — запущенным экземпляром с собственным состоянием. Docker Compose позволяет описать приложение из нескольких сервисов. Эти роли изложены в обзоре Docker.
Kubernetes управляет контейнерными приложениями через описание желаемого состояния. Например, Deployment задаёт три реплики приложения; контроллеры поддерживают это состояние, а scheduler выбирает узлы для Pods. Pod может включать несколько связанных контейнеров, а не обязательно один. Kubernetes также предоставляет механизмы обнаружения сервисов, обновлений и подключения хранилищ. См. обзор Kubernetes.
Практическая последовательность может выглядеть так:
- Собрать образ приложения средствами Docker.
- Опубликовать его в registry.
- Указать образ и настройки запуска в ресурсах Kubernetes.
- Наблюдать за фактическим состоянием развёртывания.
Kubernetes сам по себе не заменяет сборку приложения. При этом Docker Engine не является обязательной зависимостью: kubelet взаимодействует со средой выполнения через CRI, например с containerd или CRI-O. Подробнее — Container Runtime Interface.
Выбор определяется задачами эксплуатации. Для небольшого приложения одного контейнерного хоста может быть достаточно; кластерная оркестрация добавляет возможности и операционную сложность. Наличие Kubernetes не гарантирует отказоустойчивость приложения автоматически: нужно продумать реплики, доступные ресурсы, проверки готовности, хранение данных и поведение при сбоях.