Если это помогает прояснить ситуацию, docker compose очень похож на docker стек (исторически они различаются, и stack
теперь включен в сам механизм docker, но они выполняют схожие роли, и это сходство увеличилось со временем). По сути, это программа Python. Все, что он на самом деле делает, - это анализ файла YAML, чтобы определить группу зависимостей, которые необходимо встретить, чтобы позволить сборкам и запуску контейнеров. Он выполняет эти зависимости, а затем запускает контейнеры. Он добавляет функциональность к docker, позволяя обрабатывать и управлять группой контейнеров и их зависимостей как единым целым, но под капотом это всего лишь вызовы API.
Что касается самого docker, то он тесно интегрирован с базовым ядром и использует концепцию, называемую «пространства имен», которая позволяет разделять ресурсы уровня ядра (ie. деревья процессов, сеть, монтирование дисков и т. д. c ...). Каждому контейнеру может быть выделен собственный изолированный набор ресурсов ядра для работы. То, как это происходит на уровне хоста, требует некоторых хитростей в /proc
. From wikipedia :
Ядро назначает каждому процессу символическую c ссылку на вид пространства имен в / proc / [pid] / ns /. Номер индекса, на который указывает эта символическая ссылка, одинаков для каждого процесса в этом пространстве имен. Это однозначно идентифицирует каждое пространство имен по номеру inode, на который указывает одна из его символических ссылок.
Чтение символической ссылки через readlink возвращает строку, содержащую имя вида пространства имен и номер inode пространства имен.