Контейнер для докерів ОС: у чому тоді різниця з VM?


10

Який сенс використання ОС в докер-контейнері?

У сховищі докерів ви знайдете зображення докера Ubuntu: https://registry.hub.docker.com/_/ubuntu/ Я подумав, що Докер більше на рівні програми.

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

Дякую

Відповіді:


11

Вам бракує основних концепцій Докера. Це зовсім інша річ.

Перше, що вам потрібно знати, - це філософія Докера: запустіть один процес, ізольовані в контейнері. Ви не запускаєте ОС в контейнері Docker, ви запускаєте процес всередині контейнера із вмістом кореневої файлової системи, заснованої на вашому виборі дистрибутива Linux. Ubuntu - вибір серед інших.

Тепер вам слід задуматися, як можливо отримати процес запуску всередині базового зображення Linux, відмінного від дистрибутива Linux, з яким працює ваш хост. Для роботи ОС вам потрібно:

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

Docker використовує UnionFS для управління шарами дискових блоків всередині контейнера, щоб ви могли їх складати.

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

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

Останнє, чого зараз бракує, це: як ви запускаєте цю річ ізольовано?

Відповідь: простори імен. Я не буду вникати в деталі тут, тому що це трохи відхилиться від початкового питання. Але що вам потрібно знати, це те, що з ядра 2.4.19 протягом багатьох років з'являлися простори імен різного типу. Наразі доступні такі простори імен:

  • IPC: простір імен IPC (міжпроцесовий зв'язок)
  • MNT: простір імен
  • NET: мережевий простір імен
  • PID: простір імен
  • USER: простір імен користувачів (uid)
  • UTS: простір імен UTS (імена хостів)

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

Так, так, головна мета всього цього - запустити додаток ізольовано, доставити його з вашого локального середовища в виробництво легко, всередині коробки з назвою контейнер.

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


Дякую, чи означає це, що зображення "Ubuntu" на зразок цього: register.hub.docker.com/_/ubuntu сам по собі "не має сенсу" і слугує базою для більш визначеного контейнера, наприклад "контейнера nginx"? Я не знаю, чи є сенс?
Майкл

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

Я переглянув документацію, і є одне, в чому я не впевнений. Скажімо, розмір зображення ubuntu становить 140 Мбіт. Потім ще одне зображення на основі цього зображення додає ще 10 Мб. Якщо я запускаю 2 контейнери з цього зображення, чи буде кожен контейнер 150Mb, і мені потрібно 300Mb дискового простору АБО загальний розмір залишиться 150Mb? Спасибі
Майкл

Нічого, я тільки що завантажив офіційне зображення пітона і віртуальний розмір - 802,4 Мб. Завантаження пройшло певний час. Якщо я запускаю з нього 10 контейнерів, скільки місця займають контейнери? Спасибі
Майклу

2
@YAmikep Деякі зображення можуть бути великими через залежності, які не очищені належним чином. Якщо ви запустите 10 контейнерів з тим самим зображенням, це не означає, що використаний простір на диску буде в 10 разів більшим за розмір зображення. Ви завантажуєте зображення один раз, але запускаєте його з декількох контейнерів. Докер використовує функцію копіювання під час запису декількох контейнерів з одного зображення, що в основному означає, що він поділить зображення між контейнерами та створить приватну копію файлу всередині зображення, лише якщо контейнер додає / модифікує його. Таким чином, фактичний розмір, який використовується, пов'язаний з активністю всередині контейнерів, а не з кількістю запусків.
Ксав'є Лукас
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.