Вам не хватает основных концепций Docker. Это совершенно другая вещь.
Первое, что вам нужно знать, это философия Докера: запустить один процесс, изолированный в контейнере. Вы не будете запускать ОС в контейнере Docker, вы будете запускать процесс внутри контейнера с содержимым корневой файловой системы на основе выбранного вами дистрибутива Linux. Ubuntu - это выбор среди других.
Теперь вы должны задаться вопросом, как можно получить запуск процесса внутри базового образа Linux, отличного от дистрибутива Linux, с которым работает ваш хост. Для запуска ОС вам в основном необходимо:
- Загрузочная файловая система: содержит загрузчик и ядро, которое будет находиться в памяти после загрузки. Мы не заботимся об этом в случае контейнеров Docker, потому что ядро используется совместно с хостом и является общей частью всех дистрибутивов Linux.
- Корневая файловая система: содержит структуру файловой системы. Это может отличаться от одного дистрибутива Linux к другому. Это только для чтения, пока последовательность загрузки не закончилась.
Docker использует UnionFS для управления слоями дисковых блоков внутри контейнера, чтобы вы могли их складывать.
За кулисами используется монтированное объединение, которое позволяет монтировать несколько файловых систем одновременно, выглядя как виртуальная. Фактически он отбрасывает слой базового изображения как режим чтения-записи поверх базовой корневой файловой системы в режиме только для чтения.
Здесь у вас есть куча дисковых блоков, наслоенных таким образом, что дистрибутив linux, из которого исходит базовый образ, будет содержать ту же файловую систему, однажды установленную на реальном хосте, но на этот раз внутри контейнера.
Последнее, чего сейчас не хватает: как вы управляете этой вещью изолированно?
Ответ: пространства имен. Я не буду вдаваться в подробности, потому что это немного отклонится от первоначального вопроса. Но что вам нужно знать, так это то, что начиная с ядра 2.4.19, пространства имен разных типов появлялись годами. В настоящее время доступны следующие пространства имен:
- IPC: пространство имен IPC (межпроцессное взаимодействие)
- MNT: смонтировать пространство имен
- NET: пространство имен сети
- PID: пространство имен pid
- ПОЛЬЗОВАТЕЛЬ: пространство имен пользователя (uid)
- UTS: пространство имен UTS (имена хостов)
Пространства имен - это изолированные структуры внутри ядра, которые позволяют процессам работать в определенной среде. Например, пространство имен MNT будет ключевой функцией для запуска процесса с учетом специфики корневой файловой системы базового образа. Пространство имен NET станет еще одной ключевой функцией для контейнера, имеющего определенные сетевые интерфейсы для связи с док-мостом и т. Д.
Так что, да, основная цель всего этого - запустить изолированное приложение, легко доставить его из локальной среды в рабочую среду с помощью контейнера, называемого контейнером.
Было бы неплохо прочитать документацию докера, прежде чем углубляться в нее.