2014-12-08 7 views
11

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

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

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

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

ответ

0

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

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

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

+0

Так что конкретный материал для контейнера - это материал, реализованный через пространства имен ядер? Так как каждый контейнер имеет свое собственное пространство имен pid, собственное пространство имён mnt, собственное сетевое пространство имен .....? Все остальное делится с хостом? –

+0

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

+5

Docker не полагается на LXC по умолчанию с марта. – icecrime

14

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

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

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

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

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

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

+0

Спасибо, это очень полезно. Я был очень смущен тем, что является образом и как оно относится к ОС хоста. Документы на веб-сайте, похоже, не очень хорошо объясняют это, но ваш ответ здесь. –