Назад | Перейти на главную страницу

Докер-контейнер ОС: в чем тогда разница с виртуальной машиной?

В чем смысл использования ОС в контейнере докеров?

В репозитории докеров вы найдете образ докера Ubuntu: https://registry.hub.docker.com/_/ubuntu/ Я думал, что Docker больше на уровне «приложений».

В чем же тогда разница между докер-контейнером Ubuntu и виртуальной машиной Ubuntu? Если у вас есть вся ОС в контейнере докера, разве тогда не бессмысленно использовать Docker?

Спасибо

Вам не хватает базовых концепций 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 будет еще одной ключевой особенностью контейнера, который будет иметь определенные сетевые интерфейсы для связи с мостом докеров и т. Д.

Итак, да, основная цель всего этого - запустить изолированное приложение, легко отправить его из вашей локальной среды в производственную среду с помощью контейнера, который называется контейнером.

Было бы неплохо прочитать документация докера прежде чем копаться дальше.