docker监控

一、docker自带的监控

随着线上服务的全面容器化,对Docker容器的监控就很重要了。传统的监控系统是物理机的监控,在一个物理机跑多个容器的情况下,我们是没法从一个监控图表里面区分各个容器的资源占用情况的。为了更好的监控容器运行情况,建议采用cadvisor+prometheus+grafana组合进行docker监控,或者采用cadvisor+InfluxDB+grafana组合进行dockers监控。首先docker自带几个监控子命令:ps、top和stats。

1.1 查看正在运行的容器

 [root@ldh ~]# docker ps
 CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS          PORTS     NAMES
 d473cb11f621   nginx:latest   "/docker-entrypoint.…"   2 seconds ago    Up 1 second     80/tcp    a2
 0563952adbd7   centos:7       "/bin/bash"              13 seconds ago   Up 12 seconds             a1

1.2 查看某个容器中运行了哪些进程

 [root@ldh ~]# docker top a2
 UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
 root                14174               14151               0                   16:15               ?                   00:00:00            nginx: master process nginx -g daemon off;
 101                 14219               14174               0                   16:15               ?                   00:00:00            nginx: worker process
 101                 14220               14174               0                   16:15               ?                   00:00:00            nginx: worker process
 101                 14221               14174               0                   16:15               ?                   00:00:00            nginx: worker process
 101                 14222               14174               0                   16:15               ?                   00:00:00            nginx: worker process

1.3 显示每个容器各种资源的使用情况

 [root@ldh ~]# docker stats
 CONTAINER ID   NAME      CPU %     MEM USAGE / LIMIT    MEM %     NET I/O     BLOCK I/O     PIDS
 d473cb11f621   a2        0.00%     3.535MiB / 3.84GiB   0.09%     656B / 0B   0B / 7.68kB   5
 0563952adbd7   a1        0.00%     404KiB / 3.84GiB     0.01%     656B / 0B   0B / 0B       1
 ​
 ​

默认会显示一个实时变化的列表,展示每个容器的CPU使用率,内存使用量和可用量。

注意:容器启动时如果没有特别指定内存限制,stats命令会显示docker主机的内存总量,但这并不意味着每个容器都能使用到这么多的内存。

此外,docker stats命令还会显示容器网络和磁盘的IO数据。

二、docker监控解决方案

ps,top,stats这几个命令是Docker自带的,优点是运行方便,很适合想快速了解容器运行状态的场景。其缺点是输出的数据有限,而且都是实时数据,无法反应历史变化和趋势。

因此,我们需要一种图能显示所有容器的运行状态,本次采用现在比较流行的cadvisor+prometheus+grafana组合进行Docker监控。cadvisor是专门用来采集数据的工具,也是goole公司的一款开源产品;grafana则是前端展示,支持多种数据源,定制非常灵活;而prometheus则作为数据源,同时存储从cadvisor获取到的数据。

2.1 cadvisor部署

 # 下载cadvisor镜像
 [root@ldh ~]# docker pull google/cadvisor
 ​
 # 创建运行cadvisor容器
 [root@ldh ~]# docker run -itd --name cadvisor -p 8080:8080 -v /:/rootfs:ro -v /var/run:/var/run:ro -v /sys:/sys:ro -v /var/lib/docker:/var/lib/docker:ro -v /dev/disk:/dev/disk:ro --detach=true --privileged --device=/dev/kmsg google/cadvisor
 47e24b9eb8c9814e3acb6c5b01193c896e7e301feb652089710a171644876744
 ​

cadvisor的主要功能总结起来主要有两点:

  1. 展示docker主机和容器两个层次的监控数据。

  2. 展示历史变化数据。

由于cadvisor提供的操作界面十分简陋,而且需要在不同页面之间跳转,并且只能监控一个docker主机,实用性不足。但cadvisor的一个亮点是它可以将监控到的数据导出给第三方工具,由这些工具进一步加工处理。

