Как связаны Docker и Kubernetes?

«Как связаны Docker и Kubernetes?» — вопрос из категории Kubernetes, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Docker и Kubernetes решают разные, но взаимодополняющие задачи в жизненном цикле контейнеризированного приложения. В моей работе с K8s это выглядит так:

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

  • Создание: Я пишу Dockerfile, в котором описываю базовый образ, зависимости, код приложения и команду запуска.
    FROM python:3.11-slim
    WORKDIR /app
    COPY requirements.txt .
    RUN pip install --no-cache-dir -r requirements.txt
    COPY . .
    CMD ["gunicorn", "app:app", "-b", "0.0.0.0:8000"]
  • Запуск: Командой docker run я могу запустить этот контейнер локально для тестирования.

Kubernetes — это система оркестрации, которая управляет десятками, сотнями таких контейнеров (запущенных не только через Docker) в кластере машин.

  • Управление: Я описываю желаемое состояние приложения в YAML-манифестах: сколько реплик должно быть (Deployment), как их обновлять, как подключать конфигурацию (ConfigMap), секреты (Secret), хранилище (PersistentVolumeClaim) и как открывать доступ к сервису (Service, Ingress).
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: my-app
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: my-app
      template:
        metadata:
          labels:
            app: my-app
        spec:
          containers:
          - name: app
            image: myregistry.com/my-app:latest # Образ, созданный Docker
            ports:
            - containerPort: 8000
  • Kubernetes не запускает контейнеры напрямую. Он через Container Runtime Interface (CRI) взаимодействует с контейнерной средой выполнения (container runtime). Раньше этой средой часто был Docker Engine, но сейчас стандартом стал containerd (который, кстати, является частью Docker). Kubernetes вызывает containerd, который, в свою очередь, загружает образ и запускает контейнер.

Аналогия: Если Docker — это станок, который производит одинаковые коробки (контейнеры), то Kubernetes — это логистический центр, который решает, на какие полки (ноды) эти коробки поставить, сколько их нужно, как заменять сломанные и как маршрутизировать к ним погрузчики (трафик).