Существует несколько процессов, выполняющихся в контейнере Docker, их PID изолированы в пространстве имен контейнеров, есть ли способ выяснить, каковы их PID на хосте Docker?Что такое PID в хосте, процесс, выполняющийся внутри контейнера Docker?
Например, есть веб-сервер Apache, запущенный внутри контейнера Docker, (я использую образ Apache + PHP от Docker Hub), и Apache при его запуске создает больше рабочих процессов внутри контейнера. Эти рабочие процессы фактически обрабатывают входящие запросы. Для просмотра этих процессов я бегу pstree
внутри контейнера DOCKER:
# 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 на хосте, он также отображает :
- ПИД-8 в контейнере с PID 18010 на хосте, и
- PID 9 PID 18011;
- PID 10 для PID 18012 и так далее ...
(Это позволяет мне отладить процессы из Докер контейнера, с помощью инструментов, которые доступны только только на хосте, а не в контейнере , как strace)
Проблема в том, что я не знаю, насколько безопасно предположить, что pstree перечисляет процессы в том же порядке как в контейнере, так и в хосте.
Было бы здорово, если бы кто-нибудь мог предложить более надежный способ определить, что такое PID на узле конкретного процесса, запущенного внутри контейнера Docker.
ИОКи может также означать OS Темы, по крайней мере, линукс. Вы можете проверить с помощью java (или другого языка), создав несколько потоков и считая PIDS, которые вы получаете. – ieugen