У контейнерів Docker є власне ядро ​​чи ні?


65

Я бачу, що багато докерських зображень у сховищі докерів зроблено з базою Ubuntu.

Що це означає? Чи кожен контейнер в'яже зрізану версію ядра Linux?

Чи контейнери сидять поверх власних ядер? Але я подумав, що контейнери поділяють ядро ​​хоста (що в деяких випадках - boot2docker, власна збірка Tiny Core Linux, а в інших щось на зразок CoreOS).

EDIT: Трохи уточнити питання. Так, я знаю, що докер - це процесний контейнер, а не повний VM. Але оскільки є офіційні контейнери "Ubuntu" в офіційному реєстрі концентраторів докер та інших ОС, таких як CentOS, що означає запускати Ubuntu в контейнері?

Відповідь: Ах, це просто зоріло на мені. Це наземні процеси Ubuntu користувача, що містять apt-get та інші процеси конфігурації для певної збірки Ubuntu. Аналогічно для CentOS. Докер - це не один процес, а лише один запис. Тож для цих розподілів точка входу - це якийсь процес init, який породжує інші процеси.


2
"Це наземні процеси Ubuntu користувача", - не тільки процеси, але і бібліотеки.
osgx

Відповіді:


37

Docker використовує ядро ​​ОС хоста, всередині контейнера немає спеціального або додаткового ядра. Усі контейнери, які працюють на машині, мають спільне використання цього "хостового" ядра.

Вікіпедія говорить, що http://en.wikipedia.org/wiki/Docker_(software) це

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

cgroups, простори імен та LXC - це особливості ядра Linux для виділення груп процесів; Є ще одне ядро, один планувальник і один екземпляр менеджера пам'яті ядра.

Boot2docker і CoreOS - це просто легкі дистрибутиви Linux з деяким хост-ядром; їх можна використовувати для завантаження контейнерів Docker.

http://boot2docker.io/

boot2docker - це легкий дистрибутив Linux, заснований на Tiny Core Linux, створений спеціально для запуску контейнерів Docker. Він працює повністю від оперативної пам’яті, важить ~ 27 Мб і завантажується в ~ 5 с (YMMV).

http://en.wikipedia.org/wiki/CoreOS

Один хост управління (екземпляр CoreOS) запускає кілька ізольованих систем Linux (контейнерів), використовуючи Docker як додатковий рівень абстракції та інтерфейс [14] для основних функцій віртуалізації операційного рівня ядра Linux. ... Цей підхід спирається на функціонал груп ядер Linux, який забезпечує ізоляцію простору імен та можливість обмеження, обліку та ізоляції використання ресурсів (процесор, пам'ять, введення / виведення диска тощо) для колекцій процесів.


1
Це не відповідає на запитання.
EML

2
EML, яке питання? За замовчуванням усі контейнери Docker не мають власних ядер. Для всіх контейнерів Docker є лише одне ядро ​​хоста.
osgx

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

2
EML, після публікації моєї відповіді запитання було відредаговано "Уточнювальним" ( superuser.com/posts/889472/reitions ), тож це відповідь на оригінальне запитання без уточнення. Якщо у вас є якась інформація, яку потрібно поділитись базовими зображеннями та ядрами в докер, додайте іншу відповідь.
osgx

17

Майже у всіх випадках ядро ​​хост ОС є спільним. Для запуску іншого ядра потрібно використовувати віртуалізацію. Це рідко і застосовується лише в разі необхідності через зниження продуктивності.

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

Це може допомогти пояснити, як це працює: введіть тут опис зображення

Джерело: https://www.docker.com/whatisdocker/


4
Будь-яке джерело для "Пакетів може використовувати різні ядра" ??? Сам Docker не може використовувати декілька ядер, завжди є лише одне хост-ядро. Тільки в поєднанні з гіпервізором (віртуалізація) ми можемо запустити кілька хостів кожен із власною версією ядра та запустити один докер на віртуальний хост; але для будь-якого хоста буде лише одне ядро ​​для хоста та його докованих контейнерів)
osgx

2
Що таке пакет? Докер-контейнер не має ядра всередині нього; він тільки що встановлений і запущений на ядрі, яке використовується на хості. Отже: один Docker = один сервер = одне ядро, як показано на малюнку. Не можна використовувати два ядра з одним двигуном Docker; всі контейнери всередині цього двигуна будуть використовувати одне ядро. Я думаю, що правильна відповідь - «Ні, контейнери Docker не можуть використовувати різні ядра в одному екземплярі Docker Engine»
osgx

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

1
JeremiahBarrar, Зрозумів, дякую за пояснення. Чи зафіксовано програмне забезпечення для віртуалізації зсередини контейнера Docker і чи підтримується воно Docker? Яка віртуалізація працюватиме від Docker (програмне забезпечення qemu, qemu + kvm, xen, ...)?
osgx

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