我们可以把cadvisor定位为一个监控数据收集器,收集和导出数据是它的强项,而非展示数据。cadvisor支持很多第三方工具,比如prometheus。

2.2 prometheus部署

2.2.1 prometheus概述

Prometheus(普罗米修斯)是一套开源的监控、报警和时间序列数据库的组合,起始是由SoundCloud公司开发的。随着发展,越来越多公司和组织接受采用Prometheus,社区也十分活跃,他们便将它独立成开源项目,并且有公司来运作。现在最常见的Kubernetes容器管理系统中,通常会搭配Prometheus进行监控。

Prometheus基本原理是通过HTTP协议周期性抓取被监控组件的状态,这样做的好处是任意组件只要提供HTTP接口就可以接入监控系统,不需要任何SDK或者其他的集成过程。这样做非常适合虚拟化环境比如VM或者Docker。

Prometheus应该是为数不多的适合Docker、Mesos、Kubernetes环境的监控系统之一。输出被监控组件信息的HTTP接口被叫做exporter。目前互联网公司常用的组件大部分都是exporter可以直接使用。

2.2.2 prometheus部署

基于docker部署prometheus需要先编写prometheus配置文件,将cadvisor数据源添加进来,然后做好时钟同步

 [root@ldh ~]# mkdir /etc/prometheus -v
 mkdir: created directory ‘/etc/prometheus’
 [root@ldh ~]# vim /etc/prometheus/prometheus.yml
 global:
   scrape_interval: 15s
   evaluation_interval: 15s
 alerting:
   alertmanagers:
   - static_configs:
     - targets:
 rule_files:
 scrape_configs:
   - job_name: 'prometheus'
     static_configs:
     - targets: ['192.168.100.5:9090']
   - job_name: 'cadvisor'
     static_configs:
     - targets: ['192.168.100.5:8080']
 [root@ldh ~]# chmod 777 /etc/prometheus/prometheus.yml
 ​
 [root@ldh ~]# systemctl restart chronyd
 [root@ldh ~]# systemctl enable chronyd
 [root@ldh ~]# hwclock -w

部署prometheus,将编辑好的文件映射到容器中,启动时加上--web.enable-lifecycle的作用是启用远程热加载配置文件,在修改prometheus配置文件后不用重启容器即可生效。

# 下载prometheus镜像
root@ldh ~]# docker pull prom/prometheus

# 创建运行prometheus容器
[root@ldh ~]# docker run -itd --name=prometheus -p 9090:9090 -v /etc/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus:latest --config.file=/etc/prometheus/prometheus.yml --web.enable-lifecycle
b101c8bf2ede77791b36f29f3e77ec29bf4e0d143ffe153e93099825e07b01ac

部署完成后访问http://ip:9090/targets,可以看到两个数据源已经启动,其中一个就是cadvisor。

2.3 grafana部署

Grafana是一个可视化面板,有着非常漂亮的图表和布局展示,功能齐全的度量仪表盘和图形编辑器,支持Graphite、zabbix、InfluxDB、Prometheus和OpenTSDB作为数据源。Grafana主要特性:灵活丰富的图形化选项;可以混合多种风格;支持白天和夜间模式;多个数据源。其项目官方地址为https://grafana.com

# 下载grafana镜像
[root@ldh ~]# docker pull grafana/grafana

# 创建运行grafana容器
[root@ldh ~]# docker run -itd --name grafana -p 3000:3000 grafana/grafana
7a249256005f9a633c5e01ab91057277db67fb6ff14cda7732109c0ee65dde1a

部署好后访问http://ip:3000,默认账号密码都是admin,如图所示,登录后会强制用户重新设置密码

登录成功后,点击Add data source,创建数据源。

点击第一个Prometheus。

填写数据源信息,在URL填写http://ip:9090,点击Save & Test。

添加仪表盘,输入ID号:193,点击Load

选择数据源

接下来既可以看到docker容器的监控画面,也会显示每个容器对CPU、内存和IO的使用情况,如图所示

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