linux 激活docker进程,linux – 在Docker容器内运行的进程中,主机中的PID是什么?

在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

等等…

(这允许我从docker容器调试进程,使用仅在主机上可用的工具,而不是容器中的工具,如strace)

问题是我不知道假设pstree在容器和主机中以相同的顺序列出进程是多么安全.

如果有人能够建议一种更可靠的方法来检测Docker容器内运行的特定进程的主机上的PID,那将会很棒.

解决方法:

您可以查看/ proc /< pid> / status文件以确定命名空间PID和全局PID之间的映射.例如,如果在docker容器中我启动了几个sleep 900进程,如下所示:

# docker run --rm -it alpine sh

/ # sleep 900 &

/ # sleep 900 &

/ # sleep 900 &

我可以看到它们在容器中运行:

/ # ps -fe

PID USER TIME COMMAND

1 root 0:00 sh

7 root 0:00 sleep 900

8 root 0:00 sleep 900

9 root 0:00 sleep 900

10 root 0:00 ps -fe

我可以在主机上看一下这些:

# ps -fe | grep sleep

root 10394 10366 0 09:11 pts/10 00:00:00 sleep 900

root 10397 10366 0 09:12 pts/10 00:00:00 sleep 900

root 10398 10366 0 09:12 pts/10 00:00:00 sleep 900

对于其中任何一个,我可以查看状态文件以查看命名空间pid:

# grep -i pid /proc/10394/status

Pid: 10394

PPid: 10366

TracerPid: 0

NSpid: 10394 7

看看NSpid系列,我可以看到PID命名空间内这个进程有pid 7.实际上,如果我在主机上杀死进程10394:

# kill 10394

然后在容器中我看到PID 7不再运行:

/ # ps -fe

PID USER TIME COMMAND

1 root 0:00 sh

8 root 0:00 sleep 900

9 root 0:00 sleep 900

11 root 0:00 ps -fe

标签:linux,docker,process,pid

来源: https://codeday.me/bug/20191004/1853929.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值