Контейнер Docker: какая разница с виртуальной машиной?

10

Какой смысл использовать ОС в Docker-контейнере?

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

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

Спасибо

Майкл
источник

Ответы:

11

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

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

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

Ксавье Лукас
источник
Спасибо, означает ли это, что изображение «Ubuntu», подобное этому: registry.hub.docker.com/_/ubuntu , само по себе «не имеет смысла» и служит основой для более определенного контейнера, такого как «контейнер nginx»? Я не знаю, есть ли смысл?
Майкл
Да, вы делаете. Это именно то, для чего он используется. И обычно вы услышите, что люди называют их базовыми изображениями по этой причине.
Ксавье Лукас
Я просмотрел документацию, и есть одна вещь, в которой я не уверен. Допустим, размер образа Ubuntu составляет 140 МБ. Затем другое изображение на основе этого изображения добавляет еще 10 Мб. Если я запускаю 2 контейнера из этого образа, будет ли каждый контейнер по 150 МБ, а мне нужно 300 МБ дискового пространства ИЛИ общий размер останется 150 МБ? Спасибо
Майкл
Вау, я только что загрузил официальный образ Python, а виртуальный размер составляет 802,4 МБ. Потребовалось время, чтобы загрузить. Если я запускаю 10 контейнеров из него, сколько места будут занимать контейнеры? Спасибо
Майкл
2
@YAmikep Некоторые изображения могут быть большими из-за неправильной очистки зависимостей. Если вы запускаете 10 контейнеров с одним и тем же изображением, это не означает, что используемое дисковое пространство будет в 10 раз больше размера изображения. Вы загружаете изображение один раз, но запускаете его из нескольких контейнеров. Docker использует функцию копирования при записи при запуске нескольких контейнеров из одного изображения, что в основном означает, что он будет совместно использовать изображение между контейнерами и создавать личную копию файла внутри изображения только в том случае, если контейнер добавляет / изменяет его. Таким образом, фактический используемый размер связан с активностью внутри контейнеров, а не с тем, сколько прогонов.
Ксавье Лукас