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

时间:2016-01-19 14:02:11

标签: linux docker process-migration

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

是否有一种方法可以用来从主机的角度查找与其名称或ID 的Docker容器相关的所有进程。

毕竟,在一天结束时,一个容器被设置为虚拟化进程。

8 个答案:

答案 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容器及其相应的主机进程。

此方法的两个有趣属性:

  1. 即使Docker守护程序已经不存在,它也能正常工作。
  2. 这是一个非常快速的概述。
  3. 您还可以使用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

享受吧!