我正在对码头和容器进行一些测试,我想知道:
是否有一种方法可以用来从主机的角度查找与其名称或ID 的Docker容器相关的所有进程。
毕竟,在一天结束时,一个容器被设置为虚拟化进程。
答案 0 :(得分:33)
您可以使用docker top
命令。
此命令列出容器中运行的所有进程。
例如,我的框上的单个进程容器上的此命令显示:
UID PID PPID C STIME TTY TIME CMD
root 14097 13930 0 23:17 pts/6 00:00:00 /bin/bash
其他人提到的所有方法也可以使用,但这个方法应该是最简单的。
<强>更新强>:
要简单地获取容器中的主进程ID,请使用以下命令:
docker inspect -f '{{.State.Pid}}' <container id>
答案 1 :(得分:12)
另一种了解主机上运行的所有Docker进程的方法是使用基于通用cgroup的systemd工具。
systemd-cgls
将在树视图中显示我们所有的cgroup及其中运行的进程,如下所示:
├─1 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
├─docker
│ ├─070a034d27ed7a0ac0d336d72cc14671584cc05a4b6802b4c06d4051ce3213bd
│ │ └─14043 bash
│ ├─dd952fc28077af16a2a0a6a3231560f76f363359f061c797b5299ad8e2614245
│ │ └─3050 go-cron -s 0 0 * * * * -- automysqlbackup
由于每个Docker容器都有自己的cgroup,您也可以通过这种方式查看Docker容器及其相应的主机进程。
此方法的两个有趣属性:
您还可以使用systemd-cgtop
来概述Docker容器的资源使用情况,类似于top
。
顺便说一句:由于systemd服务也对应于cgroups,因此这些方法也适用于非Dockerized系统服务。
答案 2 :(得分:11)
在docker容器中运行的进程是名为containerd-shim
的进程的子进程(在Docker v18.09.4中)
containerd-shim
进程的进程ID。pgrep containerd-shim
7105 7141 7248
要查找父进程7105的子进程:
pgrep -P 7105
7127
最后,你可以获得列表:
for i in $(pgrep containerd-shim); do pgrep -P $i; done
7127 7166 7275
答案 3 :(得分:3)
docker ps
将列出正在运行的docker容器。
docker exec <id|name> ps
会告诉您正在运行的流程。
答案 4 :(得分:2)
我在一行中使用bash脚本找到了类似的解决方案:
for i in $(docker container ls --format "{{.ID}}"); do docker inspect -f '{{.State.Pid}} {{.Name}}' $i; done
答案 5 :(得分:1)
在主机上运行此命令时,它将为您提供在<Container ID>
的容器中运行的进程的列表,显示主机PID而不是容器PID。
DID=$(docker inspect -f '{{.State.Pid}}' <Container ID>);ps --ppid $DID -o pid,ppid,cmd
答案 6 :(得分:0)
Docker统计信息“容器ID” 显示资源消耗以及pid或简单地使用Docker ps。
这个备忘单可能是有用的。 http://theearlybirdtechnology.com/2017/08/12/docker-cheatsheet/
答案 7 :(得分:0)
真主
萨拉姆
由于以下命令仅显示容器本身的进程 ID(并非所有子进程):
docker inspect -f '{{.State.Pid}}' <container-name_or_ID>
要查找作为容器子进程的进程,该进程 ID 必须在目录 /proc 中找到。
因此在其中找到“processID”,然后从文件中找到容器哈希:
/proc/parent_process/task/processID
然后从散列中剪切容器 ID(容器散列的前 12 位数字),然后找到容器本身:
#!/bin/bash
processPath=$(find /proc/ -name $1 2>/dev/null)
containerID=$(cat ${processPath}/cgroup | fgrep 'pids:/docker/' | sed -e 's#.*/docker/##g' | cut -c 1-12)
docker ps | fgrep $containerID
将上述脚本保存在一个文件中,例如:p2c 并通过以下方式运行它:
p2c <PID>
例如:
p2c 85888
享受吧!