Как выглядят процессы внутри контейнера Docker?

33

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

Может ли кто-нибудь предоставить общий обзор того, что происходит?

SLM
источник
3
Хотя это и не совсем точно (и почему я не собираюсь писать это как ответ), мне проще думать о докере как о необычном chroot, чем как о виртуальной машине. Это не точно, но помогает при попытке визуализировать это в моей голове.
Котейр
2
@coteyr - забавно, что вы упомянули эту аналогию, я использовал именно эту, пытаясь описать, что делает Docker. IMO Docker имеет гораздо больше общего с chroot, чем с виртуализацией.
SLM

Ответы:

53

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

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

Вот пример, который иллюстрирует, что происходит, когда мы запускаем контейнер Docker, а затем вводим его через вызов /bin/bash.

$ docker run -it ubuntu:latest /bin/bash
root@c0c5c54062df:/#

Теперь изнутри этого контейнера, если мы запустим ps -eaf:

    SS01

Переключаясь на другую вкладку терминала, где мы вошли в хост-систему, в которой находится контейнер Docker, мы можем увидеть пространство процесса, которое контейнер «фактически» занимает:

    SS02

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

ПРИМЕЧАНИЕ: процессы представляют собой 4 sleep 1000команды, которые находятся в фоновом режиме.

    SS03

Обратите внимание, как внутри контейнера Docker процессам назначаются идентификаторы процессов (PID) 48-51. Смотрите их в ps -eafвыводе в их также:

    SS04

Тем не менее, с этим следующим изображением раскрывается большая часть «магии», которую исполняет Docker.

    SS05

Посмотрите, как эти 4 sleep 1000процесса на самом деле являются просто дочерними процессами нашего первоначального процесса Bash? Также обратите внимание, что наш оригинальный контейнер Docker /bin/bashфактически является дочерним процессом для демона Docker.

Теперь, если бы нам пришлось ждать более 1000 секунд до завершения исходных sleep 1000команд, а затем запустить еще 4 новые и запустить еще один контейнер Docker следующим образом:

$ docker run -it ubuntu:latest /bin/bash
root@450a3ce77d32:/#

Вывод хоста из компьютера ps -eafбудет выглядеть так:

    SS06

И другие контейнеры Docker, все будут отображаться как процессы в демоне Docker.

Итак, вы видите, что Docker на самом деле не виртуализируется ( в традиционном смысле ), он создает «ограждения» вокруг различных ресурсов ядра и ограничивает их видимость для данного процесса + потомков.

SLM
источник
Также Docker создает изолированное пространство пользователя для каждого запущенного контейнера.
Бхаргав Нанекалва
3

Внутри контейнера ваши процессы должны быть изолированы (помещены в карантин). На самом деле вы не должны видеть никаких процессов, кроме тех, которые вы укажете (по крайней мере, оболочка). Это не для проверки "общительности". Единственное сходство с chroot в том, что используется ядро ​​хоста. Docker отлично подходит, если вам нужно что-то изолировать или использовать версии программного обеспечения для архитектуры платформы, отличные от той, которая работает на хосте. (говорят очень старые версии Java или другой форк Python). Помните, что папки и двоичные файлы, с которыми вы имеете дело, могут не совпадать с папками на хосте. Это не та же папка / bin и т. Д.

РЕДАКТИРОВАТЬ: сходство с chroot, а не виртуальных машин.

mckenzm
источник
1
Отредактированный, я думал с устаревшей кепкой Xen. Очевидно, что это не тот случай, когда Windows работает под KVM / Qemu или 64-битная виртуальная машина на 32-битном хосте под VirtualBox. (не спрашивай). Это похоже на аргумент pv vs hvm для AWS.
Маккензм