Есть несколько процессов, выполняемых в контейнере Docker, их PID изолированы в пространстве имен контейнеров, есть ли способ выяснить, каковы их PID на хосте Docker?
Например, веб-сервер Apache работает внутри контейнера Docker (я использую Apache + PHP-образ из Docker Hub), а Apache при его запуске создает больше рабочих процессов внутри контейнера. Эти рабочие процессы фактически обрабатывают входящие запросы. Чтобы просмотреть эти процессы, я запускаю pstree
внутри контейнера 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
на хосте, чтобы 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.