Я вижу, что многие образы Docker в репозитории Docker созданы на базе Ubuntu.
Что это значит? Содержит ли каждый контейнер урезанную версию ядра Linux?
Контейнеры располагаются поверх собственных ядер? Но я думал, что контейнеры используют общее ядро хоста (которым в некоторых случаях является boot2docker, пользовательский Tiny Core Linux build, а в других — что-то вроде CoreOS).
РЕДАКТИРОВАТЬ:Немного проясняю вопрос. Да, я знаю, что docker — это контейнер процесса, а не полноценная виртуальная машина. Но поскольку в официальном реестре docker hub и других ОС, таких как CentOS, есть контейнеры «Ubuntu», что значит запустить Ubuntu в контейнере?
Отвечать:Ах, меня только что осенило. Это процессы пользовательского пространства Ubuntu, содержащие apt-get и другие процессы конфигурации для конкретной сборки Ubuntu. Аналогично для CentOS. Docker — это не один процесс, а просто одна запись. Так что для этих дистрибутивов точкой входа является некий процесс init, который порождает другие процессы.
решение1
Docker использует ядро хостовой ОС, внутри контейнера нет пользовательского или дополнительного ядра. Все контейнеры, которые работают на машине, совместно используют это "хостовое" ядро.
Википедия говоритhttp://en.wikipedia.org/wiki/Docker_(программное обеспечение)что
Docker использует функции изоляции ресурсов ядра Linux, такие как контрольные группы и пространства имен ядра, чтобы позволить независимым «контейнерам» работать в одном экземпляре Linux, избегая накладных расходов на запуск виртуальных машин.
cgroups, пространства имен и LXC — это функции ядра Linux, позволяющие изолировать группы процессов; по-прежнему существует одно ядро, один планировщик и один экземпляр менеджера памяти ядра.
Boot2docker и CoreOS — это всего лишь облегченные дистрибутивы Linux с некоторым ядром хоста; их можно использовать для загрузки контейнеров Docker.
boot2docker — это легкий дистрибутив Linux на основе Tiny Core Linux, созданный специально для запуска контейнеров Docker. Он работает полностью из RAM, весит ~27 МБ и загружается за ~5 с (YMMV).
http://en.wikipedia.org/wiki/CoreOS
Один управляющий хост (экземпляр CoreOS) запускает несколько изолированных систем Linux (контейнеров), используя Docker в качестве дополнительного уровня абстракции и интерфейса[14] к базовым функциям виртуализации уровня операционной системы ядра Linux. ... Этот подход основан на функциональности cgroups ядра Linux, которая обеспечивает изоляцию пространства имен и возможности ограничивать, учитывать и изолировать использование ресурсов (ЦП, память, дисковый ввод-вывод и т. д.) для наборов процессов.
решение2
Почти во всех случаях ядро хостовой ОС является общим. Для запуска другого ядра необходимо использовать виртуализацию. Это встречается редко и используется только при необходимости из-за снижения производительности.
«Контейнер Docker Engine включает в себя только приложение и его зависимости. Он работает как изолированный процесс в пользовательском пространстве на хостовой операционной системе, разделяя ядро с другими контейнерами. Таким образом, он пользуется преимуществами изоляции и распределения ресурсов виртуальных машин, но при этом гораздо более портативен и эффективен».
Это может помочь объяснить, как это работает:
Источник:https://www.docker.com/whatisdocker/
решение3
Все контейнеры Docker используют ядро хоста.
Это также означало бы, что некоторая несовместимость между ядром хоста и дистрибутивом контейнера может вызвать проблемы. Теоретически. Например, если контейнеризированное программное обеспечение захочет использовать какую-то функцию ядра, которая не была скомпилирована в ядро хоста, то это не сработает.
Практика такова, что этого не происходит. Основной источник проблем контейнеров docker — это (часто необъяснимые) ограничения самого docker, а не какая-то несовместимость ядра хост-гость.
(P.S. Это потому, что практически все дистрибутивы Linux работают с любым ядром Linux.)