Контейнеры Docker имеют собственное ядро ​​или нет?


66

Я вижу, что многие образы докеров в хранилище докеров создаются на основе Ubuntu.

Что это обозначает? Каждый контейнер связывает урезанную версию ядра Linux?

Контейнеры сидят поверх своих собственных ядер? Но я думал, что контейнеры разделяют ядро ​​хоста (в некоторых случаях это boot2docker, пользовательская сборка Tiny Core Linux, а в других что-то вроде CoreOS).

РЕДАКТИРОВАТЬ: Уточнение вопроса немного. Да, я знаю, что Docker - это контейнер процессов, а не полная виртуальная машина. Но поскольку в официальном реестре узлов докеров и других операционных систем, таких как CentOS, есть контейнеры «Ubuntu», что означает запуск Ubuntu в контейнере?

Ответ: Ааа, меня осенило. Это пользовательские процессы Ubuntu, содержащие apt-get и другие процессы конфигурации для конкретной сборки Ubuntu. Аналогично для CentOS. Docker - это не отдельный процесс, а одна запись. Таким образом, для этих распределений точка входа является своего рода процессом инициализации, который порождает другие процессы.


2
«Это пользовательские процессы в Ubuntu», - не только процессы, но и библиотеки.
osgx

Ответы:


38

Docker использует ядро ​​операционной системы, в контейнере нет собственного или дополнительного ядра. Все контейнеры, которые запускаются на машине, совместно используют это «главное» ядро.

Википедия говорит, что http://en.wikipedia.org/wiki/Docker_(software) что

Docker использует функции изоляции ресурсов ядра Linux, такие как cgroups и пространства имен ядра, чтобы позволить независимым «контейнерам» работать в пределах одного экземпляра Linux, избегая накладных расходов при запуске виртуальных машин.

cgroups, пространства имен и LXC - это функции ядра Linux для изоляции групп процессов; есть еще одно ядро, один планировщик и один экземпляр менеджера памяти ядра.

Boot2docker и CoreOS - это просто облегченные дистрибутивы Linux с некоторым ядром хоста; их можно использовать для загрузки контейнеров Docker.

http://boot2docker.io/

boot2docker - это легкий дистрибутив Linux, основанный на Tiny Core Linux, созданный специально для запуска контейнеров Docker. Он работает полностью из оперативной памяти, весит ~ 27 МБ и загружается за ~ 5 с (YMMV).

http://en.wikipedia.org/wiki/CoreOS

Один управляющий хост (экземпляр CoreOS) запускает несколько изолированных систем (контейнеров) Linux, используя Docker в качестве дополнительного уровня абстракции и интерфейса [14] к базовым функциям виртуализации на уровне операционной системы ядра Linux. ... Этот подход опирается на функциональность cgroups ядра Linux, которая обеспечивает изоляцию пространства имен и возможность ограничивать, учитывать и изолировать использование ресурсов (ЦП, память, дисковый ввод-вывод и т. Д.) Для коллекций процессов.


1
Это не отвечает на вопрос.
EML

2
EML, какой вопрос? По умолчанию все контейнеры Docker не имеют собственных ядер. Существует только одно ядро ​​хоста для всех контейнеров Docker.
osgx

Конечно, ваш ответ в порядке, но ОП хотел знать, зачем ему FROMбазовый образ Ubuntu, когда на хосте уже установлена ​​Ubuntu. Чтобы ответить на вопрос, вы должны объяснить, что такое базовое изображение.
EML

2
EML, вопрос был отредактирован с помощью «Разъяснения» ( superuser.com/posts/889472/revisions ) после того, как мой ответ был опубликован, поэтому он является ответом на оригинальный вопрос без пояснений. Если у вас есть какая-то информация о базовых образах и ядрах в Docker, добавьте еще один ответ.
osgx

17

Практически во всех случаях ядро ​​ОС является общим. Для запуска другого ядра вам нужно использовать виртуализацию. Это редко и используется только при необходимости из-за снижения производительности.

«Контейнер Docker Engine включает в себя только приложение и его зависимости. Он работает как изолированный процесс в пространстве пользователя в операционной системе хоста, разделяя ядро ​​с другими контейнерами. Таким образом, он обладает преимуществами выделения ресурсов и распределения виртуальных машин, но гораздо более портативный и эффективный. "

Это может помочь объяснить, как это работает: введите описание изображения здесь

Источник: https://www.docker.com/whatisdocker/


4
Любой источник "Пакеты могут использовать разные ядра" ??? Сам Docker не может использовать несколько ядер, всегда есть только одно ядро ​​хоста. Только в сочетании с гипервизором (виртуализация) мы можем запустить несколько хостов, каждый с собственной версией ядра, и запустить один Docker для каждого виртуального хоста; но для любого хоста будет только одно ядро ​​для хоста и для его прикрепленных контейнеров)
osgx

2
Что такое пакет? В контейнере Docker нет ядра; он просто установлен и запущен в ядре, которое используется на хосте. Итак: один Docker = один сервер = одно ядро, как показано на рисунке. Нельзя использовать два ядра с одним движком Docker; все контейнеры внутри этого движка будут использовать одно и то же ядро. Я думаю, что правильный ответ: «Нет, контейнеры Docker не могут использовать разные ядра в одном экземпляре Docker Engine»
osgx

1
Каждый док-контейнер может запускать любой код, который он хочет, включая программное обеспечение для виртуализации, которое может загрузить любое ядро, которое может потребоваться вашему программному обеспечению. Вы можете запустить Windows в контейнере, если хотите.
Иеремия

1
JeremiahBarrar, Понял, спасибо за объяснение. Документировано ли запущенное программное обеспечение для виртуализации внутри контейнера Docker и поддерживается ли оно Docker? Какой тип виртуализации будет работать в Docker (программное обеспечение qemu, qemu + kvm, xen, ...)?
osgx

2
Первое предложение вводит в заблуждение. Использование ВМ в контейнере лишает смысла использование Docker.
user2707671
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.