84

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

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

毕竟,归根结底,容器是一组虚拟化进程。

4

8 回答 8

86

你可以使用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>
于 2016-01-19T15:19:46.523 回答
38

另一种了解主机上运行的所有 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. 这是一个非常快速的概述。

您还可以使用systemd-cgtopDocker 容器的资源使用情况概览,类似于top.

顺便说一句:由于 systemd 服务也对应于 cgroups,这些方法也适用于非 Dockerized 的 systemd 服务。

于 2018-02-22T08:05:35.407 回答
23

在 docker容器中运行的进程是名为containerd-shim(在 Docker v18.09.4 中)的进程的子进程

  • 首先找出进程的进程ID 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
于 2016-01-19T14:44:59.420 回答
12

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
于 2020-10-21T18:45:39.630 回答
7

在主机上运行它时,它将为您提供在容器中运行的进程列表,其中<Container ID>显示主机 PID 而不是容器 PID。

DID=$(docker inspect -f '{{.State.Pid}}' <Container ID>);ps --ppid $DID -o pid,ppid,cmd
于 2019-08-15T07:21:42.500 回答
6

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

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

于 2016-01-19T14:04:28.270 回答
1

由于以下命令仅显示容器本身的进程 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
于 2021-06-21T05:58:16.450 回答
-3

Docker stats "container id" 显示资源消耗以及 pid 或简单的 Docker ps 。

可能这个备忘单可以使用。 http://theearlybirdtechnology.com/2017/08/12/docker-cheatsheet/

于 2017-08-22T20:42:11.823 回答