当 Docker 部署规模逐步变大后,可视化监控容器环境的性能和健康状态会变得越来越重要,目前比较常用的容器监控工具和方案
1、Docker 自带的几个监控子命令:ps、top、stats
docker container ps
root@host1:~# docker container ls --help
root@host1:~# docker container ps --help
root@host1:~# docker ps --help #这三个命令是一样的
Usage: docker container ls [OPTIONS]
List containers
Aliases:
ls, ps, list
Options:
-a, --all Show all containers (default shows just running)
-f, --filter filter Filter output based on conditions provided
--format string Pretty-print containers using a Go template
-n, --last int Show n last created containers (includes all states) (default -1)
-l, --latest Show the latest created container (includes all states)
--no-trunc Don't truncate output
-q, --quiet Only display numeric IDs
-s, --size Display total file sizes
root@host1:~# docker ps
root@host1:~# docker container ps
root@host1:~# docker container ls #三个命令是一样的
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b89ca1da78c3 busybox "sh" About a minute ago Up About a minute sad_sanderson
7874b10cb1d4 httpd "httpd-foreground" 2 minutes ago Up 2 minutes 80/tcp keen_yalow
root@host1:~# docker ps -a
root@host1:~# docker container ps -a
root@host1:~# docker container ls -a #三个命令的一样的
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
07373028ad05 busybox "sh" About a minute ago Exited (0) About a minute ago stoic_jepsen
b89ca1da78c3 busybox "sh" About a minute ago Up About a minute sad_sanderson
7874b10cb1d4 httpd "httpd-foreground" 2 minutes ago Up 2 minutes 80/tcp keen_yalow
docker container top container
如果想知道某容器运行了哪些进程,可以执行 docker top
还可以在最后面跟上linux中ps的参数 -aux
root@host1:~# docker top --help
root@host1:~# docker container top --help #两个命令一样的
Usage: docker top CONTAINER [ps OPTIONS]
Display the running processes of a container
运行容器通过top命令查看
[root@localhost ~]# docker run -d --name lamp mattrayner/lamp
5e0e2edef27dc26a99294ad91ce2347320f57dc54f96223e75d5c49998019f49
docker container top lamp
[root@localhost ~]# docker container top lamp
[root@localhost ~]# docker top lamp #两个命令输出结果一样
UID PID PPID C STIME TTY TIME CMD
root 9512 9488 1 10:20 ? 00:00:00 /usr/bin/python /usr/bin/supervisord -n
root 10029 9512 0 10:20 ? 00:00:00 /bin/sh /usr/bin/mysqld_safe
root 10030 9512 4 10:20 ? 00:00:00 apache2 -D FOREGROUND
1000 10217 10030 0 10:20 ? 00:00:00 apache2 -D FOREGROUND
1000 10220 10030 0 10:20 ? 00:00:00 apache2 -D FOREGROUND
1000 10222 10030 0 10:20 ? 00:00:00 apache2 -D FOREGROUND
1000 10223 10030 0 10:20 ? 00:00:00 apache2 -D FOREGROUND
1000 10226 10030 0 10:20 ? 00:00:00 apache2 -D FOREGROUND
polkitd 10441 10029 4 10:20 ? 00:00:00 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib/mysql/plugin --user=mysql --log-error=/var/log/mysql/error.log --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/run/mysqld/mysqld.sock --port=3306 --log-syslog=1 --log-syslog-facility=daemon --log-syslog-tag=
[root@localhost ~]#
[root@localhost ~]# docker top lamp -aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 9512 0.0 1.7 58712 17312 ? Ss 10:20 0:00 /usr/bin/python /usr/bin/supervisord -n
root 10029 0.0 0.0 4616 752 ? S 10:20 0:00 /bin/sh /usr/bin/mysqld_safe
root 10030 0.0 2.1 536896 20936 ? S 10:20 0:00 apache2 -D FOREGROUND
1000 10217 0.0 0.8 536928 8608 ? S 10:20 0:00 apache2 -D FOREGROUND
1000 10220 0.0 0.8 536928 8608 ? S 10:20 0:00 apache2 -D FOREGROUND
1000 10222 0.0 0.8 536928 8608 ? S 10:20 0:00 apache2 -D FOREGROUND
1000 10223 0.0 0.8 536928 8608 ? S 10:20 0:00 apache2 -D FOREGROUND
1000 10226 0.0 0.8 536928 8608 ? S 10:20 0:00 apache2 -D FOREGROUND
polkitd 10441 0.1 18.9 1176104 188524 ? Sl 10:20 0:01 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib/mysql/plugin --user=mysql --log-error=/var/log/mysql/error.log --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/run/mysqld/mysqld.sock --port=3306 --log-syslog=1 --log-syslog-facility=daemon --log-syslog-tag=
[root@localhost ~]#
[root@localhost ~]# docker top lamp -aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 9512 0.0 1.7 58712 17312 ? Ss 10:20 0:00 /usr/bin/python /usr/bin/supervisord -n
root 10029 0.0 0.0 4616 752 ? S 10:20 0:00 /bin/sh /usr/bin/mysqld_safe
root 10030 0.0 2.1 536896 20936 ? S 10:20 0:00 apache2 -D FOREGROUND
1000 10217 0.0 0.8 536928 8608 ? S 10:20 0:00 apache2 -D FOREGROUND
1000 10220 0.0 0.8 536928 8608 ? S 10:20 0:00 apache2 -D FOREGROUND
1000 10222 0.0 0.8 536928 8608 ? S 10:20 0:00 apache2 -D FOREGROUND
1000 10223 0.0 0.8 536928 8608 ? S 10:20 0:00 apache2 -D FOREGROUND
1000 10226 0.0 0.8 536928 8608 ? S 10:20 0:00 apache2 -D FOREGROUND
polkitd 10441 0.1 18.9 1176104 188524 ? Sl 10:20 0:01 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib/mysql/plugin --user=mysql --log-error=/var/log/mysql/error.log --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/run/mysqld/mysqld.sock --port=3306 --log-syslog=1 --log-syslog-facility=daemon --log-syslog-tag=
[root@localhost ~]#
docker container stats
该命令用于显示每个容器各种资源的使用情况,默认会显示一个实时变化的列表,展示每个容器的CPU、MEM的使用率和可用量,还有网络和IO的情况。
ps:容器启动时如果没有特别指定内存 limit 、stats命令会显示host的内存总量,但这并不意味着每个容器都能使用到这么多大的内存。
我们还可以查看指定容器的性能,只需在后面指定容器的名字即可,可以是一个,也可以是多个
[root@localhost ~]# docker container stats
CONTAINER CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
5e0e2edef27d 0.03% 198 MiB / 972.6 MiB 20.36% 656 B / 656 B 218 MB / 531 MB 35
3813d4577cbf 0.00% 56 KiB / 972.6 MiB 0.01% 2.01 kB / 656 B 0 B / 0 B 1
容器启动时如果没有特别指定内存 limit,stats 命令会显示 host 的内存总量,但这并不意味着每个 container 都能使用到这么多的内存
root@host1:~# docker container stats lamp admiring_bohr
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
b67aded0f855 lamp 0.04% 206.7MiB / 1.953GiB 10.34% 648B / 0B 4.61MB / 398MB 35
3c9c0f060dd0 admiring_bohr 0.04% 209.1MiB / 1.953GiB 10.45% 648B / 0B 60.6MB / 375MB 35
ps、top、stats这几个命令是docker 自带的,有点是运行方便,很适合想快速了解容器运行状态的场景。缺点是输出的数据有限,而且都是实时数据,无法反应历史变化和趋势。