Как docker сочиняет работу под капотом? - PullRequest
3 голосов
/ 15 января 2020

Как именно docker-compose работает? В документации упоминается только параллельное выполнение нескольких сервисов, но не упоминается how . Я понимаю, что образы создаются и запускаются, но как они работают параллельно?

Похоже ли это на Supervisor , который запускает каждую из своих служб в разных процессах ОС? Все службы упакованы в один контейнер?

Как он обрабатывается за кулисами?

Запуск docker-compose up --verbose показывает только следующее, что я не уверен, что это значит:

compose.parallel.feed_queue: Starting producer thread for <Service: web>

Ответы [ 2 ]

5 голосов
/ 15 января 2020

docker-compose создает docker контейнеры для каждой услуги. Это похоже на создание контейнеров вручную с использованием команд docker run для каждой службы, упомянутой в файле docker -compose.yml.

Это также делает некоторые дополнительные действия, такие как создание сети и присоединение всех контейнеров к сеть, опционально собирая образ из файла dockerfile et c.

2 голосов
/ 15 января 2020

Если это помогает прояснить ситуацию, docker compose очень похож на docker стек (исторически они различаются, и stack теперь включен в сам механизм docker, но они выполняют схожие роли, и это сходство увеличилось со временем). По сути, это программа Python. Все, что он на самом деле делает, - это анализ файла YAML, чтобы определить группу зависимостей, которые необходимо встретить, чтобы позволить сборкам и запуску контейнеров. Он выполняет эти зависимости, а затем запускает контейнеры. Он добавляет функциональность к docker, позволяя обрабатывать и управлять группой контейнеров и их зависимостей как единым целым, но под капотом это всего лишь вызовы API.

Что касается самого docker, то он тесно интегрирован с базовым ядром и использует концепцию, называемую «пространства имен», которая позволяет разделять ресурсы уровня ядра (ie. деревья процессов, сеть, монтирование дисков и т. д. c ...). Каждому контейнеру может быть выделен собственный изолированный набор ресурсов ядра для работы. То, как это происходит на уровне хоста, требует некоторых хитростей в /proc. From wikipedia :

Ядро назначает каждому процессу символическую c ссылку на вид пространства имен в / proc / [pid] / ns /. Номер индекса, на который указывает эта символическая ссылка, одинаков для каждого процесса в этом пространстве имен. Это однозначно идентифицирует каждое пространство имен по номеру inode, на который указывает одна из его символических ссылок.

Чтение символической ссылки через readlink возвращает строку, содержащую имя вида пространства имен и номер inode пространства имен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...