我正在对 docker 和容器进行一些测试,我想知道:
有没有一种方法可以用来从主机的角度通过名称或 ID 查找与 docker 容器关联的所有进程。
毕竟,归根结底,容器是一组虚拟化进程。
我正在对 docker 和容器进行一些测试,我想知道:
有没有一种方法可以用来从主机的角度通过名称或 ID 查找与 docker 容器关联的所有进程。
毕竟,归根结底,容器是一组虚拟化进程。
你可以使用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>
另一种了解主机上运行的所有 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 的 systemd 服务。
在 docker容器中运行的进程是名为containerd-shim
(在 Docker v18.09.4 中)的进程的子进程
containerd-shim
。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
I found a similar solution using a bash script in one line:
for i in $(docker container ls --format "{{.ID}}"); do docker inspect -f '{{.State.Pid}} {{.Name}}' $i; done
在主机上运行它时,它将为您提供在容器中运行的进程列表,其中<Container ID>
显示主机 PID 而不是容器 PID。
DID=$(docker inspect -f '{{.State.Pid}}' <Container ID>);ps --ppid $DID -o pid,ppid,cmd
docker ps
将列出正在运行的 docker 容器。
docker exec <id|name> ps
会告诉你它正在运行的进程。
由于以下命令仅显示容器本身的进程 ID(不是所有子进程):
docker inspect -f '{{.State.Pid}}' <container-name_or_ID>
要查找作为容器子进程的进程,必须在目录 /proc 中找到此进程 ID。所以在其中找到“processID”,然后从文件中找到容器哈希:
/proc/parent_process/task/processID
然后从散列(容器散列的前 12 位)中截取容器 ID,然后找到容器本身:
#!/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
Docker stats "container id" 显示资源消耗以及 pid 或简单的 Docker ps 。
可能这个备忘单可以使用。 http://theearlybirdtechnology.com/2017/08/12/docker-cheatsheet/