我可能会问一个非常初学者级别的问题,但我需要一种方法来区分docker下的进程和框内非docker下的进程。 ' ps'命令命令输出让我觉得进程在linux框中运行,无法确认是否在docker的引擎盖下。
在相同的上下文中,使用docker根文件系统启动docker下的进程是可行/可行的。
同样可行还是有其他解决办法?
答案 0 :(得分:6)
您可以通过Docker主机上的进程树识别Docker进程。
2924(haproxy)的父过程是2902
到2902(haproxy-start)的父过程是2881
2881将docker-container
由dockerd
进程管理
要以树格式查看您的流程列表,请使用ps -ejH
或pstree
(可在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
答案 1 :(得分:1)
命令lxc-ls和命令lxc-ps可以安装在Linux发行版上。这将允许您分别列出正在运行的LXC容器和在这些容器中运行的进程。您应该能够使用流将lxc-ls的输出链接到lxc-ps并获取所有容器化进程的列表。
最大的警告是您指定了Docker
并且并非每个Docker实例都在LXC上运行,也不一定是localhost进程。 Docker定义了一个可以调用以列出远程Docker实例的API,因此这种技术也无助于枚举远程机器上的进程。
答案 2 :(得分:0)
在windows docker中表现得有点不同。 它的进程不是作为父进程的子进程运行,而是作为主机上的单独进程运行。
可以通过(例如)powershell查看它们,例如
Get-Process powershell
例如,在运行microsoft / iis容器时获取主机上的进程将包含额外的PowerShell进程(因为ms / iis容器将powershell作为主可执行进程运行)。