Является ли контейнерный движок целым слоем между ОС и приложениями или просто еще одним приложением, работающим рядом с другими приложениями поверх ОС?

В большинстве руководств, публикаций и даже в некоторых сообщениях блога Docker контейнерный движок изображается как целый слой, который находится поверх ОС. Он также считается гипервизором или уровнем, выполняющим виртуализацию, и его даже иногда называют облегченной виртуализацией или виртуализацией на уровне ОС.

Но правда в том, что приложения работают непосредственно в ОС, и все они используют одно и то же ядро. Движок контейнера не интерпретирует и не транслирует какой-либо код для работы в базовой ОС.

Я также прочитал Чем Docker отличается от виртуальной машины но это в основном о разнице между виртуальными машинами и контейнерами, но мой вопрос конкретно о контейнерных движках.

Правильно ли изображать контейнерный движок как целый слой между ОС и приложениями (рис. 1) или его следует рассматривать просто как процесс, работающий рядом с другими приложениями поверх ОС (рис. 2)?

контейнерная архитектура


person Iman Ravakhah    schedule 05.06.2019    source источник
comment
Контейнеры (пространства имен) — это функция уровня ОС, поэтому (1), вероятно, точнее, чем (2).   -  person halfer    schedule 05.06.2019
comment
Возможный дубликат Чем Docker отличается от виртуальной машины?   -  person David Maze    schedule 05.06.2019
comment
@DavidMaze Ссылка, которую вы упомянули, посвящена контейнерам и виртуальным машинам, но этот вопрос касается конкретно архитектуры контейнерных движков.   -  person Iman Ravakhah    schedule 05.06.2019
comment
@halfer, но контейнерный движок не выполняет виртуализацию, интерпретацию или перевод, а приложения запускаются непосредственно в ОС и используют одно и то же ядро.   -  person Iman Ravakhah    schedule 05.06.2019
comment
Верно, но во всей ОС все еще есть что-то, что делает возможным контейнеризацию. В Linux это пространства имен. Я согласен, что это не движок — в Docker движок — это просто бит сервера, который прослушивает консольные команды.   -  person halfer    schedule 05.06.2019


Ответы (3)


Является ли контейнерный движок целым слоем между ОС и приложениями?

No.

Является ли контейнерный движок другим приложением, работающим рядом с другими приложениями поверх ОС?

Это определение лучше.

У Скотта Маккарти есть следующий слайд в одной из его презентаций:

введите здесь описание изображения

ссылка на этот слайд


Далее следует немного истории, которая может помочь с такими терминами, как docker daemon, containerd, runc, rkt...

из: документации CoreOS:

введите здесь описание изображения

До версии Docker 1.11 демон Docker Engine загружал образы контейнеров, запускал процессы контейнеров, предоставлял доступ к удаленному API и действовал как демон сбора журналов, и все это в рамках централизованного процесса, работающего от имени пользователя root.

Хотя такая централизованная архитектура удобна для развертывания, она не соответствует рекомендациям по разделению процессов и привилегий Unix; кроме того, это затрудняет правильную интеграцию Docker с системами инициализации Linux, такими как upstart и systemd.

Начиная с версии 1.11 демон Docker больше не обрабатывает выполнение контейнеров самостоятельно. Вместо этого теперь этим занимается containerd. Точнее, демон Docker подготавливает образ как образ открытого контейнера (OCI ) bundle и вызывает API-интерфейс containerd для запуска пакета OCI. Затем containerd запускает контейнер с помощью runC.

Дальнейшее чтение:

person tgogos    schedule 05.06.2019

Это зависит от того, как вы хотите на это смотреть.

В Docker контейнеры в основном являются дочерними процессами процессов Docker и дополнительно настроены для ограничения разного. функции ядра, такие как пространства имен или контрольные группы.

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

И считать ли иллюзию отдельным слоем «Container Engine» — это личное дело. (ИМХО, это в основном проблема типа «vim vs Emacs».)

person Tomasz Zieliński    schedule 05.06.2019

Отвечая на ваш вопрос, образы контейнеров становятся контейнерами во время выполнения, а в случае контейнеров Docker — образы становятся контейнерами при запуске на Docker Engine. Но, как и в большинстве изображений архитектуры контейнеров, механизм докера развертывается на всем уровне между хост-операционной системой и контенизированным приложением, потому что цель контенеризованной архитектуры состоит в том, чтобы построить только контенеризованное приложение поверх.

Таким образом, если вы не хотите развертывать только контенизированное приложение поверх операционной системы, вам не нужно использовать Docker Engine, а это означает, что Docker Engine не нужно использовать и развертывать на всей уровень докерной архитектуры. При создании такой архитектуры вам решать, хотите ли вы выделить целый слой в Docker Enginer и предполагать, что все приложения в вашей среде будут контенеризированы.

Мы можем определить Docker Engine как среду выполнения (является клиент-серверным приложением) и инструментарий, который позволяет запускать приложения-контейнеры, определенные файлом Dockerfile, поверх операционной системы хоста. система в изолированном «контейнерном» разделе.

Я надеюсь, что это помогает.

person Malgorzata    schedule 06.06.2019