Пошук уроків, статей та іншого контенту
Проблема «у мене на комп'ютері працює» — і як контейнери роблять оточення застосунку відтворюваним.
Застосунок залежить не лише від власного коду, а й від конкретної версії мови програмування, системних бібліотек, встановлених пакетів, змінних середовища. Коли розробник, тестове середовище й продакшн-сервер мають хоч трохи різні версії цього оточення, застосунок може працювати в одному місці й ламатись в іншому — попри те, що сам код не змінювався.
Контейнер пакує застосунок разом з усім його оточенням — конкретною версією мови виконання, системними бібліотеками, залежностями — в один переносний, самодостатній об'єкт, що поводиться однаково незалежно від того, на якій машині його запускають: у розробника, на CI-сервері, у продакшені.
Віртуальна машина емулює цілий окремий комп'ютер, включно з власним ядром операційної системи, — важка, повільна для старту (хвилини), з великими накладними витратами на ресурси. Контейнер натомість використовує ядро операційної системи хосту напряму, ізолюючи лише процеси, файлову систему й мережу застосунку через механізми ядра Linux (namespaces та cgroups) — значно легший, стартує за секунди, а не хвилини.
Віртуальна машина: Контейнер:
┌─────────────────────┐ ┌─────────────────────┐
│ Застосунок │ │ Застосунок │
│ Бібліотеки │ │ Бібліотеки │
│ Гостьова ОС (повна) │ ├─────────────────────┤
├─────────────────────┤ │ Docker Engine │
│ Гіпервізор │ ├─────────────────────┤
├─────────────────────┤ │ Ядро ОС хосту │
│ Хост-ОС │ │ (спільне для всіх │
└─────────────────────┘ │ контейнерів) │
└─────────────────────┘Docker — не винахідник контейнерів (сама технологія ізоляції процесів існувала в Linux і раніше), а інструмент, що зробив контейнери зручними у щоденному використанні: простий формат опису образу (Dockerfile, окремий урок далі), реєстр готових образів (Docker Hub), прості команди для збірки й запуску.
У цьому проєкті Docker уже використовується практично — файл docker-compose.yml у корені репозиторію піднімає локальний PostgreSQL для розробки, замість вимоги встановлювати й налаштовувати PostgreSQL напряму на кожній машині розробника (детально в модулі про Docker Compose далі в цьому курсі).
Плутати контейнер із віртуальною машиною за рівнем ізоляції та вагою — контейнер значно легший саме тому, що не емулює окреме ядро ОС, а розділяє ядро хосту.
Вважати, що Docker потрібен лише для складних, розподілених продакшн-систем, — локальна розробка (наприклад, підняти базу даних без ручного встановлення) один із найпрактичніших щоденних випадків використання.
Очікувати, що контейнеризація сама собою вирішує проблеми продуктивності чи архітектури, — вона вирішує відтворюваність оточення, а не замінює правильний дизайн застосунку.
Контейнеризація пакує застосунок разом з усім потрібним оточенням в один переносний об'єкт, що поводиться однаково на будь-якій машині — вирішуючи проблему «у мене працює, а там ні». Контейнери легші за віртуальні машини, бо розділяють ядро операційної системи хосту замість емуляції окремого; Docker — практичний інструмент для збірки, зберігання й запуску контейнерів.