Docker监控

一、Docker自带的监控

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

1、docker ps 方便我们查看当前运行的容器
[root@stw ~]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@stw ~]# docker run -itd --name nginx nginx:latest 
3f4134af2f2434c655ba67ade7564b8f0baad50fb5763cb6c9602dac00858f17
[root@stw ~]# docker run -itd --name centos1 centos:7
2701736c2b7c55d2b8f7e84d1cfaa3e98ada31d735b6ff2ba36955bfb9aa8039
[root@stw ~]# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS          PORTS     NAMES
2701736c2b7c   centos:7       "/bin/bash"              2 seconds ago    Up 1 second               centos1
3f4134af2f24   nginx:latest   "/docker-entrypoint.…"   26 seconds ago   Up 25 seconds   80/tcp    nginx
2、如果想知道某个容器中运行了哪些进程,可以执行docker top命令
[root@stw ~]# docker top nginx 
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                62781               62760               0                   15:26               pts/0               00:00:00            nginx: master process nginx -g daemon off;
101                 62824               62781               0                   15:26               pts/0               00:00:00            nginx: worker process
101                 62825               62781               0                   15:26               pts/0               00:00:00            nginx: worker process
101                 62826               62781               0                   15:26               pts/0               00:00:00            nginx: worker process
101                 62827               62781               0                   15:26               pts/0               00:00:00            nginx: worker process
[root@stw ~]# docker top centos1
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                62955               62932               0                   15:26               pts/0               00:00:00            /bin/bash
3、docker stats用于显示每个容器各种资源的使用情况
[root@stw ~]# docker stats

在这里插入图片描述

默认会显示一个实时变化的列表,展示每个容器的CPU使用率,内存使用量和可用量。
注意:容器启动时如果没有特别指定内存limit,stats命令会显示Docker host的内存总量,但这并不意味着每个容器都能使用到这么多的内存。
除此之外docker stats 命令还会显示容器网络和磁盘的 IO 数据。
ps,top, stats 这几个命令是Docker自带的,优点是运行方便,很适合想快速了解容器运行状态的场景。
其缺点是输出的数据有限,而且都是实时数据,无法反应历史变化和趋势。

二、Docker监控解决方案

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

在这里插入图片描述

1、cAdvisor是google开发的容器监控工具,下面部署cAdvisor,示例如下,基于docker部署cAdvisor,对外提供8080服务端口号
[root@stw ~]# docker pull google/cadvisor
Using default tag: latest
latest: Pulling from google/cadvisor
ff3a5c916c92: Pull complete 
44a45bb65cdf: Pull complete 
0bbe1a2fe2a6: Pull complete 
Digest: sha256:815386ebbe9a3490f38785ab11bda34ec8dacf4634af77b8912832d4f85dca04
Status: Downloaded newer image for google/cadvisor:latest
docker.io/google/cadvisor:latest
[root@stw ~]# ss -anlt
State       Recv-Q Send-Q Local Address:Port               Peer Address:Port              
LISTEN      0      128             *:111                         *:*                  
LISTEN      0      128             *:6000                        *:*                  
LISTEN      0      5      192.168.122.1:53                          *:*                  
LISTEN      0      128             *:22                          *:*                  
LISTEN      0      128     127.0.0.1:631                         *:*                  
LISTEN      0      100     127.0.0.1:25                          *:*                  
LISTEN      0      128     127.0.0.1:6010                        *:*                  
LISTEN      0      128     127.0.0.1:6011                        *:*                  
LISTEN      0      128            :::111                        :::*                  
LISTEN      0      128            :::6000                       :::*                  
LISTEN      0      128            :::22                         :::*                  
LISTEN      0      128           ::1:631                        :::*                  
LISTEN      0      100           ::1:25                         :::*                  
LISTEN      0      128           ::1:6010                       :::*                  
LISTEN      0      128           ::1:6011                       :::*                  
[root@stw ~]# docker run -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 -p 8080:8080 --detach=true --name=cadvisor --privileged --device=/dev/kmsg google/cadvisor:latest 
fc1de438f2f64a83fb25d82b624a433dd85c782d13d353c7262bc010c33a007a
[root@stw ~]# docker ps
CONTAINER ID   IMAGE                    COMMAND                  CREATED         STATUS         PORTS                                       NAMES
fc1de438f2f6   google/cadvisor:latest   "/usr/bin/cadvisor -…"   8 seconds ago   Up 7 seconds   0.0.0.0:8080->8080/tcp, :::8080->8080/tcp   cadvisor
2701736c2b7c   centos:7                 "/bin/bash"              8 minutes ago   Up 8 minutes                                               centos1
3f4134af2f24   nginx:latest             "/docker-entrypoint.…"   8 minutes ago   Up 8 minutes   80/tcp                                      nginx
2、部署完毕后,访问http://ip:8080/containers/docker,即可看到监控界面。
Docker host的监控

在这里插入图片描述

docker容器的监控(点击docker)

在这里插入图片描述

以上就是cAdvisor的主要功能,总结起来主要两点:

1、展示Docker host和容器两个层次的监控数据。
2、展示历史变化数据。
由于cAdvisor提供的操作界面略显简陋,而且需要在不同页面之间跳转,并且只能监控一个Dockerhost,实用性缺陷不足。但cAdvisor的一个亮点是它可以将监控到的数据导出给第三方工具,由这些工具进一步加工处理。
我们可以把cAdvisor定位为一个监控数据收集器,收集和导出数据是它的强项,而非展示数据。cAdvisor支持很多第三方工具,其中就包括下一节要重点学习的Prometheus。

