利用谷歌开源工具cAdvisor 结合influxdb存储+Grafana前端展示进行Docker容器的监控
一、Docker 监控方式
1.利用docker 的 docker stats API
命令: docker stats [容器ID/容器名称]
[root@docker ~]# docker stats --help Usage: docker stats [OPTIONS] [CONTAINER...] Display a live stream of container(s) resource usage statistics -a, --all Show all containers (default shows just running)
--help Print usage
--no-stream Disable streaming stats and only pull the first result
参数:-a, --all 表示查看所有容器包括已经exit状态的
--no-stream 表示仅拉取第一次的请求结果后就结束
示例:查看下某个容器的状态
[root@docker ~]# docker stats --no-stream cadvisor
CONTAINER CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O
cadvisor 1.48% 62.48 MB / 3.977 GB 1.57% 4.902 MB / MB 18.93 MB / B
从上面可以看到容器的资源使用,包括CPU、内存、内存使用率、网络入口IO、磁盘IO、及内存LIMIT。该方式比较简单明了,就像系统自带的top命令一样。
2.利用谷歌开源工具cAdvisor(官网)
创建容器,如果docker主机上没有该容器,可能需要喝杯热茶的时间(去docker hub上下载镜像,视网速)
[root@docker ~]# docker run --volume=/:/rootfs:ro --volume=/var/run:/var/run:rw --volume=/sys:/sys:ro --volume=/var/lib/docker/:/var/lib/docker:ro --publish=: --detach=true --name=cadvisor-test google/cadvisor:latest
创建完成后,可以访问http://主机ip:8080/,如下图

3.利用独立开源项目Prometheus监控工具(官网),后续有时间会专门对其进行系统学习下。

来自官网资料:Prometheus及其一些生态系统组件的总体架构

二、本文案例开源工具介绍
1.cAdvisor (Container Advisor)该程序是由Google 开源的一个项目。提供了给使用容器的用户对其主机上运行容器的资源使用情况和性能的了解,它是一个以容器方式运行的守护进程,用来数据采集、汇聚、可视化和导出运行中容器的信息。具体来说,对于每个容器,它保留资源的隔离参数,历史资源使用,完整历史资源使用的直方图,和网络统计。此数据由机器上的容器输出。
2.InfluxDB(官网)是一个由Go编写的开源数据库,专门用于处理具有高可用性和高性能要求的时间序列数据。InfluxDB安装没有外部依赖,可以在几分钟内完成,然而它的灵活性、可扩展性足够复杂的部署。具有实时分析、历史分析、预测分析、异常检测等特点。
3.Grafana(官网)提供了一个强大而优雅的方式来创建、探索,并可以共享仪表板和数据。也是用于查询、可视化时间序列和指标的主要工具。支持的数据源有Graphite、Prometheus、Elasticsearch、InfluxDB、OpenTSDB、AWS CloudWatch等,并且在4.0及更高版本中加入了警报功能(but现在只支持一些数据源。它们包括Graphite,Prometheus,InfluxDB和OpenTSDB)。目前报警规则只有Graph面板支持,Table和Singlestat会在未来版本中出现。支持的通知方式有Email、即时通讯工具Slack、Webhook等。
三、监控部署
1.创建第一个容器influxdb
[root@docker ~]# docker run -d -p : -p : --expose --expose --name influxsrv -e PRE_CREATE_DB=cadvisor tutum/influxdb:0.13
注:默认情况下,InfluxDB使用以下网络端口:
TCP端口8083用于InfluxDB的管理面板
TCP端口8086用于通过InfluxDB的HTTP API进行客户端 - 服务器的通信
创建完成后,打开浏览器,访问http://ip:8083,默认用户名,密码是root、root,如下图

2.创建cAdvisor容器并将其link到InfluxDB容器
[root@docker ~]# docker run --volume=/:/rootfs:ro --volume=/var/run:/var/run:rw --volume=/sys:/sys:ro --volume=/var/lib/docker/:/var/lib/docker:ro --publish=: --detach=true --link influxsrv:influxsrv --name=cadvisor google/cadvisor:v0.24.1 -storage_driver=influxdb -storage_driver_db=cadvisor -storage_driver_host=influxsrv:
3.创建Grafana容器并将其链接到InfluxDB容器:
docker run -d -p : -e INFLUXDB_HOST=localhost -e INFLUXDB_PORT= -e INFLUXDB_NAME=cadvisor -e INFLUXDB_USER=root -e INFLUXDB_PASS=root --link influxsrv:influxsrv --name grafana grafana/grafana:3.1.
4.打开浏览器,访问http://ip:3000/ Grafana界面
如有转载,请注明原文出处。飞走不可:http://www.cnblogs.com/hanyifeng/p/6233851.html

