docker监控
docker监控
1 Docker自带的监控
随着线上服务的全面容器化,对Docker容器的监控就很重要了。传统的监控系统是物理机的监控,在一个物理机跑多个容器的情
况下, 我们是没法从一个监控图表里面区分各个容器的资源占用情况的。为了更好的监控容器运行情况, 建议采用
cAdvisor+Prometheus+Grafana组合进行Docker监控,或者采用cAdvisor+InfluxDB+Grafana组合进行Docker监控。首先我们先学
习Docker自带的几个监控子命令:ps、top和stats。Docker 自带的监控子命令如下:
1、docker ps是我们早已熟悉的命令了,方便我们查看当前运行的容器,示例如下
[root@ws ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6b214eca3310 centos:7 "/bin/bash" 3 minutes ago Up 3 minutes a2
de01e09effc4 nginx:latest "/docker-entrypoint.…" 4 minutes ago Up 4 minutes 80/tcp a1
2、如果想知道某个容器中运行了哪些进程,可以执行docker top命令,示例如下
[root@ws ~]# docker top a1
UID PID PPID C STIME TTY TIME CMD
root 35034 35011 0 15:17 pts/0 00:00:00 nginx: master process nginx -g daemon off;
101 35077 35034 0 15:17 pts/0 00:00:00 nginx: worker process
101 35078 35034 0 15:17 pts/0 00:00:00 nginx: worker process
101 35079 35034 0 15:17 pts/0 00:00:00 nginx: worker process
101 35080 35034 0 15:17 pts/0 00:00:00 nginx: worker process
3、docker stats用于显示每个容器各种资源的使用情况,示例如下。
[root@ws ~]# docker stats
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
6b214eca3310 a2 0.00% 400KiB / 3.84GiB 0.01% 656B / 0B 0B / 0B 1
de01e09effc4 a1 0.00% 3.531MiB / 3.84GiB 0.09% 656B / 0B 0B / 7.68kB 5
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
6b214eca3310 a2 0.00% 400KiB / 3.84GiB 0.01% 656B / 0B 0B / 0B 1
de01e09effc4 a1 0.00% 3.531MiB / 3.84GiB 0.09% 656B / 0B 0B / 7.68kB 5
默认会显示一个实时变化的列表,展示每个容器的CPU使用率,内存使用量和可用量。
注意:容器启动时如果没有特别指定内存limit,stats命令会显示Docker host的内存总量,但这并不意味
着每个容器都能使用到这么多的内存。
除此之外docker stats 命令还会显示容器网络和磁盘的 IO 数据。
ps,top, stats 这几个命令是Docker自带的,优点是运行方便,很适合想快速了解容器运行状态的场景。
其缺点是输出的数据有限,而且都是实时数据,无法反应历史变化和趋势。
2 Docker监控解决方案
因此, 我们需要一张图能显示所有容器的运行状态, 本次采用现在比较流行的
cAdvisor+Prometheus+Grafana组合进行Docker监控。cAdvisor是专门用来采集数据的工
具,也是google公司的一款开源产品,Grafana则是前端展示,支持多种数据源,定制非常灵
活。而Prometheus则作为数据源,同时存储从cAdvisor获取到的数据。监控解决方案,如图
所示

cAdvisor部署
1、cAdvisor是google开发的容器监控工具,下面部署cAdvisor,示例如下,基于docker部署cAdvisor,对外提供8080服务端口号。
[root@ws ~]# 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@ws ~]# docker run -d -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
17850155c6ca83cfcd7d99188f7c7c5f7b99fed5bb67e0e9138fd02da67e86bf
部署完毕后,访问http://ip:8080/containers/docker,即可看到监控界面。如图1所示,显示的是
Docker host的监控。如图2所示,显示的是docker容器的监控


以上就是cAdvisor的主要功能,总结起来主要两点:
1、展示Docker host和容器两个层次的监控数据。
2、展示历史变化数据。
由于cAdvisor提供的操作界面略显简陋,而且需要在不同页面之间跳转,并且只能监控一个Docker
host,实用性缺陷不足。但cAdvisor的一个亮点是它可以将监控到的数据导出给第三方工具,由这些工具
进一步加工处理。
我们可以把cAdvisor定位为一个监控数据收集器,收集和导出数据是它的强项,而非展示数据。
cAdvisor支持很多第三方工具,其中就包括下一节要重点学习的Prometheus。
prometheus概述
Prometheus(普罗米修斯)是一套开源的监控、报警和时间序列数据库的组合,起始是由SoundCloud公司开发
的。随着发展,越来越多公司和组织接受采用Prometheus,社区也十分活跃,他们便将它独立成开源项目,并且有公
司来运作。Google SRE的书内也曾提到跟他们BorgMon监控系统相似的实现是Prometheus。现在最常见的
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。
prometheus部署
1、基于docker部署Prometheus,需要先编写Prometheus配置文件,将cAdvisor数据源添加进来,然后做好时钟同步,示例如下
[root@ws ~]# mkdir -p /etc/prometheus
[root@ws ~]# cd /etc/prometheus/
[root@ws prometheus]# vim prometheus.yml
[root@ws prometheus]# vim prometheus.yml
[root@ws prometheus]# chmod 777 prometheus.yml
[root@ws prometheus]# systemctl restart chronyd
[root@ws prometheus]# systemctl enable chronyd
Created symlink from /etc/systemd/system/multi-user.target.wants/chronyd.service to /usr/lib/systemd/system/chronyd.service.
[root@ws prometheus]# hwclock -w
[root@ws prometheus]# cat 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.110.10:9090']
- job_name: 'cadvisor'
static_configs:
- targets: ['192.168.110.10:8080']
2、部署Prometheus,将编辑好的文件映射到容器中,启动时加上–web.enable-lifecycle的作用是启用远程热加载配置文件,在修改
prometheus配置文件后不用重启容器即可生效
[root@ws prometheus]# docker pull prom/prometheus
Using default tag: latest
latest: Pulling from prom/prometheus
9fa9226be034: Pull complete
1617e25568b2: Pull complete
15e2cd5823b3: Pull complete
d14d9311398e: Pull complete
4314b14247f8: Pull complete
03def9af9150: Pull complete
7dc70dd519ad: Pull complete
92fd369f57f0: Pull complete
0357ac67262f: Pull complete
e9fa37e588a8: Pull complete
Digest: sha256:76947e7ef22f8a698fc638f706685909be425dbe09bd7a2cd7aca849f79b5f64
Status: Downloaded newer image for prom/prometheus:latest
docker.io/prom/prometheus:latest
[root@ws prometheus]# docker run -itd --name=prometheus -p 9090:9090 -v /etc/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus --config.file=/etc/prometheus/prometheus.yml --web.enable lifecycle
cc6263bd9db32e7825d3a138485dc434f1df71ad930d37af6062486acc3616f0
如图所示,部署完毕后,访问http://ip:9090/targets,可以看到两个数据源已经UP,其中一个就是cAdvisor。

Grafana部署
Grafana是一个可视化面板(Dashboard),有着非常漂亮的图表和布局展示,功能齐全的度量仪表盘和图形编辑器,支持
Graphite、zabbix、InfluxDB、Prometheus和OpenTSDB作为数据源。Grafana主要特性:灵活丰富的图形化选项;可以混合多种风
格;支持白天和夜间模式;多个数据源。其项目官方地址为https://grafana.com。
1、基于Daocker部署Grafana,示例如下。
[root@ws ~]# docker pull grafana/grafana
Using default tag: latest
latest: Pulling from grafana/grafana
9824c27679d3: Pull complete
f28af41ca6c1: Pull complete
08b443d0d1f0: Pull complete
01a7b2849125: Pull complete
b24c04af690f: Pull complete
f04b4ef9a69c: Pull complete
0a5ad0679b58: Pull complete
41d23bd5dd1c: Pull complete
ef84c8d2bf22: Pull complete
f671127533d7: Pull complete
Digest: sha256:74144189b38447facf737dfd0f3906e42e0776212bf575dc3334c3609183adf7
Status: Downloaded newer image for grafana/grafana:latest
docker.io/grafana/grafana:latest
[root@ws ~]# docker run -itd --name=grafana -p 3000:3000 grafana/grafana
2cc23e542886beba9290b8217abca38a2cba682df78c762e9134e7746ff7f0b8
2、部署完毕后,访问http://ip:3000/login,默认账号密码都是admin,如图所示。接下来Grafana会强制用户重新设置登陆密
码,如图所示。

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

4、如图所示,点击第一个Prometheus。

5、如图所示,填写数据源信息,在URL填写http://ip:9090,点击Save & Test。

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

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

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

更多推荐


所有评论(0)