Чому ми використовуємо базове зображення ОС з Docker, якщо в контейнерах немає гостьової ОС?


83

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

Я також читав, що в контейнері не встановлена ​​гостьова ОС. Натомість він покладається на базове ядро ​​ОС.

Все це добре. Мене бентежить те, що є зображення Докера, названі на честь операційних систем. Ми бачимо зображення на зразок Ubuntu, Debian, Fedora, CentOS тощо.

Моя думка: які насправді ті образи? Чим відрізняється створення контейнера на основі зображення Debian, ніж створення віртуальної машини та встановлення Debian?

Я думав, що в контейнерах не встановлена ​​гостьова ОС, але коли ми створюємо зображення, ми базуємо їх на якомусь зображенні, названому на одній ОС.

Крім того, у прикладах, які я бачив, коли ми це робимо docker run ubuntu echo "hello world", здається, ми запускаємо VM з Ubuntu і змушуємо його запускати команду echo "hello world".

Таким же чином, коли ми це робимо docker run -it ubuntu /bin/bash, здається, що ми закручуємо VM з Ubuntu і отримуємо доступ до нього за допомогою командного рядка.

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

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


2
На мою думку, ваші цілі у віртуалізації є ключовими. Якщо вам потрібні бібліотеки, мови тощо для ОС, то контейнери ОС підходять для ваших потреб. Але якщо вашою потребою є лише додаток у якості компонентів, не потрібно використовувати ОС як базове зображення. Я думаю, що ця стаття могла б це чітко пояснити blog.risingstack.com/…
metamorph

Відповіді:


68

Оскільки всі дистрибутиви Linux працюють однаково (так, це трохи спрощено) ядро ​​Linux і відрізняються лише програмним забезпеченням користувача, досить просто моделювати інше середовище розповсюдження - просто встановивши це програмне забезпечення користувача та зробивши вигляд, що це інший дистрибутив. Якщо конкретно встановити контейнер CentOS всередині Ubuntu OS, це означає, що ви отримаєте поле користувача від CentOS, продовжуючи виконувати те саме ядро, навіть не інший екземпляр ядра.

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

Якщо це буде простіше, ви можете подумати, що докер - це дуже складне та розвинене середовище chroot.


3
Отже, тому я можу розмістити зібраний голанг-код у порожньому контейнері Scratch - адже для компільованого коду потрібне лише ядро?
Френсіс Нортон

То як же гостьова ОС знає використовувати ядро ​​хост ОС (і як це зробити)? AFAIK, бази зображень докера використовують стандартні зображення ОС. У вашому прикладі це не так, як є власна збірка CentOS, яка знає використовувати ядро ​​батьків? Або це так просто, як хитрість файлової системи (aufs), коли Докер перенаправляє гостей (CentOS ') читання / завантаження до хоста (Ubuntu)? У такому випадку гість (CentOS) встановив би власну копію / boot, але її просто ніколи не прочитають?
James S

Мені подобається ваше пояснення, але як ви потім пояснюєте запуску Linux-контейнерів у Windows? Чи містять сервер 2016 та Windows 10 ядро ​​Linux, щоб дозволити використання Docker? Це тому ці версії необхідні?
duct_tape_coder

Це просто: вони просто працюють під повноцінним стеком віртуалізації Hyper-V, усередині рідного Linux VM: docs.microsoft.com/en-us/virtualization/windowscontainers/… .
drookie

1

Контейнери працюють на одному ядрі. Іншими словами, всі контейнери мають одне ядро ​​(Host OS). Тоді як гіпервізори з іншого боку мають кілька ядер. Кожна віртуальна машина працює на різних ядрах.

І "docker run ubuntu" - це як створити середовище chroot.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.