ChiMate.aiТВОЙ ИИ АССИСТЕНТ
← Все вопросы
Что такое Docker и как он работает?
ЧастоJuniorDevOps

Что такое Docker и как он работает?

Коротко
Docker — это открытая платформа для упаковки и запуска приложений в контейнерах: изолированных процессах, использующих ядро Linux (namespaces и cgroups), но не требующих полноценной виртуальной машины. Работает по клиент-серверной схеме: клиент 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) — благодаря этим трём спецификациям экосистема совместима.

ContainersDocker