我意识到在 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 团队在这方面确实失误了。