Введення в контейнери, віртуальні машини та docker, стаття в журналі «Молодий вчений»

віртуальні

Бібліографічний опис:

Це article discusses virtual machines and docker, їх architecture і distinctive capabilities.

Keywords: virtual machines, containers, docker, LXC, UnionFS

Що таке «контейнери» та «віртуальні машини»?

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

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

Основна відмінність між контейнерами та віртуальними машинами — у їхньому архітектурному підході.

Віртуальні машини

Віртуальна машина - програмна та/або апаратна система, що емулює апаратне забезпечення деякої цільової гостьової і виконує програми для гостьової платформи на платформі-господарі або віртуалізує деяку платформу і створює на ній середовища, що ізолюють один від одного програми і навіть операційні системи. Віртуальні машини запускають на фізичних машинах, використовуючи «гіпервізор».

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

введення

Мал. 1. Архітектура віртуальної машини

Віртуальну машину, що запускається на хості, також часто називають гостьовою машиною. Гостьова машина містить як додаток, так і все, що потрібно для його запуску (наприклад, системні файли та бібліотеки). Вона також несе весь апаратний стек, включаючи віртуальні мережеві адаптери, файлове сховище і центральний процесор, і свою власну повноцінну гостьову операційну систему. З внутрішньої сторони, гостьова машина веде себе як власний блок зі своїми власними виділеними ресурсами. Із зовнішнього боку, ми знаємо, що це віртуальна машина, яка використовує загальні ресурси, надані хостом.

Контейнери

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

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

введення

Мал. 2. Архітектура контейнера

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

Docker

Docker — програмне забезпечення для автоматизації розгортання та керування програмами в середовищі віртуалізації нарівні операційної системи, наприклад, LXC. Дозволяє «упакувати» додаток з усім його оточенням та залежностями у контейнер, який може бути перенесений на будь-яку Linux-систему з підтримкою cgroups у ядрі, а також надає середовище управління контейнерами.

Основні переваги Docker

  1. Простота використання. Заснована на контейнерах платформа docker дозволять легко портувати корисне навантаження. Docker контейнери можуть працювати як на реальній локальній машині або машині в датацентрі, так і на віртуальній машині у хмарі. Портованість та легковажна природа docker дозволяє легко динамічно керувати навантаженням. Можна використовувати docker, щоб розгорнути або погасити вашу програму або сервіси. Швидкість docker дозволяє це робити майже в режимі реального часу.
  2. Швидкість роботи. Docker-контейнери легковагі та швидкі. Можна створити та запустити Docker-контейнер за секунди, на відміну від віртуальних машин, які щоразу запускають повноцінну віртуальну ОС.
  3. Модульність тамасштабованість. Docker дозволяє легко розділяти функціональність програми окремі контейнери. Наприклад, можна запускати базу даних Postgres в одному контейнері, сховище Redis в іншому, в той час як Node.js знаходиться в третьому. Це дозволить легко масштабувати та оновлювати компоненти програми незалежно один від одного.

Архітектура Docker

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

Docker-демон

Як показано малюнку 3, демон запускається на хості. Користувач не взаємодіє із сервером безпосередньо, а використовує для цього Docker-клієнт.

Docker-клієнт

Docker-клієнт, програма docker – головний інтерфейс до Docker. Вона отримує команди від користувача та взаємодіє з docker-демоном.

контейнери

Мал. 3. Архітектура Docker

Щоб розуміти, з чого складається docker, потрібно знати про три його компоненти:

Образи

Docker-образ - це read-only шаблон. Наприклад, образ може містити операційну систему Ubuntu з веб-сервером Nginx та програмою на ній. Образи використовуються створення контейнерів. Docker дозволяє легко створювати нові образи та оновлювати існуючі.

Кожен образ складається із набору рівнів. Docker використовує UnionFile System поєднання цих рівнів в один образ. Union File System дозволяє файлам та директоріями з різних файлових систем (різним гілкам) прозоро накладатися, створюючи когерентну файлову систему.

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

В основі кожного образу є базовий образ. Наприклад, ubuntu, базовий образ Ubuntu або debian, базовий образ дистрибутива Debian.

Docker образи можуть створюватися з базових образів, кроки опису створення цих образів називаються «інструкціями». Кожна інструкція створює новий образ чи рівень. Інструкціями будуть наступні дії:

‒ додавання файлу або директорії;

‒ створення змінної оточення;

‒ вказівки, що запускати, коли запускається контейнер цього образу.

Ці інструкції зберігаються у файлі Dockerfile. Docker зчитує Dockerfile під час складання образу, виконує ці інструкції та повертає кінцевий образ.

Реєстр

Docker-реєстр зберігає образи. Існують громадські і приватні реєстри, у тому числі можна завантажити чи завантажити образи. Існує публічний Docker-реєстр з величезною колекцією контейнерів – Docker Hub.

Контейнери

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

Використовувані технології

Докер написаний мовою Go і використовує деякі можливості ядра Linux, щоб реалізувати наведений вище функціонал.

Простори імен

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

Існує кілька типів просторів імен, які використовує docker:

pid : для ізоляції процесу;

net : для керування мережевими інтерфейсами;

ipc : для управління IPC ресурсами;

mnt : для керування точками монтування;

utc : для ізолювання ядра та контролю генерації версій.

Контрольнігрупи

Docker також використовує технологію cgroups або контрольні групи. Ключ до роботи програми в ізоляції — надання додатку лише тих ресурсів, які потрібні для правильного функціонування. Це гарантує, що контейнери будуть добрими сусідами. Контрольні групи дозволяють розділяти доступні ресурси заліза і, якщо необхідно, встановлювати межі та обмеження. Наприклад, обмежити можливу кількість пам'яті контейнеру.

Файлова система UnionFS

Union File System або UnionFS — допоміжна файлова система для Linux та FreeBSD, що провадить каскадно-об'єднане монтування інших файлових систем. Це дозволяє файлам та каталогам ізольованих файлових систем, відомих як гілки, прозоро перекриватися, формуючи єдину пов'язану файлову систему. Каталоги, які мають той самий шлях в об'єднаних гілках, спільно відображатиме вміст в об'єднаному каталозі нової віртуальної файлової системи. Docker використовує UnionFS для створення блоків, із яких будується контейнер. Docker може використовувати кілька реалізацій UnionFS, включаючи AUFS, btrfs, vfs та DeviceMapper.