Это может быть полезно провести различие между изображениями и контейнеров (docs). image является статическим и живет только на диске. A контейнер - это работающий экземпляр изображения и включает в себя его собственное дерево процессов, а также оперативную память и другие ресурсы времени исполнения.
image - это логическая группировка слоев плюс метаданные о том, что делать при создании контейнера и способах сборки слоев. Часть этих метаданных состоит в том, что каждый слой знает идентификатор своего родителя.
Итак, что входит в слой? Файлы (и каталоги), которые вы добавили к родительскому элементу. Существуют также специальные файлы («whiteout»), которые указывают, что что-то было удалено из родителя.
При создании docker run
изображения, docker
создает контейнер: он распаковывает все слои в правильном порядке, создавая новую «корневую» файловую систему отдельно от хоста. docker
также считывает метаданные изображения и запускает либо «точку входа», либо «команду», указанную при создании изображения, - которая запускает новое дерево процесса. Изнутри контейнера этот первый процесс выглядит как корень дерева, но из хоста вы видите, что это поддерево процессов.
Корневая файловая система - это то, что делает один дистрибутив Linux отличным от другого (могут быть и различия в модуле ядра, а также различия в загрузчике/загрузке файловой системы, но они обычно невидимы для запущенных процессов). Ядро делится с хостом и фактически сохраняет свои обычные обязанности внутри контейнера.Но корневая файловая система отличается, и поэтому, когда вы находитесь внутри контейнера, она выглядит и выглядит так, как любой дистрибутив был в изображении Docker.
Контейнер имеет не только собственную файловую систему и дерево процессов, но также имеет собственный логический сетевой интерфейс и, необязательно, собственное распределение ОЗУ и процессорного времени. Вы управляете контейнером, хотя, как оператор, поэтому можете принять решение об обмене сетевым интерфейсом хоста с контейнером, предоставить ему неограниченный доступ к ОЗУ и ЦП и даже подключить устройства, файлы и каталоги от хоста в контейнер. Значение по умолчанию заключается в том, чтобы держать вещи раздельными, но у вас есть возможность разбить модель изоляции столько, сколько вам нужно.
Так что конкретный материал для контейнера - это материал, реализованный через пространства имен ядер? Так как каждый контейнер имеет свое собственное пространство имен pid, собственное пространство имён mnt, собственное сетевое пространство имен .....? Все остальное делится с хостом? –
Точно, есть несколько способов tweek контейнер, где вы можете напрямую использовать хост-стек, но не все его пространства имен. –
Docker не полагается на LXC по умолчанию с марта. – icecrime