Докер не є методологією віртуалізації. Він спирається на інші інструменти, які реально реалізують віртуалізацію на основі контейнерів або віртуалізацію на рівні операційної системи. Для цього Докер спочатку використовував драйвер LXC, потім перейшов до libcontainer, який тепер перейменований у runc. Docker в основному зосереджується на автоматизації розгортання додатків всередині контейнерів додатків. Контейнери прикладних програм призначені для упаковки та запуску однієї послуги, тоді як системні контейнери призначені для запуску декількох процесів, як віртуальні машини. Отже, Docker розглядається як інструмент управління контейнерами або інструмент розгортання додатків у контейнерних системах.
Для того, щоб знати, чим він відрізняється від інших віртуалізацій, перейдемо до віртуалізації та її видів. Тоді було б простіше зрозуміти, в чому різниця.
Віртуалізація
У своєму задуманому вигляді він вважався методом логічного поділу мейнфреймів, щоб дозволити запуск декількох додатків одночасно. Однак сценарій кардинально змінився, коли компанії та спільноти з відкритим кодом змогли запропонувати метод обробки привілейованих інструкцій тим чи іншим чином і дозволяють одночасно працювати декількома операційними системами в одній системі на базі x86.
Гіпервізор
Гіпервізор обробляє створення віртуального середовища, в якому працюють гостьові віртуальні машини. Він здійснює нагляд за гостьовими системами та забезпечує необхідність розподілу ресурсів для гостей. Гіпервізор розташовується між фізичною машиною та віртуальною машиною і надає послуги з віртуалізації віртуальним машинам. Щоб усвідомити це, він перехоплює операції гостьової операційної системи на віртуальних машинах та імітує операцію в операційній системі хост-машини.
Швидкий розвиток технологій віртуалізації, насамперед у хмарних умовах, сприяв подальшому використанню віртуалізації, дозволяючи створювати на одному фізичному сервері кілька віртуальних серверів за допомогою гіпервізорів, таких як Xen, VMware Player, KVM тощо, і включення апаратної підтримки в товарних процесорах, таких як Intel VT і AMD-V.
Види віртуалізації
Метод віртуалізації можна класифікувати на основі того, як він імітує апаратне забезпечення гостьової операційної системи та імітує гостьове операційне середовище. Перш за все, існує три типи віртуалізації:
- Емуляція
- Паравіртуалізація
- Віртуалізація на основі контейнерів
Емуляція
Емуляція, також відома як повна віртуалізація, запускає ядро ОС віртуальної машини повністю в програмному забезпеченні. Гіпервізор, що використовується в цьому типі, відомий як гіпервізор 2 типу. Він встановлений у верхній частині операційної системи хоста, яка відповідає за переклад коду ядра гостьової ОС в інструкції з програмного забезпечення. Переклад повністю виконується програмним забезпеченням і не потребує апаратного залучення. Емуляція дозволяє запускати будь-яку не модифіковану операційну систему, яка підтримує емуляцію середовища. Мінусом цього типу віртуалізації є додатковий накладний ресурс системи, що призводить до зниження продуктивності порівняно з іншими видами віртуалізації.
Приклади цієї категорії включають програвач VMware Player, VirtualBox, QEMU, Bochs, Parallels тощо.
Паравіртуалізація
Паравіртуалізація, також відома як гіпервізор типу 1, працює безпосередньо на апаратному забезпеченні, або «голому металі», і надає послуги з віртуалізації безпосередньо віртуальним машинам, що працюють на ньому. Це допомагає операційній системі, віртуалізованому апаратному забезпеченню та реальним обладнанням співпрацювати для досягнення оптимальної продуктивності. Ці гіпервізори, як правило, мають досить невеликий слід і самі не потребують великих ресурсів.
Приклади цієї категорії включають Xen, KVM тощо.
Віртуалізація на основі контейнерів
Віртуалізація на основі контейнерів, також відома як віртуалізація на рівні операційної системи, дозволяє робити кілька ізольованих виконань в одному ядрі операційної системи. Він має найкращі можливі показники та щільність та має динамічне управління ресурсами. Ізольоване середовище віртуального виконання, що надається цим типом віртуалізації, називається контейнером і може розглядатися як простежена група процесів.
Поняття контейнера стає можливим завдяки функції просторів імен, доданої до ядра Linux версії 2.6.24. Контейнер додає свій ідентифікатор до кожного процесу та додає нові перевірки контролю доступу до кожного системного виклику. Доступ до нього здійснюється за допомогою системного виклику clone (), який дозволяє створювати окремі екземпляри раніше глобальних просторів імен.
Простори імен можна використовувати різними способами, але найпоширенішим підходом є створення ізольованого контейнера, який не має видимості або доступу до об'єктів поза контейнером. Процеси, запущені всередині контейнера, здається, працюють у звичайній системі Linux, хоча вони діляться базовим ядром з процесами, розташованими в інших просторах імен, однаково для інших типів об'єктів. Наприклад, при використанні просторів імен користувач root всередині контейнера не трактується як корінь поза контейнером, додаючи додатковий захист.
Підсистема управління групами Linux (cgroups) - наступний головний компонент, що забезпечує можливість віртуалізації на основі контейнерів, використовується для групування процесів та управління їх сукупним споживанням ресурсів. Він зазвичай використовується для обмеження обсягу споживання пам'яті та процесора. Оскільки в контейнерній системі Linux є лише одне ядро, а ядро має повну видимість у контейнерах, існує лише один рівень розподілу та планування ресурсів.
Для контейнерів Linux доступні кілька інструментів управління, зокрема LXC, LXD, systemd-nspawn, lmctfy, Warden, Linux-VServer, OpenVZ, Docker тощо.
Контейнери проти віртуальних машин
На відміну від віртуальної машини, контейнеру не потрібно завантажувати ядро операційної системи, тому контейнери можна створити менше ніж за секунду. Ця функція робить віртуалізацію на основі контейнерів унікальною та бажаною, ніж інші підходи до віртуалізації.
Оскільки віртуалізація на основі контейнерів додає невеликі накладні витрати на хост-машину, віртуалізація на основі контейнерів має майже нативну ефективність
Для віртуалізації на основі контейнерів додаткове програмне забезпечення не потрібно, на відміну від інших віртуалізацій.
Усі контейнери на хост-машині діляться планувальником хост-машини, економлячи потребу в додаткових ресурсах.
Стани контейнерів (зображення Докера або LXC) мають невеликі розміри порівняно з зображеннями віртуальної машини, тому зображення контейнерів легко поширювати.
Управління ресурсами в контейнерах здійснюється за допомогою груп. Cgroups не дозволяє контейнерам споживати більше ресурсів, ніж їм виділено. Однак, на сьогодні всі ресурси хост-машини видно у віртуальних машинах, але їх не можна використовувати. Це можна реалізувати одночасно за допомогою запуску top
або htop
на контейнерах та хост-машинах. Вихід у всіх середовищах буде схожим.
Оновлення:
Як Docker запускає контейнери в нелінукс-системи?
Якщо контейнери можливі через функції, доступні в ядрі Linux, очевидним питанням є те, як нелінукс системи запускають контейнери. І Docker для Mac і Windows використовують для управління контейнерами VM для Linux. Docker Toolbox використовується для запуску контейнерів у віртуальних віртуальних колах. Але останній Docker використовує Hyper-V в Windows та Hypervisor.framework в Mac.
Тепер дозвольте мені описати, як Docker для Mac детально запускає контейнери.
Docker для Mac використовує https://github.com/moby/hyperkit для імітації можливостей гіпервізора, а Hyperkit використовує гіпервізор.framework у своїй основі. Hypervisor.framework - це рідне рішення для гіпервізорів Mac. Hyperkit також використовує VPNKit та DataKit для мережі імен та файлової системи відповідно.
Linux VM, який Docker працює на Mac, доступний лише для читання. Однак ви можете врізатися в нього, запустивши:
screen ~/Library/Containers/com.docker.docker/Data/vms/0/tty
.
Тепер ми навіть можемо перевірити версію Kernel цього VM:
# uname -a
Linux linuxkit-025000000001 4.9.93-linuxkit-aufs #1 SMP Wed Jun 6 16:86_64 Linux
.
Всі контейнери працюють всередині цього віртуального комп'ютера.
Існують деякі обмеження щодо hipervisor.framework. Через це Docker не відкриває docker0
мережевий інтерфейс у Mac. Отже, ви не можете отримати доступ до контейнерів від хоста. На сьогоднішній день docker0
доступний лише всередині VM.
Hyper-v - це рідний гіпервізор у Windows. Вони також намагаються використати можливості Windows 10 для запуску Linux систем.