我有一个非常简单的 Ubuntu 容器,其中运行着 apache。当我使用以下命令启动容器时:
$ sudo docker run -p 192.168.189.134:80:80 -d wnoorduin/apache
其中 192.168.189.134 是我的 IP 地址,查看 docker 主机上的进程,我看到:
$ sudo ps -ef | grep docker root 35701 1 0 13:46 ?
00:00:14 /usr/bin/docker 守护进程 root 37825 35701 0 14:47 ?
00:00:00 docker-proxy -proto tcp -host-ip 192.168.189.134 -host-port 80 -container-ip 172.17.0.2 -container-port 80 root 37946 3465 0 14:53 pts/0 00:00:00 grep --color=auto dockerroot @ willems-vm:/#ps -ef | grep apache root 37832 35701 0 14:
47?00:00:00 / bin / sh / usr / sbin / apache2ctl -D FOREGROUND root 37856 37832 0 14:47?00:00:00 / usr / sbin / apache2 -D FOREGROUND www-data 37857 37856 0 14:47?00:00:00 / usr / sbin / apache2 -D FOREGROUND www-data 37858 37856 0 14:47? 00:00:00 /usr/sbin/apache2 -D FOREGROUND root 37950 3465 0 14:54 pts/0
00:00:00 grep --color=auto apache
和:
root @ willems-vm:/#ps -efZ | grep docker unconfined
root 35701 1 0 13:46?00:00:14 / usr / bin / docker daemon unconfined root 37825 35701 0 14:47?
00:00:00 docker-proxy -proto tcp -host-ip 192.168.189.134 -host-port 80 -container-ip 172.17.0.2 -container-port 80 docker-default
root 37832 35701 0 14:47?00:00:00 / bin / sh / usr / sbin / apache2ctl -D FOREGROUND docker-default
root 37856 37832 0 14:47? 00:00:00 /usr/sbin/apache2 -D FOREGROUND docker-default www-data 37857 37856 0 14:47 ? 00:00:00 /usr/sbin/apache2 -D FOREGROUND docker-default www-data 37858 37856 0 14:47 ? 00:00:00 /usr/sbin/apache2 -D FOREGROUND unconfined root 37952 3465 0 14:55 pts/0 00:00:00 grep --color=auto docker
因此,将 SELinux 的 Z 放入其中后,我可以确认 apache2 进程来自 docker 容器。在我以前配置 Solaris 容器的时候,实际上可以在 ps 列表中看到区域名称(这被称为区域)(如果我没记错的话,它也是 ps -efZ,但 Z 当时的含义完全不同)。
当运行一个容器时,情况还不算太糟,但当运行 10 个容器时,您无法将进程追踪到容器。那么:有没有办法在 docker 主机上执行此操作,而无需 docker 命令?
答案1
常规旧ps
命令不支持 docker,因此无法使用该命令查看容器名称。
有一款名为 sysdig 的工具非常强大。它可以显示很多不同的东西,而且可以识别容器。
有些人认为 sysdig 唯一的缺点是它需要内核模块才能工作。它收集进程实际执行的数据,并可以真正深入了解系统上任何事物的健康状况和状态。
我通常运行 csysdig 工具来获取 curses 交互式类型工具。
运行后sudo csysdig -pc
我看到了以下进程视图:
Viewing: Processes For: whole machine
Source: Live System Filter: evt.type!=switch
PID VPID CPU USER TH VIRT RES FILE NET Container Command
27485 27485 2.00 root 1 132M 37M 0 0.00 host csysdig -pc
29099 7 0.50 root 18 3G 369M 0 0.00 boss_twilight java -XX:MaxPermSize=128M
30969 241 0.50 42 2G 325M 0 2.18K gitlab sidekiq 3.3.0 gitlab-rails
30137 93 0.50 52 1G 42M 0 274.50 splunk mongod --dbpath=/opt/splun
29236 16 0.50 root 30 3G 1G 0 0.00 bossmc_forge-1.7.10 java -XX:MaxPermSize=128M
32654 7 0.50 root 1 96M 12M 0 18.84K bossmc_lanannounce python lanannounce.py
30965 237 0.50 3 38M 2M 7K 183.50 gitlab /opt/gitlab/embedded/bin/r
28597 28597 0.00 root 5 106M 464K 0 0.00 host /usr/bin/docker-proxy -pro
31029 270 0.00 1 27M 2M 0 0.00 gitlab postgres: stats collector
28542 28542 0.00 root 6 114M 468K 0 0.00 host /usr/bin/docker-proxy -pro
28500 28500 0.00 root 5 42M 444K 0 0.00 host /usr/bin/docker-proxy -pro
28517 28517 0.00 root 5 106M 580K 0 0.00 host /usr/bin/docker-proxy -pro
28366 28366 0.00 root 5 42M 176K 0 0.00 host /usr/bin/docker-proxy -pro
17675 17675 0.00 root 1 19M 1M 0 0.00 host /lib/systemd/systemd-login
28409 28409 0.00 root 5 42M 420K 0 0.00 host /usr/bin/docker-proxy -pro
28634 28634 0.00 root 6 50M 388K 0 0.00 host /usr/bin/docker-proxy -pro
1 1 0.00 root 1 28M 3M 0 0.00 host /lib/systemd/systemd --sys
31289 282 0.00 1 19M 3M 6 0.00 gitlab /bin/bash /opt/gitlab/embe
28613 28613 0.00 root 5 106M 404K 0 0.00 host /usr/bin/docker-proxy -pro
30941 223 0.00 root 1 4M 1M 0 0.00 gitlab runsv logrotate
29409 12 0.00 root 1 20M 12K 0 0.00 auto-proxy /bin/bash -c source ".prof
28643 28643 0.00 root 5 106M 500K 0 0.00 host /usr/bin/docker-proxy -pro
31696 353 0.00 2 374M 107M 0 0.00 gitlab unicorn worker[3] -D -E pr
668 668 0.00 root 1 14M 180K 0 0.00 host /sbin/agetty --noclear tty
30948 230 0.00 root 1 4M 584K 0 0.00 gitlab svlogd -tt /var/log/gitlab
28508 28508 0.00 root 6 115M 764K 0 0.00 host /usr/bin/docker-proxy -pro
659 659 0.00 root 1 4M 176K 0 0.00 host /usr/sbin/acpid
F1Help F2Views F4FilterF5Echo F6Dig F7LegendF8ActionsF9Sort F12SpectroCTRL+FSearchp Pause 1/146(0.7%)
这显示了每个进程的运行位置。例如,我有几个 minecraft 服务器。bossmc_forge-1.7.10
是其中一个服务器,它运行的 JVM 是我的服务器。我还有一个 gitlab 容器和一个 splunk 容器,还有其他一些容器。
csysdig 命令与 top 的相似度比与 ps 的相似度高得多,但它的功能要多得多。总体而言,sysdig 的学习难度较大,但随着时间的推移,我发现我使用它的次数越来越多。容器感知等小细节对使其成为一款出色的工具大有裨益。