有几个进程在Docker容器中运行,它们的PID在容器命名空间中被隔离,是否有一种方法可以找出它们在Docker主机上的PID?
例如,在Docker容器内运行着一个Apache Web服务器(我使用Docker Hub上的Apache+PHP镜像),当Apache启动时,在容器内创建更多的工作进程。这些工作进程实际上正在处理传入的请求。为了查看这些进程,我在Docker容器内运行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等等......
问题是我不知道假设pstree以相同顺序列出容器和主机中的进程有多安全。
如果有人能建议一种更可靠的方法来检测运行在Docker容器内的特定进程在主机上的PID将会很棒。