Вам бракує основних концепцій Докера. Це зовсім інша річ.
Перше, що вам потрібно знати, - це філософія Докера: запустіть один процес, ізольовані в контейнері. Ви не запускаєте ОС в контейнері 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 буде ще однією ключовою особливістю контейнера, який має конкретні мережеві інтерфейси для зв'язку з мостом докера тощо.
Так, так, головна мета всього цього - запустити додаток ізольовано, доставити його з вашого локального середовища в виробництво легко, всередині коробки з назвою контейнер.
Було б непогано прочитати документацію докера, перш ніж заглиблюватися в неї.