Что внутри изображения/контейнера Docker?

Учитывая тот факт, что изображения/контейнеры докеров встречаются в разных вариантах - Ubuntu, CentOS, CoreOS и т.д. Мне любопытно, что на самом деле составляет изображение/контейнер, и что общего с операционной системой хоста? Где разделительная линия?

Например, я могу загрузить базовое изображение Ubuntu и запустить его на хосте CentOS. Затем, когда я курю внутри контейнера Ubuntu, я вижу, что он выглядит и выглядит как сервер Ubuntu (расположение файловой системы и т.д.). Но если я запустил команду uname, я вижу ядро ​​и подобные хосту CentOS....

Очевидно, я понимаю, что основное ядро ​​разделяется всеми контейнерами на одном хосте. Но что еще используется совместно с ОС хоста и что является частью образа/контейнера?

например. ядро является частью хоста, макет файловой системы является частью образа/контейнера. Существует ли спецификация, которая определяет это?

Ответ 1

Docker - это оболочка над LXC Контейнеры для Linux и документация для этого позволят вам подробно узнать, что общего, а что нет,

В общем, хост-машина видит/содержит все внутри контейнеров от файловой системы до процессов и т.д. Вы можете выпустить команду ps на хосте vm и просмотреть процессы внутри контейнера.

Помните, что контейнеры докеров не являются виртуальными машинами, поэтому все на самом деле выполняется на хосте и напрямую использует ядро ​​хоста. Каждый контейнер имеет собственное пространство имен пользователей (похожее на корневые тюрьмы старого). Существуют инструменты/функции, которые гарантируют, что контейнеры будут видеть только их собственные процессы, имеют ли они файловую систему, размещенную в файловой системе хоста, и сетевой стек, который подключается к сетевому стеку хоста.

Ответ 2

Может быть полезно различать изображения и контейнеры (docs). Изображение статично и живет только на диске. Контейнер представляет собой исполняемый экземпляр изображения и включает в себя его собственное дерево процессов, а также оперативную память и другие ресурсы времени выполнения.

Изображение представляет собой логическую группировку слоев плюс метаданные о том, что делать при создании контейнера и о том, как собрать слои. Часть этих метаданных состоит в том, что каждый уровень знает свой родительский идентификатор.

Итак, что входит в слой? Файлы (и каталоги), которые вы добавили к родительскому элементу. Существуют также специальные файлы ( "whiteout" ), которые указывают, что что-то было удалено из родителя.

Когда вы docker run изображение, docker создает контейнер: он распаковывает все слои в правильном порядке, создавая новую "корневую" файловую систему отдельно от хоста. docker также считывает метаданные изображения и запускает либо "точку входа", либо "команду", указанную при создании изображения, - которая запускает новое дерево процессов. Изнутри контейнера этот первый процесс выглядит как корень дерева, но из хоста вы видите, что это поддерево процессов.

Корневая файловая система - это то, что делает один дистрибутив Linux отличным от другого (могут быть и некоторые различия в модуле ядра, а также различия в загрузчике/загрузке файловой системы, но они обычно невидимы для запущенных процессов). Ядро делится с хостом и фактически сохраняет свои обычные обязанности внутри контейнера. Но корневая файловая система отличается, и поэтому, когда вы находитесь внутри контейнера, она выглядит и выглядит так, как любой дистрибутив был в изображении Docker.

Контейнер имеет не только собственную файловую систему и дерево процессов, но также имеет свой собственный логический сетевой интерфейс и, необязательно, собственное выделение ОЗУ и процессорного времени. Вы управляете контейнером, хотя, как оператор, поэтому можете принять решение об обмене сетевым интерфейсом хоста с контейнером, предоставить ему неограниченный доступ к ОЗУ и ЦП и даже подключить устройства, файлы и каталоги от хоста в контейнер. Значение по умолчанию заключается в том, чтобы держать вещи в отдельности, но у вас есть возможность разбить модель изоляции так, как вам нужно.