prometheus概述

​ Prometheus(普罗米修斯)是一套开源的监控、报警和时间序列数据库的组合,起始是由SoundCloud公司开发的。随着发展,越来越多公司和组织接受采用Prometheus,社区也十分活跃,他们便将它独立成开源项目,并且有公司来运作。Google SRE的书内页曾提到跟他们BorgMon监控系统相似的实现是Promethrus。现在最常见的Kubernetes容器管理系统中,通常会搭配Prometheus进行监控。
Prometheus基本原理是通过HTTP协议周期性抓取被监控组件的状态,这样做的好处是任意组件只要提供HTTP接口就可以接入监控系统,不需要任何SDK或者其他的集成过程。这样做非常适合虚拟化环境比如VM或Docker。
Prometheus应该是为数不多的适合Docker、Mesos、Kubernetes环境的监控系统之一。
输出被监控组件信息的HTTP接口被叫做exporter 。目前互联网公司常用的组件大部分都有exporter可以直接使用,比如Varnish、Haproxy、Nginx、MySQL、Linux 系统信息 (包括磁盘、内存、CPU、网络等等),具体支持的源看:https://github.com/prometheus。

1、基于docker部署Prometheus,需要先编写Prometheus配置文件,将cAdvisor数据源添加进来,然后做好时钟同步
[root@stw ~]# mkdir -p /etc/prometheus
[root@stw ~]# vim /etc/prometheus/prometheus.yml
[root@stw ~]# cat /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.10:9090']
  - job_name: 'cadvisor'
    static_configs:
    - targets: ['192.168.100.10:8080']
[root@stw ~]# chmod 777 /etc/prometheus/prometheus.yml 
[root@stw ~]# systemctl restart chronyd
[root@stw ~]# systemctl enable chronyd
2、部署Prometheus,将编辑好的文件映射到容器中,启动时加上–web.enable-lifecycle的作用是启用远程热加载配置文件,在修改prometheus配置文件后不用重启容器即可生效
[root@stw ~]# docker pull prom/prometheus
Using default tag: latest
latest: Pulling from prom/prometheus
Digest: sha256:76947e7ef22f8a698fc638f706685909be425dbe09bd7a2cd7aca849f79b5f64
Status: Image is up to date for prom/prometheus:latest
docker.io/prom/prometheus:latest
[root@stw ~]# 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
9e841e431972db39fdf0ecb3f0b5ef2e67b7c5bd6cf20d52c9b0cb3812e3cf31
[root@stw ~]# docker ps
CONTAINER ID   IMAGE                    COMMAND                  CREATED          STATUS          PORTS                                       NAMES
9e841e431972   prom/prometheus:latest   "/bin/prometheus --c…"   4 seconds ago    Up 2 seconds    0.0.0.0:9090->9090/tcp, :::9090->9090/tcp   prometheus
fc1de438f2f6   google/cadvisor:latest   "/usr/bin/cadvisor -…"   31 minutes ago   Up 31 minutes   0.0.0.0:8080->8080/tcp, :::8080->8080/tcp   cadvisor
2701736c2b7c   centos:7                 "/bin/bash"              39 minutes ago   Up 39 minutes                                               centos1
3f4134af2f24   nginx:latest             "/docker-entrypoint.…"   39 minutes ago   Up 39 minutes   80/tcp                                      nginx
如图所示,部署完毕后,访问http://ip:9090/targets,可以看到两个数据源已经UP,其中一个就是cAdvisor

在这里插入图片描述

Grafana部署

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

1、基于Daocker部署Grafana
[root@stw ~]#docker pull grafana/grafana
[root@stw ~]#docker run -itd --name=grafana -p 3000:3000 grafana/grafana
2、部署完毕后,访问http://ip:3000/login,默认账号密码都是admin

在这里插入图片描述

接下来Grafana会强制用户重新设置登陆密码

在这里插入图片描述

3、登陆成功后,点击Add data source,创建数据源。或者点击左侧设置图标,也可以创建数据源

在这里插入图片描述

点击第一个Prometheus

在这里插入图片描述

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

在这里插入图片描述

在这里插入图片描述

添加仪表盘,鼠标移到左侧的加号位置,点击Import,输入ID号:193

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

点击空白处,就会自动从Grafana官网下载所对应的仪表盘,在prometheus处,选择数据源,点击Import

在这里插入图片描述

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

在这里插入图片描述

查找模版ID——对应刚刚的193(搜索grafana官网,拉倒最后面有Dashboard templates)

在这里插入图片描述

在这里插入图片描述

总结

1、为了更好的监控容器运行情况,建议采用cAdvisor+Prometheus+Grafana组合进行Docker监控。

2、cAdvisor是专门用来采集数据的工具,也是google公司的一款开源产品,Grafana则是前端展示,支持多种数据源,定制非常灵活。而Prometheus则作为数据源,同时存储从cAdvisor获取到的数据。

3、我们可以把cAdvisor定位为一个监控数据收集器,收集和导出数据是它的强项,而非展示数据。

4、对于linux系统工程师而言,Docker监控很重要,我们能够通过监控掌握每个容器的当前运行情况。还可以通过监控的历史纪录分析每个容器的运行状况。

5、cAdvisor是专门用来采集数据的工具,也是google公司的一款开源产品,Grafana则是前端展示,支持多种数据源,定制非常灵活。而Prometheus则作为数据源,同时存储从cAdvisor获取到的数据。

6、如果在Grafana仪表盘中看不到数据,很有可能是Docker host与你的台式机或者笔记本时间不一致。

Logo

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

更多推荐