Что такое Docker и как работает платформа контейнеризации
Docker — это открытая платформа для разработки и запуска приложений. Если отвечать на вопрос «что такое Docker?», можно сказать, что это инструмент для создания эталонного шаблона приложения со всеми зависимостями. Этот шаблон приложения — или, в терминологии платформы, образ — можно передать другому разработчику, чтобы тот развернул его на своём ПК или сервере в виде контейнера (экземпляра образа).
Главная цель Docker в том, чтобы приложение, которое создано внутри этой платформы, можно было быстро перенести на другой сервер (где тоже установлен Docker), и приложение запустилось без потери функциональности или настроек.
Архитектура Docker: из чего состоит платформа
Архитектурно, Docker создан как классическая клиент-серверная платформа, где:
Docker client и Docker daemon могут работать на одном сервере (пример — локальная разработка) или быть разделены: клиент отправляет команды по SSH с удаленного компьютера на сервер, где запущен демон 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):
bundle/
├── config.json # Конфигурация запуска: команды, env-переменные, лимиты ресурсов
└── rootfs/ # Корневая файловая система (смонтированные слои образа)
├── bin/
├── etc/
└── ...Затем containerd запускает утилиту runc (командами runc create и runc start), которой передаёт путь к OCI bundle. runc — это отдельная программа, написанная на Go, которая напрямую взаимодействует с ядром Linux, настраивая механизмы изоляции для контейнера (на Windows и macOS Docker запускает скрытую Linux-ВМ, внутри которой и работает runc). Изоляция обеспечивается комбинацией следующих механизмов ядра Linux:

В результате на сервере появляется изолированный процесс. Для операционной системы это обычный процесс с определенным 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) программы, который содержит всё необходимое для запуска контейнера: файловую систему, переменные окружения и метаданные.
