查找Docker容器进程?(从主持人的角度来看)

Wal*_*raf 36 linux process-migration docker

我正在对码头和容器进行一些测试,我想知道:

有没有一种方法可以用来从主机的角度通过名称或ID查找与docker容器关联的所有进程.

毕竟,在一天结束时,容器是一组虚拟化进程.

Boy*_*nux 43

你可以使用docker top命令.此命令列出容器中运行的所有进程.

例如,我的框上的单个进程容器上的此命令显示:

UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                14097               13930               0                   23:17               pts/6               00:00:00            /bin/bash
Run Code Online (Sandbox Code Playgroud)

其他人提到的所有方法也可以使用,但这个方法应该是最简单的.

更新:

要简单地获取容器中的主进程ID,请使用以下命令:

 docker inspect -f '{{.State.Pid}}' <container id>
Run Code Online (Sandbox Code Playgroud)

  • 这并没有回答这个问题 - `docker top` 显示了容器内运行的进程的 PID,来自容器的 pid 命名空间。从主机的角度来看,该用户正在询问容器的 PID。 (2认同)

Joh*_*hrs 16

另一种了解主机上运行的所有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
Run Code Online (Sandbox Code Playgroud)

由于每个Docker容器都有自己的cgroup,因此您也可以通过这种方式查看Docker容器及其相应的主机进程.

这种方法的两个有趣的属性:

  1. 即使Docker守护程序已经不存在,它仍然有效.
  2. 这是一个非常快速的概述.

您还可以使用它systemd-cgtop来概述Docker容器的资源使用情况,类似于top.

顺便说一下:由于systemd服务也对应于cgroups,因此这些方法也适用于非Dockerized系统服务.

  • 这是最好的答案,它是针对没有解决方案的已知问题的解决方案:https://github.com/moby/moby/issues/12738。用户需要 (1) 找到 docker 进程的 pid id,最容易通过与容器关联的端口号来识别,以及 (2) 找到关联的 containerid 哈希的 pid,并杀死两者。感谢您的提示。 (2认同)
  • docker 容器是否列在“docker”下?在 Docker 版本 18.09.4 中,systemd 在 `containerd.service` 下列出容器,而不是 `docker.service` (2认同)

Tho*_*eil 12

  • 首先找出docker守护进程的进程ID.
  • 然后通过仅保留父进程ID是docker守护程序的进程来筛选进程列表.
  • 最后过滤出docker引擎内部进程,如containerd-shim.

pgrep containerd-shim
Run Code Online (Sandbox Code Playgroud)
7105
7141
7248
Run Code Online (Sandbox Code Playgroud)
pgrep -P 7105
Run Code Online (Sandbox Code Playgroud)

4076

4135

4210

4226

4784

4788

for i in $(pgrep containerd-shim); do pgrep -P $i; done
Run Code Online (Sandbox Code Playgroud)
7127
7166
7275
Run Code Online (Sandbox Code Playgroud)
pgrep containerd-shim
Run Code Online (Sandbox Code Playgroud)

  • 如果可视化树足够你也可以使用`ps -axfo pid,ppid,uname,cmd` (3认同)

小智 7

我在一行中使用 bash 脚本找到了一个类似的解决方案:

for i in $(docker container ls --format "{{.ID}}"); do docker inspect -f '{{.State.Pid}} {{.Name}}' $i; done
Run Code Online (Sandbox Code Playgroud)


Bea*_*eam 6

在主机上运行它时,它会给你一个在容器中运行的进程列表<Container ID>,显示主机 PID 而不是容器 PID。

DID=$(docker inspect -f '{{.State.Pid}}' <Container ID>);ps --ppid $DID -o pid,ppid,cmd
Run Code Online (Sandbox Code Playgroud)


Sob*_*que 5

docker ps将列出正在运行的 docker 容器。

docker exec <id|name> ps会告诉你它正在运行的进程。

  • 这将从容器的角度呈现进程,我想从主机的角度找到进程,对于更多误解,我将编辑问题。 (2认同)