Что такое Docker и как работает платформа контейнеризации

Docker — это открытая платформа для разработки и запуска приложений. Если отвечать на вопрос «что такое Docker?», можно сказать, что это инструмент для создания эталонного шаблона приложения со всеми зависимостями. Этот шаблон приложения — или, в терминологии платформы, образ — можно передать другому разработчику, чтобы тот развернул его на своём ПК или сервере в виде контейнера (экземпляра образа).

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

Архитектура Docker: из чего состоит платформа

Архитектурно, Docker создан как классическая клиент-серверная платформа, где:

  • Клиент Docker (docker client) — это программа, с которой взаимодействует пользователь (например, команда docker run в терминале). Программа client отправляет запросы серверной части — демону Docker;
  • Docker daemon (dockerd) — фоновый процесс (сервер), который принимает запрос по REST API от client и управляет образами и контейнерами. От отвечает за: сборку образов (docker build), запуск/остановку контейнеров (docker run, docker stop), передачу образов между хостом и реестром (docker push/pull).

Docker client и Docker daemon могут работать на одном сервере (пример — локальная разработка) или быть разделены: клиент отправляет команды по SSH с удаленного компьютера на сервер, где запущен демон Docker.

Схема архитектуры Docker: взаимодействие клиента (docker run, build, pull), демона (dockerd), локальных образов и контейнеров на хосте с удаленным реестром (Registry).
Клиент — серверная архитектура Docker

В архитектуре Docker также есть особенный «клиент» — Docker Compose. Фактически, это отдельный инструмент, который читает инструкции из файла и запускает многоконтейнерные приложения. Например, вы можете описать в одном файле docker-compose.yml набор сервисов с параметрами: веб-приложение, базу данных и кеш. Далее, Compose как и обычный client, прочитает инструкции из файла и отправит dockerd команды по REST API, чтобы запустить каждый из этих сервисов.

Рассмотрим каждый компонент архитектуры Docker подробнее.

Демон Docker (Docker Daemon)

Как уже упоминалось, демон Docker (dockerd) — это привилегированный фоновый процесс, который слушает запросы от клиента через REST API и управляет жизненным циклом объектов: образами (images), контейнерами (containers), сетями (networks) и томами (volumes). Если коротко, то Dockerd это управляющий компонент всей платформы.

Получив запрос от клиента (например, docker run с параметрами портов и томов), dockerd обращается по протоколу gRPC к внутреннему компоненту Docker containerd, который отвечает за управление жизненным циклом контейнеров.

Docker containerd подготавливает среду выполнения: он извлекает слои из образа и формирует OCI bundle — стандартизированную структуру каталогов, которая описывает состояние будущего контейнера (слои образа монтируются в единую корневую файловую систему — rootfs):

Затем containerd запускает утилиту runc (командами runc create и runc start), которой передаёт путь к OCI bundle. runc — это отдельная программа, написанная на Go, которая напрямую взаимодействует с ядром Linux, настраивая механизмы изоляции для контейнера (на Windows и macOS Docker запускает скрытую Linux-ВМ, внутри которой и работает runc). Изоляция обеспечивается комбинацией следующих механизмов ядра Linux:

  • Namespaces (PID, NET, MNT, UTS, IPC, USER) — ограничивают видимость: процесс «видит» только свои PID, свою сеть и свою файловую систему.
  • Cgroups (CPU, RAM, Disk I/O) — устанавливают квоты на потребление ресурсов, чтобы один контейнер не положил весь хост.
  • Capabilities — управляют набором root-привилегий. Позволяют дать контейнеру права на bind порта (NET_BIND_SERVICE), но запретить, например, перезагрузку системы.
  • Seccomp (Secure Computing Mode) — фильтр системных вызовов. Запрещает опасные операции (например, mount, reboot), оставляя только необходимый минимум для работы приложения.
  • Mount — настраивает файловую систему контейнера: монтирует rootfs из образа и подключает внешние тома (volumes), изолируя контейнер от файловой системы хоста.
Схема внутренней архитектуры Docker: цепочка запуска контейнера от клиента (docker run) через dockerd и containerd к runc и ядру Linux. Показаны протоколы REST API/gRPC, структура OCI bundle и механизмы изоляции (Namespaces, Cgroups, Seccomp).
Детальная схема серверной части Docker

В результате на сервере появляется изолированный процесс. Для операционной системы это обычный процесс с определенным PID (идентификатором процесса), но благодаря комбинации namespaces и cgroups он изолирован от других процессов, сети и ресурсов. Этот изолированный процесс и называется контейнером.

Клиент Docker (Docker Client)

Клиент Docker (docker) — это основной интерфейс для взаимодействия пользователя с платформой. При вводе команды, например docker run, клиент формирует HTTP-запрос к Docker Engine API и отправляет его демону dockerd.

Один клиент может быть подключен сразу к нескольким демонам одновременно — например, управляя локальным хостом и удалённым сервером из одного терминала.

Реестры Docker (Docker Registries)

Реестр Docker — это хранилище образов (images). По умолчанию демон dockerd загружает образы из публичного реестра Docker Hub. Он открыт для всех пользователей. Также вы можете настроить взаимодействие с любым другим или развернуть собственный приватный реестр.

Когда клиент выполняет такие команды как: docker pull или docker run, то демон обращается к реестру за образом, если тот отсутствует локально. Дополнительно, в реестр можно загружать собственные образы через команду docker push для хранения или передачи другим разработчикам.

Загрузка образов происходит послойно (layer-by-layer), а не целиком. Демон проверяет наличие каждого слоя на хосте и загружает только те слои образа, которых нет в локальном кэше. Такой подход ускоряет обмен данными и экономит трафик.

Образы (Images)

Образ (image) — это неизменяемый шаблон (read-only template) программы, который содержит всё необходимое для запуска контейнера: файловую систему, переменные окружения и метаданные.

Контейнеры (containers)

Docker Desktop

Чем Docker отличается от VM

Зачем нужен Docker сегодня