VM чи Docker?

Як зрозуміти, що вам потрібен Docker, а чи не VM? Потрібно визначити, що ви хочете ізолювати. Якщо потрібно ізолювати систему з гарантовано виділеними ресурсами та віртуальним апаратним забезпеченням, тоді вибір повинен впасти на VM. При необхідності ізолювати працюючі програми як окремі процеси системи, вам знадобиться Docker.

То в чому ж відмінність Docker-контейнерів від VM?

Віртуальна машина (VM) — це віртуальний комп'ютер із усіма віртуальними пристроями та віртуальним жорстким диском, на який і встановлюється нова незалежна ОС разом із віртуальними драйверами пристроїв, керуванням пам'яттю та іншими компонентами. Т. е. ми отримуємо абстракцію фізичного обладнання, що дозволяє запускати на одному комп'ютері безліч віртуальних комп'ютерів.
Встановлена ​​VM може по-різному посідати місце на диску комп'ютера:

  • фіксоване місце на жорсткому диску, що дозволяє здійснювати швидший доступ до віртуального жорсткого диска та дозволяє уникнути фрагментації файлу;
  • динамічне виділення пам'яті. При установці додаткових програм пам'ять динамічно виділятиметься під них, поки не досягне максимального обсягу, відведеного їй.

Чим більше віртуальних машин на сервер, тим більше місця вони займають, а також вимагають постійної підтримки оточення, що потрібне для роботи вашої програми.

Docker - це програмне забезпечення для створення додатків на основі контейнерів. Контейнери та віртуальні машини мають схожі переваги, але працюють по-різному. Контейнери посідають менше місця, т.к. перевикористовують більше загальних ресурсів хост-системи ніж VM, т.к. на відміну від VM, забезпечує віртуалізацію лише на рівні ОС, а чи не апаратного забезпечення. Такий підхід забезпечує менший обсяг пам'яті, швидке розгортання і більш просте масштабування.

Контейнер дає ефективніший механізм інкапсуляції додатків, забезпечуючи необхідні інтерфейси хост-системи. Дана можливість дозволяє контейнерам розділити ядро ​​системи, де кожен із контейнерів працює як окремий процес основної ОС, який має свій власний набір областей пам'яті (власний віртуальний адресний простір). Так як віртуальний адресний простір кожного контейнера є власним, дані, що належать різним областям пам'яті, не можуть бути змінені.
Нативною ОС для Docker є Linux (Docker можна використовувати і на Windows, і на MacOS), він використовує її основні переваги, які дозволяють йому організувати поділ ядра. Запуск Docker-контейнерів на Windows відбуватиметься всередині віртуальної машини з операційною системою Linux, т.к. Контейнери поділяють ОС хост-системи і основною ОС для них є Linux.

Контейнер – як це працює?

контейнер - це абстракція на рівні програми, що поєднує код та залежності. Контейнери завжди створюються з образів, додаючи доступний для запису верхній шар та ініціалізує різні параметри. Оскільки контейнер має свій власний шар для запису і всі зміни зберігаються в цьому шарі, кілька контейнерів можуть спільно використовувати доступ до одного і того ж основного образу.

Кожен контейнер можна налаштувати через файл у проекті docker-compose, включеного до основного рішення – docker-compose.yml. Там можна встановити різні параметри такі як ім'я контейнера, порти, ідентифікатори, ліміти ресурсів, залежності між іншими контейнерами. Якщо в налаштуваннях не задавати ім'я контейнера, то Docker щоразу створюватиме новий контейнер, присвоюючи йому ім'я випадковим чином.

Коли контейнер запускається з образу, Docker монтує файлову систему для читання та запису поверх будь-яких шарів нижче. Саме тут будуть виконуватись усі процеси, які ми хочемо, щоб наш контейнер Docker виконував.

