Что такое PID на хосте процесса, выполняющегося внутри контейнера Docker?
В Docker-контейнере выполняется несколько процессов, их PID изолированы в пространстве имен контейнера. Есть ли способ выяснить, каковы их PID на хосте Docker?
Например, внутри контейнера Docker работает веб-сервер Apache (я использую образ Apache + PHP изDocker Hub), и Apache при запуске создает больше рабочих процессов внутри контейнера. Эти рабочие процессы фактически обрабатывают входящие запросы. Для просмотра этих процессов я запускаюpstree
внутри док-контейнера:
# pstree -p 1
apache2(1)-+-apache2(8)
|-apache2(9)
|-apache2(10)
|-apache2(11)
|-apache2(12)
`-apache2(20)
Родительский процесс Apache выполняется с PID 1 внутри пространства имен процесса контейнера. Однако с точки зрения хоста к нему также можно получить доступ, но его PID на хосте отличается и может быть определен запускомdocker compose
команда:
$ docker inspect --format '{{.State.Pid}}' container
17985
Отсюда видно, что PID 1 из пространства имен процесса контейнера отображается в PID 17985 на хосте. Так что я могу бежатьpstree
на хосте, чтобы перечислить дочерние элементы процесса Apache:
$ pstree -p 17985
apache2(17985)─┬─apache2(18010)
├─apache2(18011)
├─apache2(18012)
├─apache2(18013)
├─apache2(18014)
└─apache2(18164)
Исходя из этого, я предполагаю, что так же, как PID 1 в контейнере отображается на PID 17985 на хосте, он также отображает:
PID 8 в контейнере для PID 18010 на хосте, иPID 9 к PID 18011;PID 10 к PID 18012 и так далее ...(Это позволяет мне отлаживать процессы из докер-контейнера, используя инструменты, которые доступны только на хосте, а не в контейнере, как strace)
Проблема в том, что я не знаю, насколько безопасно предполагать, что pstree перечисляет процессы в одном и том же порядке как в контейнере, так и в хосте.
Было бы здорово, если бы кто-то мог предложить более надежный способ определения того, что такое PID на хосте конкретного процесса, выполняющегося внутри контейнера Docker.