Олег Марков
Чем отличаются Docker и Kubernetes
Введение
Разработка современных приложений все чаще связана с контейнерами и оркестрацией. Эти темы стали практически стандартом для построения отказоустойчивых, легко масштабируемых и управляемых инфраструктур. Наиболее часто в таких обсуждениях можно услышать два названия — Docker и Kubernetes. Часто их упоминают вместе, но далеко не всегда понятно, что эти технологии делают, чем они действительно отличаются и как они взаимодействуют.
Появление Docker позволило быстро, удобно и надежно упаковывать приложения, вместе со всеми зависимостями, в единые транспортируемые образы — контейнеры. Kubernetes же появился, когда стало ясно, что управлять сотнями или тысячами контейнеров вручную — задача не из легких. Kubernetes берет на себя организацию, автоматизацию и масштабирование таких "флотилий" контейнеров.
Давайте подробно разберем основные различия между Docker и Kubernetes. Вы узнаете, какие задачи каждый из них решает, зачем нужны оба инструмента, где уместно применять оба, а где достаточно одного из них.
Docker — суть и ключевые возможности
Что такое Docker
Docker — это открытая платформа для разработки, доставки и запуска приложений в контейнерах. Сам по себе контейнер — это изолированная среда для запуска процесса или группы процессов, внутри которой находятся только нужные файлы, зависимости и исполняемые файлы. Весь остальной «мир» становится недоступен: вы получаете предсказуемое поведение и высокую портируемость кода между разными машинами.
Очень важно понимать: Docker — это не единственная реализация контейнеризации, но она стала наиболее популярной благодаря удобству использования и богатой инфраструктуре.
Для чего нужен Docker
Docker решает ряд конкретных задач:
- Изоляция окружения — каждое приложение работает в своем контейнере без влияния на другие.
- Портируемость — можно запускать один и тот же образ на разных платформах: в облаке, на сервере, локально.
- Быстрота развертывания — контейнеры поднимаются за секунды.
- Облегченная доставка ПО — вы описываете окружение с помощью Dockerfile, строите образ и поставляете его куда угодно.
Как работает Docker — пример
Смотрите, предлагаю разобрать минимальный пример работы с Docker.
Пример Dockerfile
# Указываем базовый образ
FROM python:3.11-slim
# Копируем файлы проекта в рабочую директорию контейнера
COPY . /app
# Устанавливаем рабочую директорию
WORKDIR /app
# Устанавливаем зависимости
RUN pip install -r requirements.txt
# Указываем команду для запуска приложения
CMD [ "python", "main.py" ]
Вы можете собрать этот образ командой:
docker build -t my-python-app .
А затем запустить контейнер с этим образом:
docker run --rm my-python-app
Ключевые компоненты Docker
- Docker Engine — основной движок, который управляет контейнерами.
- Docker Images — шаблоны для развертывания приложений.
- Docker Containers — запущенные экземпляры образов.
- Docker Hub — публичный репозиторий для хранения и обмена образами.
На чем строится Docker
Docker использует стандартные возможности ядра Linux (контейнеры LXC, cgroups, namespaces), но взаимодействовать с ними напрямую не нужно — все делает Docker Engine. Вы работаете с понятными командами и настройками.
Kubernetes — зачем он нужен
Что такое Kubernetes
Kubernetes (часто сокращают как K8s) — это система оркестрации контейнеров. Она автоматизирует развертывание, масштабирование и управление приложениями, упакованными в контейнеры. Если у вас есть сотни или тысячи контейнеров, Kubernetes позволяет держать их в нужном количестве, следить за их здоровьем, обновлять без остановки сервиса и эффективно использовать ресурсы кластера.
Как Kubernetes работает с Docker
Kubernetes может запускать контейнеры при помощи разных движков (например, контейнерный runtime dockerd или Containerd), но долгие годы Docker был основным способом запуска контейнеров в Kubernetes. Сейчас Kubernetes, начиная с версии 1.20, двигается к стандартизированному runtime interface (CRI) и по умолчанию работает с Containerd, однако большинство концепций и подходов остаются прежними.
Ключевые компоненты Kubernetes
Давайте посмотрим, из чего состоит кластер Kubernetes:
- Pod — минимальная единица развертывания. Обычно в одном pod'е крутится как минимум один контейнер (чаще всего один).
- Deployment — описывает, сколько нужно pod'ов, как их обновлять и отслеживать их статус.
- Service — создает постоянную "точку входа" для доступа к приложению вне зависимости от того, сколько pod'ов будет "живым" на данный момент.
- Ingress — осуществляет маршрутизацию HTTP/HTTPS-запросов (например, для вашего веб-приложения).
- ConfigMap/Secret — передают переменные окружения и конфиденциальные данные контейнерам.
- Node — физический или виртуальный сервер, часть кластера.
Пример применения Kubernetes
Давайте представим, что у вас есть собранный Docker-образ my-python-app
. Как развернуть его с помощью Kubernetes?
Deployment
Вот минимальное описание deployment-а:
apiVersion: apps/v1
kind: Deployment
metadata:
name: python-app
spec:
replicas: 3 # Запускаем три pod-а с этим образом
selector:
matchLabels:
app: python-app
template:
metadata:
labels:
app: python-app
spec:
containers:
- name: python-app
image: my-python-app:latest
ports:
- containerPort: 8000
Это описание говорит Kubernetes держать три pod-а c контейнером на вашем Docker-образе.
Service
Чтобы получить доступ к этим pod'ам, описываем service:
apiVersion: v1
kind: Service
metadata:
name: python-app-service
spec:
type: ClusterIP
selector:
app: python-app
ports:
- port: 80
targetPort: 8000
Теперь сервис будет отправлять трафик на любой из трех pod'ов.
Применить их можно через команду:
kubectl apply -f deployment.yaml
kubectl apply -f service.yaml
Kubernetes сам будет следить, чтобы нужное количество pod'ов было в "живом" состоянии, автоматически перезапустит контейнеры в случае ошибки и позволит обновлять приложение без простой работы сервиса.
Основные возможности Kubernetes
- Автоматическое масштабирование по загрузке
- Балансировка нагрузки между контейнерами
- Самовосстановление контейнеров
- Гибкое обновление и откаты приложений
- Управление секретами и конфигами
- Интеграция с облачными провайдерами
- Сетевые политики между pod'ами
Главные отличия Docker и Kubernetes
Кратко о сути
Смотрите, ключевое отличие — это разные уровни задач:
- Docker — технология контейнеризации. Он умеет упаковывать, запускать, изолировать приложения. Управляет отдельными контейнерами на отдельном сервере.
- Kubernetes — система для управления большим количеством контейнеров и их автоматизированным развертыванием, балансировкой, масштабированием, обновлениями и интеграцией с инфраструктурой.
Docker часто используют как "кирпичи", из которых строят приложение, а Kubernetes — как "архитектор", который управляет тем, как эти кирпичи взаимодействуют между собой и окружающим миром.
Таблица сравнения
Функция | Docker | Kubernetes |
---|---|---|
Контейнеризация | Да | Нет (работает с контейнерами) |
Оркестрация | Нет (или только в Docker Swarm) | Да |
Масштабирование | Ручное | Автоматическое |
Автоматизация | Вручную, через скрипты | Да (Deployment, CronJob и др.) |
Самовосстановление | Нет | Да |
Балансировка | Нет | Да |
Примеры применения | Разработка, CI/CD, микросервисы | Облачные сервисы, продакшн |
Почему нельзя сравнивать напрямую?
Docker и Kubernetes — это не “или-или”: они работают вместе, но на разных уровнях. Условно, если у вас есть маленькое приложение и вы работаете один, то Docker будет достаточно. Но если у вас большой проект, требуется развернуть несколько экземпляров, обучать команду деплоить новые версии без риска, контролировать доступ — вот тогда вам нужен Kubernetes. Docker описывает, «как» собрать и запустить контейнер, а Kubernetes — «где», «когда» и «сколько» контейнеров крутить в кластере.
Как работает их связка
- Разработка и сборка: вы пишете Dockerfile и собираете образы через Docker.
- Доставка и деплой: Kubernetes получает образы через реестр (например, Docker Hub) и, по сути, “крутит” их по вашим узлам кластера, используя runtime (часто — containerd).
Когда использовать Docker, а когда Kubernetes
Сценарии работы только с Docker
- Ваше приложение не требует масштабирования и всегда запускается только в единственном экземпляре.
- Вы держите “образы” среды для разрабатки (dev environment).
- Не нужно автоматического перезапуска или отказоустойчивости.
- Вы хотите использовать контейнеры только для сборки артефактов CI/CD.
Сценарии работы с Kubernetes
- Вам нужно развертывать приложения в несколько экземпляров (масштабирование).
- Требуется автоматический перезапуск контейнеров при сбоях.
- Ожидается нагрузка, распределенная по многим серверам.
- Необходимость обновлять приложения без остановки работы пользователей (rolling update).
- Необходимо управлять сложной микросервисной системой с десятками или сотнями компонентов.
- Интеграция с клауд-инфраструктурой (автоскейлинг, балансировка).
Сравнение с Docker Compose и Docker Swarm
Сразу уточню: Docker не только про отдельные контейнеры. Есть дополнительные инструменты:
- Docker Compose — позволяет описывать сразу несколько контейнеров и их связи друг с другом (например, web + база + cache). Отлично подходит для локальной разработки, но не рассчитан на продвинутую оркестрацию.
- Docker Swarm — встроенная система оркестрации от Docker, но Kubernetes гораздо популярнее из-за расширенных возможностей и богатого сообщества.
В большинстве случаев для серьезных проектов сейчас выбирают Kubernetes.
Пример разницы между Compose и Kubernetes
Docker Compose:
version: '3'
services:
app:
image: my-python-app:latest
ports:
- "8000:8000"
redis:
image: redis:7-alpine
Kubernetes Deployment + Service: (пример смотрите выше)
Формат описания похож, но возможности по интеграции и управлению у Kubernetes в разы шире.
Заключение
Docker и Kubernetes — инструменты, выполняющие разные задачи, но отлично дополняющие друг друга. Docker позволяет создавать, запускать, тестировать приложения в контейнерах, делая рабочее окружение идентичным на разных машинах. Kubernetes же берет на себя управление контейнерами во множественном числе: изолирует их друг от друга, обеспечивает их высокую доступность и масштабируемость, автоматизируя большинство рутинных процессов.
Для быстрой разработки и опытов часто достаточно одного Docker. Для сложных, распределенных и нагруженных систем нужен Kubernetes — именно он сможет обеспечить отказоустойчивость, автоматизацию и гибкость при обновлениях.
Если вы только начинаете изучать эти инструменты, пробуйте сперва Docker — он проще, а когда встанет вопрос о развертывании продакшн-решения, переходите к Kubernetes.
Частозадаваемые технические вопросы по теме статьи и ответы на них
Вопрос 1. Как развернуть кластер Kubernetes локально для экспериментов?
Ответ:
Есть несколько способов. Наиболее простой — использовать Minikube.
- Установите Minikube:
bash curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 sudo install minikube-linux-amd64 /usr/local/bin/minikube
- Запустите кластер командой:
bash minikube start
- Управляйте приложениями с помощью
kubectl
(его нужно установить отдельно).
Вопрос 2. Могу ли я запускать Docker-контейнеры без Docker Engine внутри Kubernetes?
Ответ:
Да. Начиная с Kubernetes 1.20, стандартным runtime стал containerd (или cri-o). Сам Docker Engine больше не обязателен — Kubernetes работает с OCI-совместимыми образами (Docker-образы поддерживаются полностью).
Вопрос 3. Как принять логи с контейнера в Kubernetes?
Ответ:
Используйте команду:
bash
kubectl logs <имя-pod-а>
Чтобы посмотреть логи конкретного контейнера внутри pod'а:
bash
kubectl logs <имя-pod-а> -c <имя-контейнера>
Вопрос 4. Как узнать, на каком node запущен конкретный pod?
Ответ:
Выполните команду:
bash
kubectl get pod <имя-pod-а> -o wide
В столбце NAME и NODE будет указан соответствующий сервер.
Вопрос 5. Как обновить Docker-образ приложения, если оно уже развернуто в Kubernetes?
Ответ:
- Запушьте новый образ с повышенным тегом (например,
my-app:v2
). - В Deployment измените тег образа (
image: my-app:v2
). - Примените обновление:
bash kubectl apply -f deployment.yaml
Kubernetes детектирует смену образа и выполнит rolling update.
Постройте личный план изучения Kubernetes до уровня Middle — бесплатно!
Kubernetes — часть карты развития DevOps
100+ шагов развития
30 бесплатных лекций
300 бонусных рублей на счет
Бесплатные лекции
Все гайды по Kubernetes
Лучшие курсы по теме

Kubernetes и Helm
Антон Ларичев
Docker и Ansible
Антон Ларичев