
Що таке Docker і як він працює?
docker надсилає команди через REST API демону dockerd, який збирає образи та запускає з них контейнери.Чому це існує? Docker дозволяє вам упакувати програму з усіма її залежностями (бібліотеки, конфігурація, середовище виконання) в єдиний артефакт — образ — і запускати його ідентично на ноутбуці розробника, у CI та в робочому режимі. Це вирішує класичну проблему "працює на моїй машині".
Контейнери проти віртуальних машин. Віртуальна машина віртуалізує апаратне забезпечення та постачає всю гостьову ОС із власним ядром. Контейнер — це ізольований процес, який використовує ядро хоста. У результаті контейнери легші, запускаються за частки секунди та використовують менше ресурсів. Але контейнер — це не легка віртуальна машина: він прив’язаний до ядра хоста, і його межа ізоляції слабша, ніж у віртуальної машини. Віртуальна машина має апаратно-примусову ізоляцію, тоді як уразливість спільного ядра потенційно може бути виведена з контейнера — це компроміс між швидкістю та щільністю. Хост має відповідати типу контейнера: контейнерам Linux потрібне ядро Linux, контейнерам Windows – ядро Windows. У macOS і Windows Docker Desktop прозоро запускає невелику віртуальну машину Linux (наприклад, через WSL2), тому контейнери Linux спільно використовують ядро цієї віртуальної машини, а не ядро вашої ОС.
Архітектура (клієнт-сервер). Відповідно до документації Docker:
- Клієнт
dockerє основним способом взаємодії користувачів із Docker; такі команди, якdocker run, надсилаються демону. - Демон
dockerd«виконує важку роботу» зі створення, запуску та розповсюдження контейнерів і керує такими об’єктами, як зображення, контейнери, мережі та томи. - Клієнт спілкується з демоном через REST API через сокет UNIX або мережевий інтерфейс, тому вони можуть працювати на різних машинах.
- реєстр зберігає зображення; загальнодоступним за замовчуванням є Docker Hub.
Зображення та контейнери. Зручна аналогія: образ схожий на клас (або програму на диску), а контейнер є його екземпляром (запущений процес); Ви можете почати багато контейнерів з одного зображення.
- Зображення – це шаблон, доступний лише для читання, з інструкціями щодо створення контейнера, побудованого з шарів. Він визначається Dockerfile; коли ви змінюєте його, перебудовуються лише змінені шари.
- Контейнер - це екземпляр зображення, який можна запускати. Поверх шарів зображення, призначених лише для читання, додається тонкий записуваний шар (копіювання при записі); все, що там записане, втрачається, коли контейнер видаляється — саме тому для постійних даних потрібні томи.
Як працює ізоляція (під капотом). dockerd не викликає безпосередньо ядро — воно делегує керування життєвим циклом контейнера containerd, який викликає середовище виконання OCI; у Docker типовим є runc, але середовище виконання підключається (crun, gVisor, Kata тощо). Фактична ізоляція походить від функцій ядра Linux:
- Простори імен ізолюють ресурси (на сторінці man7 є 8 типів: PID, мережа, монтування, UTS, IPC, користувач, контрольна група, час). Процес «бачить» лише свої власні PID, власний мережевий стек тощо.
- cgroups (контрольні групи) обмежують і обліковують використання ресурсів (ЦП, пам'ять, введення/виведення).
Поширені подальші дії. Шари зображень кешуються; docker compose запускає багатоконтейнерні програми; дані зберігаються через томи (за замовчуванням контейнер є ефемерним); і OCI стандартизує формат зображення (image-spec), середовище виконання (runtime-spec) і протокол розповсюдження реєстру (distribution-spec) — ці три специфікації забезпечують взаємодію екосистеми.
