
Что такое Docker и как он работает?
docker через REST API отдаёт команды демону dockerd, который собирает
образы и запускает из них контейнеры.Зачем нужен. Docker позволяет упаковать приложение вместе со всеми его зависимостями (библиотеки, конфиги, рантайм) в единый артефакт — образ — и запускать его одинаково на ноутбуке разработчика, в CI и на проде. Это решает классическую проблему «у меня всё работает».
Контейнеры против виртуальных машин. ВМ виртуализирует железо и тащит за собой целую гостевую ОС с собственным ядром. Контейнер — это изолированный процесс, который использует ядро хоста. Поэтому контейнеры легче, стартуют за доли секунды и потребляют меньше ресурсов. Но контейнер — это не «лёгкая ВМ»: он завязан на ядро хоста, и граница изоляции слабее, чем у ВМ. У ВМ изоляция аппаратная, а уязвимость в общем ядре потенциально позволяет «сбежать» из контейнера — это плата за скорость и плотность. Хост должен соответствовать типу контейнера: Linux-контейнеру нужно Linux-ядро, Windows-контейнеру — Windows-ядро. На macOS и Windows Docker Desktop незаметно поднимает маленькую Linux-ВМ (например через WSL2), и Linux-контейнеры используют ядро этой ВМ, а не ядро вашей ОС.
Архитектура (клиент-сервер). По документации Docker:
- Клиент
docker— основной способ взаимодействия пользователя; команды вродеdocker runон отправляет демону. - Демон
dockerd— «делает основную работу»: собирает, запускает и распространяет контейнеры, управляет образами, контейнерами, сетями и томами. - Клиент общается с демоном через REST API поверх UNIX-сокета или сети, поэтому они могут быть на разных машинах.
- Реестр (registry) хранит образы; публичный по умолчанию — Docker Hub.
Образы и контейнеры. Удобная аналогия: образ — как класс (или программа на диске), а контейнер — его экземпляр (запущенный процесс); из одного образа можно запустить много контейнеров.
- Образ — read-only шаблон с инструкциями для создания контейнера, состоит из слоёв. Описывается в Dockerfile; при изменении пересобираются только изменившиеся слои.
- Контейнер — запущенный экземпляр образа. Поверх read-only слоёв образа он добавляет тонкий записываемый слой (copy-on-write); всё, что туда пишется, теряется при удалении контейнера — поэтому для постоянных данных нужны volumes.
Как достигается изоляция (под капотом). dockerd не дёргает ядро напрямую — он делегирует управление жизненным циклом контейнеров демону containerd, который вызывает OCI-рантайм; по умолчанию в Docker это runc, но рантайм подключаемый (crun, gVisor, Kata и др.). Реальную изоляцию обеспечивают функции ядра Linux:
- namespaces — изолируют ресурсы (по man7 их 8 типов: PID, network, mount, UTS, IPC, user, cgroup, time). Процесс «видит» только своё: свои PID, свой сетевой стек и т. д.
- cgroups (control groups) — ограничивают и учитывают потребление ресурсов (CPU, память, I/O).
Типичные follow-up вопросы. Слои образа кешируются; docker compose поднимает многоконтейнерные приложения; данные сохраняются через volumes (контейнер по умолчанию эфемерный); OCI стандартизирует формат образа (image-spec), рантайм (runtime-spec) и протокол распространения через реестр (distribution-spec) — благодаря этим трём спецификациям экосистема совместима.