在进程列表中识别 Docker 中正在运行的进程

在进程列表中识别 Docker 中正在运行的进程

我意识到在 Docker 容器内运行的进程出现在主机的进程列表中:

# ps aux | grep mariadb
root     12486  0.0  0.0 112812   976 pts/0    S+   14:47   0:00 grep --color=auto mariadb

有没有办法识别某个进程是在主机上运行还是在 Docker 容器上运行,或者有没有办法过滤掉 Docker 进程?

答案1

找到答案了。

要过滤未在 Docker 进程中运行的进程,我们可以使用以下命令:

ps -e -o pid,comm,cgroup | grep -v "/docker/"

因此,例如,如果我想终止所有未在 Docker 内运行的“php-fpm”进程,我可以执行以下操作:

kill -9 $(ps -e -o pid,comm,cgroup | grep -v "/docker/" | awk '$2 == "php-fpm" {print $1}')

答案2

如果我想快速查看哪些进程由什么启动,我通常会使用类似的工具htop(按 F5 进入树模式)或pstree

输出pstree看起来有点像这样:

systemd─┬─VGAuthService
        ├─abrt-dbus───3*[{abrt-dbus}]
        ├─abrt-watch-log
        ├─abrtd
        ├─chronyd
        ├─crond
        ├─dockerd─┬─docker-containe─┬─4*[docker-containe─┬─pause]
        │         │                 │                    └─9*[{docker-containe}]]
        │         │                 ├─docker-containe─┬─kube-apiserver───16*[{kube-apiserver}]
        │         │                 │                 └─9*[{docker-containe}]
        │         │                 ├─docker-containe─┬─kube-scheduler───14*[{kube-scheduler}]
        │         │                 │                 └─10*[{docker-containe}]
        │         │                 ├─docker-containe─┬─kube-controller───13*[{kube-controller}]
        │         │                 │                 └─10*[{docker-containe}]
        │         │                 ├─4*[docker-containe─┬─pause]
        │         │                 │                    └─10*[{docker-containe}]]
        │         │                 ├─docker-containe─┬─kube-proxy───12*[{kube-proxy}]
        │         │                 │                 └─9*[{docker-containe}]
        │         │                 ├─docker-containe─┬─node_exporter───31*[{node_exporter}]
        │         │                 │                 └─10*[{docker-containe}]
        │         │                 └─29*[{docker-containe}]
        │         └─47*[{dockerd}]

它可以轻松显示哪些进程由什么启动。

htop位于 RHEL 上的 EPEL Repo 中。
pstree由包安装psmisc

这不是最技术性的答案,但最好的答案似乎已经存在于评论中。

答案3

cgroup 2.0 并不表明您正在 docker 容器中运行,它也不适用于 Mac 上的 Docker Desktop。

root@8a1d175a0b6c:/# ps -e -o pid,comm,cgroup PID COMMAND CGROUP 1 tini - 7 java - 3081 bash - 3282 ps -

您可以查找 /.dockerenv,但它是一个空文件,因此没有统一、可靠的方法来获取您自己的 docker 容器 ID。Docker 团队在这方面确实失误了。

相关内容