Коли Docker вперше запускає контейнер, початковий шар читання-запису порожній. Коли відбуваються зміни, вони використовуються до цього шару; наприклад, якщо ви хочете змінити файл, цей файл буде скопійовано з шару для читання нижче в шар для читання і запису.
Версія файлу, доступна тільки для читання, все ще існуватиме, але тепер вона прихована під копією. Для зберігання даних незалежно від життєвого циклу контейнера використовуються томи. Тому ініціалізуються при створенні контейнера.

Як образ пов'язаний із контейнером?

образ - Основний елемент для кожного контейнера. Образ створюється з Dockerfile, доданого в проект і являє собою набір файлових систем (шарів) нашарованих один на одного і згрупованих разом, доступних тільки для читання; максимальна кількість шарів дорівнює 127.

В основі кожного образу знаходиться базовий образ, який вказується командою FROM - вхідна точка для формування образу Dockerfile. Кожен шар є readonly-шаром і представлений однією командою, що модифікує файлову систему, записану в Dockerfile.
Для поєднання цих шарів в один образ Docker використовує Advanced multi layered Union file system (AuFS побудована на базі UnionFS), дозволяючи різним файлам та директоріям із різних файлових шарів прозоро накладатися, створюючи пов'язану файлову систему.

Шари містять метадані, що дозволяють зберігати супутню інформацію про кожен шар під час виконання та складання. Кожен шар містить посилання на наступний шар, якщо шар не має посилання, це найвищий шар в образі.

Dockerfile може містити такі команди, як:

  • FROM - вхідна точка для формування образу;
  • MAINTAINER - ім'я власника образу;
  • RUN - виконання команди в ході збирання образу;
  • ADD - копіювання файлу хоста в новий образ, якщо вказати URL-файлу, Docker завантажить його в задану директорію;
  • ENV - змінні середовища;
  • CMD – запускає створення нового контейнера на основі образу;
  • ENTRYPOINT — команда виконується під час запуску контейнера.
  • WORKDIR — робочий каталог виконання команди CMD.
  • USER – встановлює UID для створюваного на основі образу контейнера.
  • VOLUME - монтує директорію хоста в контейнер.
  • EXPOSE — набір портів, що прослуховуються в контейнері.

Як працює UnionFS?

UnionFS — службова стекова файлова система (ФС) для Linux та FreeBSD. Ця ФС реалізує механізм копіювання під час запису (Copy-On-Write, COW). Робочою одиницею UnionFS є шар, кожен шар слід як окрему повноцінну файлову систему з ієрархією директорій від самого кореня. UnionFS створює об'єднане монтування інших файлових систем і дозволяє прозоро для користувача об'єднувати файли і каталоги різних файлових систем (званих гілками) в єдину пов'язану файлову систему.

Вміст каталогів з однаковими шляхами відображатиметься разом в одному об'єднаному каталозі (в єдиному просторі імен) отриманої файлової системи.

UnionFS об'єднує шари, керуючись такими принципами:

  • один із шарів стає шаром верхнього рівня, другий і наступні – шарами нижнього рівня;
  • користувачеві об'єкти шарів доступні «згори донизу», тобто. якщо запитаний об'єкт є у верхньому шарі, повертається він, незалежно від наявності об'єкта з таким ім'ям в нижньому шарі; інакше повертається об'єкт нижнього шару; якщо запитаного об'єкта немає ні там, ні там, повертається помилка «Немає такого файлу чи каталогу»;
  • робочим шаром є «верхній», тобто всі дії користувача зміни даних відображаються тільки на шарі верхнього рівня, не впливаючи на вміст шарів нижніх рівнів.

Docker є найбільш поширеною технологією використання контейнерів у роботі програми. Він став стандартом у цій галузі, будуючись на основі cgroups та просторі імен, які забезпечує ядро ​​Linux.

Docker дозволяє нам швидко розгортати програми та максимально оптимально використовувати файлову систему за рахунок поділу ядра ОС між усіма контейнерами, працюючи як окремі процеси ОС.

Джерело: habr.com

Додати коментар або відгук