Перейти к основному контенту
NGPP
Кабинет

Учебный конструктор · контейнеры и оркестрация

Docker, Compose и Kubernetes — как это устроено

Слышал про «контейнеры», «поды», «деплойменты», но в голове каша? Собери картину из блоков. Три режима — от простого к сложному: один контейнер (Docker), связка сервисов (Compose) и целый кластер (Kubernetes). Кликай блоки — узнаешь, зачем каждый, а выключив любой — увидишь, что сломается. Запусти команду — и проследи, как запрос бежит сквозь компоненты.

Незнакомы слова (образ, namespaces, Pod, оркестрация…)? → словарь простыми словами внизу. Контейнер работает поверх ядра ОС → разбери архитектуру ОС.

🐳 Docker. Контейнер — это не «лёгкая виртуалка», а обычный процесс Linux, которому ядро через namespaces и cgroups показало урезанный мир: свою файловую систему, свою сеть, свой лимит памяти. Образ — это неизменяемый «слепок» файлов, из которого контейнер запускается за миллисекунды.

Кликни блок — описание справа. Выключи — увидишь, что сломается по зависимостям.
▶ Прогон: как команда проходит по компонентам
Сборка
📝
Dockerfile
🧱
Слои образа
📦
Образ (image)
🏬
Реестр (Registry)не обязателен
Движок
⚙️
Docker Engine / containerd
Запуск
🧬
Изоляция: namespaces + cgroups
🚢
Контейнер
Данные и сеть
💾
Том (Volume)не обязателен
🌉
Сеть (bridge) и портыне обязателен
Dockerfile— как это записывается на практике
FROM node:20-alpine          # базовый слой: ОС + Node
WORKDIR /app
COPY package*.json ./        # сначала зависимости — кэшируется
RUN npm ci --omit=dev        # слой с node_modules
COPY . .                     # слой с кодом приложения
EXPOSE 3000                  # какой порт слушает
CMD ["node", "server.js"]    # чем запускаться
FROM
— базовый образ — нижний слой, переиспользуется между сборками
COPY до RUN npm
— трюк кэша: зависимости меняются редко → слой не пересобирается при правке кода
EXPOSE
— документирует порт; наружу публикует уже docker run -p
CMD
— команда запуска контейнера (можно переопределить при run)

📖 Словарь: простыми словами

Встретил незнакомое слово выше — найди его здесь. Коротко — суть; разверни — подробное объяснение с аналогией.

Контейнеризолированный процесс с собственным видом файлов/сети и лимитом ресурсов

Не виртуальная машина, а обычный процесс Linux, которому ядро через namespaces показало урезанный мир, а через cgroups ограничило ресурсы. Поэтому запускается за миллисекунды и почти не ест лишнего — в отличие от ВМ с целой гостевой ОС.

Образ (image)неизменяемый слепок файлов, из которого запускается контейнер

Состоит из слоёв (по инструкции Dockerfile). Собирается один раз, хранится в реестре, запускается сколько угодно раз. Один образ → много одинаковых контейнеров.

Слой (layer)неизменяемый набор изменений ФС; слои кэшируются и переиспользуются

Каждая инструкция Dockerfile добавляет слой. Общий базовый слой хранится один раз на много образов; при пересборке меняются только верхние слои — отсюда скорость и экономия.

Namespacesмеханизм ядра: контейнер видит «свои» процессы, сеть, файлы

Linux-namespaces изолируют то, что видит процесс: список процессов (PID), сетевые интерфейсы (net), точки монтирования (mnt) и т.д. Именно поэтому внутри контейнера он «один в системе».

cgroupsлимиты ресурсов: сколько CPU, памяти и I/O можно процессу

Control groups — механизм ядра, ограничивающий и учитывающий потребление ресурсов. Без него контейнер мог бы съесть весь хост. Namespaces дают изоляцию видимости, cgroups — изоляцию ресурсов.

Том (volume)постоянное хранилище, переживающее пересоздание контейнера

Контейнеры эфемерны: удаляются и создаются заново. Данные (БД, загрузки) хранят в томах — отдельно от одноразового слоя контейнера. Принцип: состояние отдельно от вычисления.

Реестр (registry)хранилище образов (Docker Hub, приватный): push/pull

Связывает место сборки и место запуска: собрал образ → push в реестр → на сервере pull и run. Без реестра образ живёт только на твоей машине.

Docker Composeописание связки сервисов в одном YAML и запуск одной командой

Реальное приложение — несколько контейнеров (веб+БД+кэш). Compose описывает их в docker-compose.yml: образы, порты, тома, сети, зависимости — и поднимает весь стек командой `docker compose up`.

Оркестрацияавтоматическое управление множеством контейнеров на многих машинах

Когда контейнеров и хостов много, нужен «автопилот»: размещать, перезапускать упавшие, масштабировать, обновлять без простоя. Этим занимается Kubernetes (и подобные).

Podминимальная единица k8s: один или несколько контейнеров вместе

Kubernetes управляет не контейнерами напрямую, а Pod-ами. Контейнеры в одном Pod делят сеть и тома и живут вместе. Pod эфемерен — его не чинят, а пересоздают.

Deploymentдекларация «хочу N реплик такой версии» с плавными обновлениями

Управляет ReplicaSet-ами: держит нужное число Pod-ов, плавно катит новые версии (rolling update) и откатывает при сбое. Ты описываешь желаемое — кластер сам добивается его.

Serviceстабильный адрес и балансировка поверх меняющихся Pod-ов

Pod-ы приходят и уходят с разными IP. Service даёт один постоянный адрес и распределяет трафик между живыми Pod-ами по их меткам. Принцип: стабильный фасад над эфемерным набором.

Control plane / Nodeуправляющий слой (мозг) и рабочие узлы (мышцы) кластера

Control plane (apiserver, etcd, scheduler, controller-manager) принимает решения и хранит состояние. Worker-узлы (kubelet, kube-proxy, runtime) реально запускают контейнеры по этим решениям.

Желаемое состояние (declarative)описываешь ЧТО хочешь, система сама добивается этого

Ключевая идея k8s: вместо команд «сделай шаг 1, 2, 3» ты декларируешь итог («3 реплики версии 1.4»). Контроллеры в цикле сверки (reconcile loop) постоянно подгоняют реальность под желаемое.

Дальше по теме

Эти инструменты связаны с текущим — так задачи стыкуются на практике.

Все инструменты — в каталоге.