5.登录上去后,将Influxdb设置为Grafana的数据源,按照下图添加:

之后点击Add data source,add增加。信息如下:

最后保存测试连接。
6.我们使用Grafana设置我们的第一个Dashboard,并可视化来自cAdvisor的数据。
首先,添加一个Dashboard:

然后新建一个graph,如下图:

先设置Graph中的每个标题选项,如下:

Title:Memory
Height:300px
Metrics:输入查询语句及选择数据源,default 已经是influxdb,可以不用设置(点击
可切换模式)。
query 1: SELECT mean("value") FROM "memory_usage" WHERE container_name='cadvisor' AND container_name='cadvisor' AND $timeFilter GROUP BY time($interval), "container_name" fill(previous)
ALIAS BY:$tag_container_name.memory
Format as:Time series
Axes:主要修改一下Y轴的 显示单位
Left Y-->Unit:bytes、Y-Min:0
Legend:可以在图标左下方显示统计的最大、最小、及平均值等。
Display:主要修改下显示的波浪线或者点,还可以修改区域的显示深度(可以按个人喜好)
Mode Options-->Fill:4、LineWidth:2
修改设置完成后,记得点击正上面的保存
按钮。完整的一个dashboard就出来了。如下图:

点击ADD ROW ,可以增加其它监控Graph、Table、Text等。剩下需要监控的如CPU、磁盘IO、网络IO。创建方式和上面基本一致,除了左Y轴那里需要注意下单位。
7.完整的几个图,以及查询语句如下:

