Пошук уроків, статей та іншого контенту
Порівняємо ізоляцію, споживання ресурсів і принцип роботи Docker-контейнерів та віртуальних машин.
Контейнери та віртуальні машини дають змогу запускати програми в ізольованих середовищах. Це допомагає уникати конфліктів між залежностями, спрощує розгортання та робить поведінку програми передбачуванішою.
Попри схожу мету, ці технології працюють по-різному:
віртуальна машина віртуалізує цілу апаратну систему;
контейнер ізолює процеси на рівні операційної системи.
Віртуальна машина, або VM, запускається за допомогою спеціального програмного шару — гіпервізора.
Гіпервізор розподіляє фізичні ресурси комп’ютера між віртуальними машинами. Кожна VM має власні:
операційну систему;
ядро;
файлову систему;
процеси;
віртуальні процесорні ядра та оперативну пам’ять.
Спрощена схема:
Фізичне обладнання
│
Гіпервізор
┌────┴────┐
│ │
VM 1 VM 2
ОС ОСНаприклад, на комп’ютері з Linux можна запустити віртуальну машину з Windows. Усередині VM Windows працює як повноцінна операційна система зі своїм ядром.
Сильна ізоляція між гостьовими операційними системами.
Можливість запускати різні операційні системи на одному фізичному комп’ютері.
Зручність для емуляції окремих серверів або цілих інфраструктур.
Кожна VM повинна завантажити власну операційну систему.
Вони споживають більше оперативної пам’яті та дискового простору.
Запуск і зупинка зазвичай повільніші, ніж у контейнерів.
Для роботи кількох VM потрібні значні ресурси хоста.
Docker-контейнер — це ізольований процес або група процесів, які працюють на хостовій операційній системі.
Контейнер не містить власного ядра. Він використовує ядро операційної системи хоста, але має ізольовані:
процеси;
мережеві інтерфейси;
файлову систему;
користувачів;
ресурси процесора та пам’яті.
Спрощена схема:
Фізичне обладнання
│
Операційна система хоста
│
Docker
┌────┴────┐
Контейнер Контейнер
процеси процесиDocker використовує механізми операційної системи Linux для ізоляції процесів і керування ресурсами. Контейнер зазвичай запускає одну основну програму або один сервіс.
Важливо: контейнер — це не маленька віртуальна машина. У нього немає окремого ядра та повністю незалежної операційної системи.
Віртуальна машина ізольована разом із власною операційною системою. Збій процесу всередині VM зазвичай не впливає на процеси іншої VM.
Однак програмне забезпечення гостьової ОС усе одно потребує оновлень і налаштування безпеки.
Контейнери ізолюють процеси один від одного, але використовують спільне ядро хостової операційної системи.
Тому контейнерна ізоляція:
легша та швидша;
достатня для багатьох прикладних сценаріїв;
залежить від безпеки Docker, ядра та конфігурації хоста.
Контейнер не слід сприймати як абсолютний бар’єр безпеки. Для особливо суворої ізоляції можуть використовуватися віртуальні машини або додаткові засоби захисту.
Віртуальна машина потребує пам’яті для власної операційної системи. Навіть якщо всередині працює лише один невеликий сервіс, гостьова ОС уже споживає частину ресурсів.
Контейнер не запускає окреме ядро й не завантажує повну ОС. Тому його накладні витрати зазвичай значно менші.
Віртуальні машини мають додатковий рівень між програмою та фізичним обладнанням — гіпервізор. Сучасні гіпервізори працюють ефективно, але певні накладні витрати все одно є.
Контейнерні процеси працюють ближче до хостової ОС, тому запуск і виконання часто мають менші накладні витрати.
Образ віртуальної машини містить повну операційну систему та зазвичай займає багато місця.
Docker-образ містить лише необхідні шари файлової системи та залежності. Образи можуть повторно використовувати спільні шари, що заощаджує простір.
Віртуальна машина під час запуску завантажує гостьову операційну систему:
запускається віртуальне обладнання;
завантажується ядро гостьової ОС;
запускаються системні служби;
запускається потрібна програма.
Контейнер запускає процес без завантаження окремої ОС:
Docker створює ізольоване середовище;
підключає файлову систему контейнера;
запускає основний процес.
Через це контейнер зазвичай запускається за секунди або швидше, тоді як віртуальна машина може потребувати більше часу.
Команда нижче запускає контейнер із вебсервером Nginx:
docker run --name demo-web -d -p 8080:80 nginxЩо означають параметри:
docker run — створити та запустити контейнер;
--name demo-web — надати контейнеру ім’я;
-d — запустити у фоновому режимі;
-p 8080:80 — перенаправити порт 8080 хоста на порт 80 контейнера;
nginx — ім’я Docker-образу.
Після запуску:
docker psКоманда покаже запущений контейнер. Вебсервер буде доступний на порту 8080 хоста.
Зупинити контейнер можна так:
docker stop demo-webПісля зупинки видалити його:
docker rm demo-webУ цьому прикладі Nginx працює всередині контейнера, але контейнер не має окремої операційної системи. Він використовує ядро хостової системи.
| Властивість | Віртуальна машина | Docker-контейнер | |---|---|---| | Що ізолюється | Повна операційна система | Процеси та середовище виконання | | Власне ядро | Так | Ні, використовується ядро хоста | | Споживання ресурсів | Вище | Зазвичай нижче | | Швидкість запуску | Нижча | Вища | | Розмір середовища | Часто великий | Зазвичай менший | | Запуск іншої ОС | Так | Обмежено ядром хоста | | Рівень ізоляції | Сильний | Легший, але достатній для багатьох задач |
Віртуальні машини доречні, коли потрібно:
запускати операційну систему, відмінну від ОС хоста;
отримати сильнішу ізоляцію між середовищами;
моделювати окремі сервери;
запускати програмне забезпечення, яке очікує повноцінну операційну систему.
Наприклад, команда може створити окрему VM для тестування Windows-програми на Linux-хості.
Контейнери доречні, коли потрібно:
швидко запускати та зупиняти сервіси;
однаково працювати з програмою на різних комп’ютерах;
ізолювати залежності різних застосунків;
запускати багато невеликих сервісів на одному хості;
ефективно використовувати ресурси.
Наприклад, вебзастосунок можна запустити в одному контейнері, базу даних — в іншому, а фоновий обробник — у третьому.
Віртуальна машина віртуалізує комп’ютер.
Контейнер ізолює процес.
Це впливає на вибір технології:
якщо потрібен окремий комп’ютер з іншою ОС — частіше обирають VM;
якщо потрібно швидко ізолювати сервіс і його залежності — часто обирають контейнер.
Обидва підходи можуть використовуватися одночасно. Наприклад, Docker-контейнери можуть працювати всередині віртуальної машини на сервері. У такому випадку VM забезпечує додатковий рівень ізоляції, а контейнери — зручний запуск окремих сервісів.
Контейнер не має власного ядра та не є незалежним комп’ютером. Він залежить від операційної системи хоста.
Контейнери легші за VM, але кожен процес використовує CPU, пам’ять, мережу та диск. Велика кількість контейнерів також може перевантажити хост.
Образ — шаблон із файлами та налаштуваннями, необхідними для запуску.
Контейнер — запущений екземпляр образу.
Один образ може бути основою для кількох контейнерів.
Оскільки контейнери використовують ядро хоста, вони не є повністю незалежними від нього. Це важливо враховувати під час вибору рівня ізоляції.
Контейнерний образ може бути невеликим не тому, що в ньому відсутня функціональність програми, а тому, що він не містить повну операційну систему та її ядро.
Віртуальна машина містить власну операційну систему та ядро.
Контейнер ізолює процеси, але використовує ядро хостової ОС.
VM зазвичай потребують більше ресурсів і довше запускаються.
Контейнери легші, швидші та зручні для запуску окремих сервісів.
Віртуальні машини забезпечують сильнішу ізоляцію та можуть запускати іншу операційну систему.
Контейнер — це не віртуальна машина, а ізольоване середовище для процесів.
Docker і віртуальні машини можуть використовуватися разом.