1. Архитектура Docker: взаимодействие клиента, демона и реестра
В предыдущем модуле, изучая продвинутые практики работы с Git, мы выяснили, как управлять версиями исходного кода и обеспечивать совместную работу команды. Однако код — это лишь половина дела. Чтобы приложение работало у пользователей так же стабильно, как на ноутбуке разработчика, необходимо управлять не только кодом, но и средой его выполнения. Эту задачу решает контейнеризация, а индустриальным стандартом в этой области является Docker.
Многие начинающие инженеры воспринимают Docker как единую монолитную программу: ввел команду в терминал, и магия произошла — приложение запустилось. На самом деле под капотом скрывается распределенная клиент-серверная архитектура. Понимание того, как компоненты этой системы общаются между собой, отличает уверенного Junior+ DevOps инженера от новичка, который просто заучил набор команд.
В основе работы платформы лежат три главных компонента: Docker Client (клиент), Docker Daemon (демон) и Docker Registry (реестр).
!Схема архитектуры Docker: Клиент, Демон и Реестр
Разделение обязанностей: почему не монолит?
Архитектура Docker построена на строгом разделении обязанностей. Вместо того чтобы создавать одну тяжеловесную программу, разработчики разделили интерфейс управления и вычислительное ядро.
Такой подход дает колоссальную гибкость. Вы можете сидеть с легким ультрабуком в кафе, вводить команды в терминал (клиент), а вся тяжелая работа по сборке и запуску контейнеров будет происходить на мощном сервере в дата-центре (демон). Если бы Docker был монолитом, удаленное управление инфраструктурой было бы крайне затруднительным.
> Клиент-серверная архитектура — это вычислительная модель, в которой задачи распределяются между поставщиками ресурсов (серверами) и заказчиками этих ресурсов (клиентами). В контексте Docker сервер выполняет всю тяжелую работу, а клиент лишь передает ваши пожелания.
Рассмотрим каждый из компонентов детально.
Docker Daemon: Сердце системы
Docker Daemon (процесс dockerd) — это фоновый процесс, который работает на хост-машине (сервере или вашем компьютере). Это «мозг» и «руки» всей системы. Именно демон выполняет всю реальную работу.
Его главная задача — прослушивать запросы от клиента и управлять Docker-объектами. К таким объектам относятся:
Демон постоянно работает в фоне. Если вы остановите процесс dockerd, все ваши запущенные контейнеры по умолчанию также остановятся, а клиент потеряет возможность управлять системой.
Практический нюанс: Live Restore
В production-средах остановка контейнеров при перезапуске демона (например, для обновления самого Docker) недопустима. Для решения этой проблемы DevOps-инженеры используют функцию Live Restore.
Она настраивается в конфигурационном файле демона daemon.json:
При включении этой опции демон позволяет контейнерам продолжать работу даже во время своей перезагрузки. Это отличный пример того, как глубокое понимание архитектуры помогает обеспечивать высокую доступность (High Availability) сервисов.
Docker Client: Ваш пульт управления
Docker Client (утилита docker) — это основной способ взаимодействия пользователя с платформой. Когда вы вводите в терминале команду, например docker run nginx, вы взаимодействуете именно с клиентом.
Важно понимать: клиент сам по себе ничего не запускает и не скачивает. Это просто транслятор. Он берет вашу человекочитаемую команду, превращает ее в HTTP-запрос и отправляет демону через REST API.
Как клиент общается с демоном?
Связь между клиентом и демоном может осуществляться тремя основными способами:
| Способ связи | Описание | Когда используется |
| :--- | :--- | :--- |
| UNIX-сокет | Локальный канал связи внутри одной операционной системы (обычно /var/run/docker.sock). | По умолчанию на Linux-системах, когда клиент и демон находятся на одной машине. Самый быстрый и безопасный способ. |
| TCP-сокет | Сетевое соединение по IP-адресу и порту (обычно 2375 без шифрования или 2376 с TLS). | Для удаленного управления демоном с другой машины. |
| FD (File Descriptor) | Использование файловых дескрипторов. | Специфично для систем инициализации, таких как systemd. |
Поскольку общение происходит через стандартизированный REST API, клиентом не обязательно должна быть официальная утилита командной строки. Вы можете написать скрипт на Python, использовать графический интерфейс (например, Portainer) или плагин в вашей IDE — все они будут отправлять точно такие же API-запросы к демону.
Docker Registry: Библиотека образов
Третий столп архитектуры — Docker Registry (реестр). Это хранилище, в котором лежат образы контейнеров. Если демон — это кухня ресторана, а клиент — официант, то реестр — это склад продуктов, откуда кухня берет ингредиенты.
Реестры бывают двух типов:
Механика Pull и Push
Взаимодействие с реестром происходит через две основные операции:
Образы в реестре хранятся не монолитными файлами, а в виде слоев (layers). Каждый слой представляет собой набор изменений файловой системы.
Представьте, что у вас есть базовый образ операционной системы размером 150 МБ. Вы добавляете в него свое приложение размером 10 МБ. Итоговый образ весит 160 МБ. Если вы измените одну строчку кода в приложении и сделаете push, Docker не будет заново загружать все 160 МБ. Он загрузит только измененный слой размером в несколько килобайт. Это делает архитектуру Docker невероятно быстрой и экономной к сетевому трафику.
Анатомия одной команды: что происходит под капотом
Чтобы закрепить понимание архитектуры, давайте разберем по шагам, что происходит в системе, когда вы вводите базовую команду:
docker run -d -p 8080:80 nginx
-d), пробросить порт 8080 на порт 80 внутри контейнера и использовать образ nginx.nginx?Весь этот сложный процесс занимает доли секунды, но в нем участвуют все три компонента архитектуры.
Удаленное управление и безопасность
Как мы уже выяснили, клиент и демон не обязаны находиться на одном компьютере. Вы можете настроить свой локальный клиент так, чтобы он управлял демоном на удаленном сервере.
Для этого используется переменная окружения DOCKER_HOST. Если вы выполните в терминале команду:
export DOCKER_HOST=tcp://192.168.1.50:2375
Все последующие команды docker будут отправляться не локальному демону, а на сервер с IP-адресом 192.168.1.50.
Подводные камни безопасности
Открытие порта демона наружу — одна из самых частых и фатальных ошибок начинающих DevOps-инженеров.
Порт 2375 передает данные в открытом виде и не требует аутентификации. Если вы откроете этот порт в интернет, любой злоумышленник сможет подключиться к вашему демону, запустить контейнер с правами root и получить полный контроль над вашим сервером. Это равносильно тому, чтобы оставить ключи в замке зажигания открытого автомобиля.
Для безопасного удаленного управления всегда используется порт 2376 и протокол TLS (Transport Layer Security). В этом случае клиент и демон обмениваются криптографическими сертификатами, подтверждая свою подлинность, а весь трафик между ними надежно шифруется.
Архитектурные различия: Linux против Windows и macOS
Важно понимать, как архитектура Docker адаптируется под разные операционные системы.
Docker изначально создавался для Linux. Демон dockerd напрямую использует функции ядра Linux (такие как cgroups и namespaces) для создания изолированных контейнеров. Поэтому на серверах Ubuntu, CentOS или Debian Docker работает нативно, без прослоек, обеспечивая максимальную производительность.
Однако ядра Windows и macOS не имеют встроенных механизмов Linux-контейнеризации. Как же тогда работает Docker Desktop на ноутбуках разработчиков?
Здесь архитектура усложняется. Docker Desktop незаметно для пользователя запускает легковесную виртуальную машину (VM) с ядром Linux.
Именно из-за этой архитектурной особенности (наличия прослойки в виде виртуальной машины) работа с файловой системой (монтирование томов) на Mac и Windows исторически работает медленнее, чем на нативном Linux. Понимание этого факта поможет вам правильно диагностировать проблемы с производительностью при локальной разработке.
Понимание того, как клиент передает команды демону, а демон управляет образами из реестра, является фундаментом. В следующих модулях мы будем опираться на эти знания, чтобы автоматизировать процессы сборки и развертывания, а также управлять сотнями таких демонов с помощью оркестраторов.