如何确定一个进程正在Docker容器中运行?

4

我可能会问一个非常初级的问题,但我需要一种区分在docker和非docker环境下运行的进程的方法。 'ps'命令的输出让我感觉进程正在linux盒子中运行,并且无法确认是否在docker内部。

在同样的背景下,是否可能/可行让docker内部的进程使用docker根文件系统启动。

这是否可行或者还有其他解决方案?


3个回答

7
您可以通过Docker主机上(或者在使用docker for mac/windows的VM上)的进程树来识别Docker进程。
2924(haproxy)的父进程是2902。
2902(haproxy-start)的父进程是2881。
2881将会是由dockerd进程管理的docker-container
要以树形格式查看进程列表,请使用ps -ejHpstree(在psmisc包中可用)。
要快速获取在dockerd下运行的内容列表,请执行相应命令。
/ # pstree $(pgrep dockerd)
dockerd-+-docker-containe-+-docker-containe-+-java---17*[{java}]
        |                 |                 `-8*[{docker-containe}]
        |                 |-docker-containe-+-sinopia-+-4*[{V8 WorkerThread}]
        |                 |                 |         |-{node}
        |                 |                 |         `-4*[{sinopia}]
        |                 |                 `-8*[{docker-containe}]
        |                 |-docker-containe-+-node-+-4*[{V8 WorkerThread}]
        |                 |                 |      `-{node}
        |                 |                 `-8*[{docker-containe}]
        |                 |-docker-containe-+-tinydns
        |                 |                 `-8*[{docker-containe}]
        |                 |-docker-containe-+-dnscache
        |                 |                 `-8*[{docker-containe}]
        |                 |-docker-containe-+-apt-cacher-ng
        |                 |                 `-8*[{docker-containe}]
        |                 `-20*[{docker-containe}]
        |-2*[docker-proxy---6*[{docker-proxy}]]
        |-docker-proxy---5*[{docker-proxy}]
        |-2*[docker-proxy---4*[{docker-proxy}]]
        |-docker-proxy---8*[{docker-proxy}]
        `-28*[{dockerd}]

显示一个 PID 的父进程(-s)。
/ # pstree -aps 3744 
init,1      
  `-dockerd,1721 --pidfile=/run/docker.pid -H unix:///var/run/docker.sock --swarm-default-advertise-addr=eth0
      `-docker-containe,1728 -l unix:///var/run/docker/libcontainerd/docker-containerd.sock --shim docker-containerd-shim ...
          `-docker-containe,3711 8d923b3235eb963b735fda847b745d5629904ccef1245d4592cc986b3b9b384a...
              `-java,3744 -Dzookeeper.log.dir=. -Dzookeeper.root.logger=INFO,CONSOLE -cp/zookeeper/bin/../build/cl
                  |-{java},4174
                  |-{java},4175
                  |-{java},4176
                  |-{java},4177
                  |-{java},4190
                  |-{java},4208
                  |-{java},4209
                  |-{java},4327
                  |-{java},4328
                  |-{java},4329
                  |-{java},4330
                  |-{java},4390
                  |-{java},4416
                  |-{java},4617
                  |-{java},4625
                  |-{java},4629
                  `-{java},4632

显示docker的所有子进程,包括命名空间的更改(-S):
/ # pstree -apS $(pgrep dockerd) 
dockerd,1721 --pidfile=/run/docker.pid -H unix:///var/run/docker.sock --swarm-default-advertise-addr=eth0
  |-docker-containe,1728 -l unix:///var/run/docker/libcontainerd/docker-containerd.sock --shim docker-containerd-shim ...
  |   |-docker-containe,3711 8d923b3235eb963b735fda847b745d5629904ccef1245d4592cc986b3b9b384a...
  |   |   |-java,3744,ipc,mnt,net,pid,uts -Dzookeeper.log.dir=. -Dzookeeper.root.logger=INFO,CONSOLE -cp/zookeeper/bin/../build/cl
  |   |   |   |-{java},4174
  |   |   |   |-{java},4175
  |   |   |   |-{java},4629
  |   |   |   `-{java},4632
  |   |   |-{docker-containe},3712
  |   |   `-{docker-containe},4152
  |   |-docker-containe,3806 49125f8274242a5ae244ffbca121f354c620355186875617d43876bcde619732...
  |   |   |-sinopia,3841,ipc,mnt,net,pid,uts                                                           
  |   |   |   |-{V8 WorkerThread},4063
  |   |   |   |-{V8 WorkerThread},4064
  |   |   |   |-{V8 WorkerThread},4065
  |   |   |   |-{V8 WorkerThread},4066
  |   |   |   |-{node},4062
  |   |   |   |-{sinopia},4333
  |   |   |   |-{sinopia},4334
  |   |   |   |-{sinopia},4335
  |   |   |   `-{sinopia},4336
  |   |   |-{docker-containe},3814
  |   |   `-{docker-containe},4038
  |   |-docker-containe,3846 2a756d94c52d934ba729927b0354014f11da6319eff4d35880a30e72e033c05d...
  |   |   |-node,3910,ipc,mnt,net,pid,uts lib/dnsd.js
  |   |   |   |-{V8 WorkerThread},4204
  |   |   |   |-{V8 WorkerThread},4205
  |   |   |   |-{V8 WorkerThread},4206
  |   |   |   |-{V8 WorkerThread},4207
  |   |   |   `-{node},4203

我不确定为什么在Mac OS终端中pgrep dockerd无法工作? - Yibin Lin
1
@YibinLin Docker桌面版在虚拟机内运行Docker进程。使用docker run -it --rm --privileged --pid=host alpine:edge nsenter -t 1 -m -u -n -i bash命令。 - Matt
啊,我明白了。谢谢@Matt!! - Yibin Lin

1

命令lxc-ls和命令lxc-ps可以在您的Linux发行版上安装。这将允许您列出正在运行的LXC容器以及这些容器中运行的进程。您应该能够使用流将lxc-ls的输出链接到lxc-ps,并获得所有容器化进程的列表。

重要的是,您指定了Docker,并不是每个Docker实例都在LXC上运行,也不一定是本地主机进程。 Docker定义了一个API,可以调用以列出远程Docker实例,因此此技术无法帮助枚举远程计算机上的进程。


现在将运行很少的Docker实例LXC。 - Matt

0
在Windows上,Docker的行为略有不同。 它的进程不会作为父进程的子进程运行,而是在主机上作为单独的进程运行。
例如,它们可以通过PowerShell查看。
Get-Process powershell

例如,在运行microsoft/iis容器时获取主机上的进程将包括额外的PowerShell进程(因为ms/iis容器将PowerShell作为主要可执行进程运行)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接