cpu 查询:
SELECT derivative(mean("value"), 10s) FROM "cpu_usage_total" WHERE container_name='cadvisor' AND $timeFilter GROUP BY time($interval), container_name fill(previous)
网络 i/o 查询:
tx:
SELECT derivative(mean("value"), 10s)/ FROM "tx_bytes" WHERE container_name='cadvisor' AND $timeFilter GROUP BY time($interval), container_name fill(previous)
rx:
SELECT derivative(mean("value"), 10s)/ FROM "rx_bytes" WHERE container_name='cadvisor' AND $timeFilter GROUP BY time($interval), container_name fill(previous)
文件系统使用及limit:
fs
SELECT mean("value") FROM "fs_usage" WHERE container_name='cadvisor' AND container_name='cadvisor' AND $timeFilter GROUP BY time($interval), "container_name" fill(previous)
limit
SELECT mean("value") FROM "fs_limit" WHERE container_name='cadvisor' AND $timeFilter GROUP BY time($interval), "container_name" fill(previous)
四、总结一下
Docker 容器的监控不容忽视,毕竟里面是有业务程序在跑的,有了监控,还要有相关预警规则,及报警的处理动作,就像zabbix 一样。不知道cAdvisor监控Docker 集群有木有其它的开源技术方案,毕竟Dcoker 服务器是集群存在的。下次我找到好的技术方案,再来分享。
如果文中有错误,还望大家不吝赐教。
如有转载,请注明原文出处。飞走不可:http://www.cnblogs.com/hanyifeng/p/6233851.html
参考资料:
https://segmentfault.com/a/1190000002527178
https://www.brianchristner.io/how-to-setup-docker-monitoring/
利用谷歌开源工具cAdvisor 结合influxdb存储+Grafana前端展示进行Docker容器的监控的更多相关文章
- [置顶]
cAdvisor、InfluxDB、Grafana搭建Docker1.12性能监控平台
通过cadvisor+influxdb+grafana三者有机结合,打造跨主机容器监控. 优点 1.跨主机监控,可扩展 2.容器自发现 3.历史数据长期保存 4.自定义配置程度高 缺点 1.不能自动隐 ...
- 谷歌开源的TensorFlow Object Detection API视频物体识别系统实现教程
视频中的物体识别 摘要 物体识别(Object Recognition)在计算机视觉领域里指的是在一张图像或一组视频序列中找到给定的物体.本文主要是利用谷歌开源TensorFlow Object De ...
- (原)ubuntu下cadvisor+influxdb+grafana+supervisord监控主机和docker的containers
ubuntu下cadvisor+influxdb+grafana+supervisord监控主机和docker的containers(运行在主机上) 适用于类ubuntu系统.amd64. 1. in ...
- 【jmeter】基于InfluxDB&Grafana的JMeter实时性能测试数据的监控和展示
本文主要讲述如何利用JMeter监听器Backend Listener,配合使用InfluxDB+Grafana展示实时性能测试数据 关于JMeter实时测试数据 JMeter从2.11版本开始,命令 ...
- jmeter --- 基于InfluxDB&Grafana的JMeter实时性能测试数据的监控和展示
转自:https://blog.csdn.net/RickyOne_RR/article/details/50637839 本文主要讲述如何利用JMeter监听器Backend Listener,配合 ...
- 转:基于InfluxDB&Grafana的JMeter实时性能测试数据的监控和展示
本文主要讲述如何利用JMeter监听器Backend Listener,配合使用InfluxDB+Grafana展示实时性能测试数据 关于JMeter实时测试数据 JMeter从2.11版本开始,命令 ...
- Prometheus入门到放弃(4)之cadvisor监控docker容器
Prometheus监控docker容器运行状态,我们用到cadvisor服务,cadvisor我们这里也采用docker方式直接运行. 1.下载镜像 [root@prometheus-server ...
- 6. 使用cadvisor监控docker容器
Prometheus监控docker容器运行状态,我们用到cadvisor服务,cadvisor我们这里也采用docker方式直接运行.这里我们可以服务端和客户端都使用cadvisor 客户端 1.下 ...
- 利用Google开源Java容器化工具Jib构建镜像
转载:https://blog.csdn.net/u012562943/article/details/80995373 一.前言 容器的出现让Java开发人员比以往任何时候都更接近“编写一次,到处运 ...
随机推荐
- svn branch 的使用
svn revision graph 中选中 "wc"(Mark current revision of your working copy.)这个选项后, 当前工作副本的版本号会 ...
- for和getElementByTagName配合
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Python+Selenium+PhantomJS下载JavaScript异步加载网页
# -*- coding: utf-8 -*- from selenium import webdriver import selenium.webdriver.support.ui as ui fr ...
- 移动WEB模拟原声APP滑动删除
移动WEB模拟原声APP滑动删除 效果 代码 <!DOCTYPE html> <html lang="en"> <head> <meta ...
- STM32 的加密实现(转)
源:STM32 的加密实现 基于STM32F103的ID号对应用程序的保护方法 目的:对运行于STM32的嵌入式代码程序进行加密 编译环境:IAR Embedded System for ARM5.5 ...
- 变量-数据类型-对象-如何编写python脚本
标识符的命名规则变量是标识符的例子. 标识符 是用来标识 某样东西 的名字.在命名标识符的时候,你要遵循这些规则:标识符的第一个字符必须是字母表中的字母(大写或小写)或者一个下划线(‘ _ ’).标识 ...
- iOS中正则表达式的三种使用方式
1.利用NSPredicate(谓词)匹配 例如匹配有效邮箱: NSString *email = @“nijino_saki@163.com”: NSString *regex = @"[ ...
- iOS开发——发短信,邮件
在IOS开发中,有时候我们会需要用到邮件发送的功能.比如,接收用户反馈和程序崩溃通知等等,这个功能是很常用的.在苹果系统中,如果彼此的手机都是iOS设备,并且开通了iMessage功能,那么彼此之间的 ...
- dsp与dmp的cookie mapping
dsp ad.com 在 meijiu.com上部署广告. 假设dmp叫cm.api.taobao.com 建立gid映射表 (1) ad.com在meiju.com的页面上部署,指向dmp ...
- swift新特性(__nullable和__nonnull
http://www.mamicode.com/info-detail-923593.html 最近在看老师写代码的时候经常遇到两个陌生的关键字,但是当我在我的电脑上敲得时候就是敲不出,后来才知道这是 ...