Як і FreeBSD Jails і Solaris Zones, контейнери Linux — незалежні середовища виконання з власними центральним процесором, пам’яттю, блоком вводу-виводу та мережевими ресурсами, які використовують ядро гостьової ОС. На виході ви отримуєте щось подібне до віртуальної машини, яка працює як надбудова гостьової ОС.
У широкомасштабній системі, коли у вас працюють віртуальні сервери, це зазвичай означає, що ви використовуєте безліч дублікатів однієї і тієї ж ОС і багато зайвих завантажувальних томів.
У середовищі застосунків з вимогами веб-масштабування контейнери є більш привабливим середовищем, ніж традиційна серверна віртуалізація.
Щоб зрозуміти, що таке контейнери, потрібно почати з контрольних груп та простору імен Linux — функціями ядра Linux, які створюють стіни між контейнерами та іншими процесами, що проходять на хості. Простори імен Linux створюють оболонку для набору системних ресурсів і представляють їх процесу.
Контрольні групи Linux керують ізолюванням та використанням системних ресурсів — центральним процесором, пам’яттю — для групи процесів. Наприклад, якщо ваш застосунок займає багато циклів ЦП та пам’яті, ви можете помістити його до контрольної групи, щоб обмежити використання пам’яті та ЦП.
Простори імен займаються ізолюванням ресурсів для одного процесу, а контрольні групи управляють ресурсами для групи процесів.
Від LXC до Docker
Оригінальна технологія контейнерів Linux називається Linux Containers або LXC. LXC — це метод віртуалізації на рівні ОС, призначений для того, щоб запускати безліч ізольованих систем Linux на одному хості.
Контейнери відокремлюють програми від операційних систем. Це означає, що користувач має чисту мінімальну Linux ОС, і можна запускати всі процеси в одному або декількох ізольованих контейнерах.
Оскільки операційна система відокремлена від контейнерів, ви можете переміщати контейнер на будь-який Linux-сервер, який підтримує операційне середовище контейнера.
Docker, який почався як проєкт, щоб будувати LXC-контейнери під одну програму, серйозно змінив LXC і зробив контейнери більш портативними та гнучкими.
Docker — це відкрита платформа для розробки, доставки та експлуатації застосунків. Використовуючи контейнери Docker, ви можете розгортати, копіювати, переносити та робити резервні копії інформації швидше та легше, ніж за допомогою віртуальної машини. У принципі Docker привносить хмароподібну гнучкість в будь-яку інфраструктуру, яка може працювати на контейнерах.
- Памʼять: 4096 МБ
- Диск: 50 ГБ SSD
- Трафік: Безліміт
- CPU: 2 ядра
Давайте розглянемо Docker детальніше та подивимося, чим Docker відрізняється від LXC у розділі нижче.
Технологія контейнеризації Docker
Хоча Docker почався як проєкт з відкритим кодом для того, щоб будувати спеціалізовану LXC, він пізніше перетворився на власне контейнерне середовище виконання. Docker — це інструмент Linux, який ефективно створює, відправляє та запускає контейнери.
Контейнери Docker і LXC — легкі механізми віртуалізації в просторі користувача, які застосовують контрольні групи та простори імен, щоб керувати ізолюванням ресурсів. Але між Docker та LXC є кілька фундаментальних відмінностей — розглянемо їх.
Єдиний процес vs безліч процесів
Docker обмежує контейнери, змушуючи їх працювати як єдиний процес. Якщо ваше середовище програми складається з X одночасних процесів, Docker запустить X контейнерів, кожен зі своїм процесом. На відміну від Docker, контейнери LXC можуть запускати безліч процесів.
Щоб запустити простий багаторівневий веб-додаток в Docker, вам знадобиться PHP контейнер, Nginx контейнер (веб-сервер), MySQL контейнер (для процесу бази даних) та кілька контейнерів даних для того, щоб зберігати таблиці баз даних та іншу інформацію програми.
У однопроцесних контейнерів багато переваг, включаючи прості та дрібніші оновлення. Вам не потрібно вбивати процес баз даних, коли ви хочете оновити лише веб-сервер. Також у однопроцесних контейнерів ефективна архітектура для того, щоб будувати програми, що базуються на мікросервісах.
Однопроцесні контейнери також мають обмеження. Наприклад, ви не можете запускати агенти, скрипти реєстрації або SSH-процеси, що автоматично запускаються всередині контейнера. Також нелегко незначним чином оновлювати однопроцесний контейнер на рівні додатка. Вам доведеться запускати новий оновлений контейнер.
Безструктурність vs структурність
Контейнери Docker виготовлені так, щоб бути більш безструктурними, ніж LXC.
По-перше, Docker не підтримує зовнішнє сховище. Docker обходить це тим, що дозволяє вам підключати сховище хоста як том Docker з ваших контейнерів. Оскільки томи підключаються, вони вважаються частиною середовища контейнера.
По-друге, контейнери Docker складаються із шарів у режимі читання. Це означає, що тільки-но створюється образ контейнера, він не змінюється. Під час виконання програми, якщо процес у контейнері змінює свій внутрішній стан, створюється різниця між внутрішнім станом та образом, з якого було створено контейнер.
Якщо ви виконуєте команду docker commit, різниця між двома версіями стає частиною нового образу — не оригінального, а нового, з якого ви можете створювати нові контейнери. Якщо видалити контейнер, різниця версій зникне.
Безструктурний контейнер — цікава сутність. Ви можете оновлювати контейнер, але серія оновлень створить серію нових образів контейнерів, тому в системі легко відкочуватися.
Портативність
Мабуть, це найважливіша перевага Docker над LXC. Docker більше відокремлює мережеві ресурси, сховища та деталі ОС, ніж LXC. З Docker програма дійсно не залежить від налаштувань цих низькорівневих ресурсів. Коли ви переміщаєте контейнер Docker від одного хоста Docker до іншої машини з Docker, Docker гарантує, що середовище для програми залишиться незмінним.
Пряма перевага цього підходу — це те, що Docker допомагає програмістам створювати локальні середовища розробки, які виглядають як продакшн-сервер. Коли програміст закінчує писати та починає тестувати код, він може обернути його в контейнер, опублікувати безпосередньо на сервері або в приватній хмарі, і він одразу буде працювати, оскільки це одне й те саме середовище.
З LXC програміст може запустити щось на машині, але виявити, що код працює неправильно при розгортанні на сервері. Середовище сервера буде інше, і програмісту доведеться витратити багато часу, щоб полагодити цю різницю і виправити проблему. З Docker цих проблем немає.
Архітектура, розроблена для програмістів
Відділення додатків від апаратного забезпечення, що лежить у їх основі, — фундаментальний концепт віртуалізації. Контейнери йдуть ще далі та відокремлюють додатки від ОС. Завдяки цій особливості програмісти набувають гнучкості та масштабування при розробці.
Джерело: стаття у виданні InfoWorld