从主机视角找出Docker容器的进程

在物理主机上,观察Docker的进程,会发现不容易直接找到某个进程究竟是哪个容器中的进程。

例如

#top
top - 21:59:50 up 162 days, 22:06,  1 user,  load average: 41.84, 41.87, 40.47
Tasks: 1467 total,   5 running, 1459 sleeping,   0 stopped,   3 zombie
%Cpu(s): 29.2 us, 18.5 sy,  0.0 ni, 47.5 id,  0.1 wa,  2.9 hi,  1.8 si,  0.0 st
KiB Mem : 26316931+total, 25308768 free, 19596931+used, 41891228 buff/cache
KiB Swap:  2097148 total,  2097148 free,        0 used. 50833336 avail Mem

   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
115752 admin     20   0   24.9g   5.3g  77060 S 163.8  2.1 582:47.03 java
  7637 admin     20   0   27.0g   5.7g  78384 S 138.8  2.3   1149:09 java
 91225 admin     20   0   15.2g   2.5g  37128 S 112.6  1.0 909:04.82 java
 14063 admin     20   0   24.6g   3.7g  37000 S 102.6  1.5 847:11.42 java
 93907 root      20   0    9248   2100   1972 R  98.4  0.0 139:47.84 sh
107043 admin     20   0   31.9g   3.4g  37488 S  98.1  1.4   1106:00 java
 33975 root      20   0    9248   2084   1952 R  95.5  0.0  81:57.60 sh

上述 9390733975 进程只看出是一个shell进程,但是在Host上不知道是哪个容器中运行。

#ps aux | grep 93907 | grep -v grep
root      93907 96.5  0.0   9248  2100 ?        R    19:35 127:55 /bin/sh /xxxx/log_rotate.sh

#ps aux | grep 33975 | grep -v grep
root      33975 96.6  0.0   9248  2084 ?        R    20:35  70:11 /bin/sh /xxxx/log_rotate.sh

systemdctl提供了一个命令可以按照 systemd-cgls 以树状方式递归检查Linux控制组的层次结构,非常容易循着tree找出某个进程编号对应的容器id。

例如:

systemd-cgls

进入vi模式,可以通过 / 搜索 9390733975

│ ├─063048f7f375a94dcb63d5ac9e50bc2343e06df93b60cc628450bd2f01241ee0
│ │ ├─ 30379 /opt/bin/java -server ...
...
│ │ ├─ 33975 /bin/sh /home/admin/spanner/sbin/log_rotate.sh
...
│ │ ├─ 93907 /bin/sh /xxxx/log_rotate.sh

可以看出 9390733975 进程都属于容器 063048f7f375a94dcb63d5ac9e50bc2343e06df93b60cc628450bd2f01241ee0

然后检查容器

docker ps

可以看到对应的容器如下:

CONTAINER ID        IMAGE                                                                        COMMAND                  CREATED             STATUS              PORTS               NAMES
...
063048f7f375        reg.docker.example.com/dev/centos6u2:20181229a                         "/sbin/init"             33 hours ago        Up 33 hours                             exam-app-5157

这样就可以对应找到容器并登陆容器进行进一步检查。

参考

Last updated