Docker做为目前十分出色的容器管理技术,获得大量企睐,在生产环境中使用Docker容器部署服务及应用的场景愈来愈多。因此面对日益庞大的docker服务群应用,如何具备针对性的,有效的监控也变成了企业运维人员工做需求。sql
容器信息采集及监控的方案有不少,有 docker自身的 docker stats命令、 Scout、Data Dog、Prometheus等,本次为搭建分享两款比较经典的容器开源监控组合方案Cadvisor+InfluxDB+Grafana和Cadvisor+Prometheus+Grafana。docker
Cadvisor+InfluxDB+Grafana
1.一、Cadvisor
Cadvisor是 Google用来监测单节点资源信息的监控工具。 Cadvisor提供了基础查询界面和http接口,方便其余组件如 Grafana、 Prometheus等进行数据抓取。 Cadvisor能够对Docker主机上的资源及容器进行实时监控和性能数据采集,包括CpU使用状况、内存使用状况、网络吞吐量及文件系统使用状况等。Cadvisor使用Go语言开发,利用Liunx的Cagroups获取容器的资源使用信息。
Google的 Kubernetes中也默认地将其做为单节点的资源监控工具,各个节点默认会安装上 Advisor组件。数据库
Cadvisor产品特色:后端
- 能够展现主机和容器两个层次的监控数据。
- 能够展现历史变化数据。
- 谷歌公司的开源产品。
- 监控指标齐全。
- 方便部署,有官方的 docker镜像。
- 默认只在本地保存1分钟数据,能够继承InfluxDB等第三方存储使用。
因为Cadvisor提供的操做界面略显简陋,并且须要在不一样页面之间跳转,而且只能 监控一个Host,这难免会让人质疑它的实用性。但Cadvisor的一个亮点是他能够将监控到的数据处处给第三方工具,由这些工具进一步加工处理。bash
咱们能够把Cadvisor定位为一个监控数据收集器,收集和导出数据是它的强项,而非展现数据。服务器
1.二、InfluxDB
InfluxDB是一个InfluxData开发的开源非关系型时序型数据库。它由Go写成,着力于髙性能地査询与存储时序型数据。 InfluxDB被普遍应用于存储系统的监控数据,loT行业的实时数据等场景。同类型的数据库产品还有 Elasticsearch、Graphite等。←
InfluxDB应用场景:性能监控,应用程序指标,物联网传感器数据和实时分析等的后端存储。
nfluxDB主要功能:网络
- 基于时间序列,支持与时间有关的相关函数(如最大,最小,求和等);
- 可度量性:你能够实时对大量数据进行计算;
- 基于事件:它支持任意的事件数据;
InfluxDB主要特色:架构
- 无结构(无模式):能够是任意数量的列;
- 支持拓展;
- 支持min,max,sum, count,mean, median等一系列函数,方便统计;
- 原生的HTTP支持,内置HTTP API;
- 强大的类SQL语法;
1.三、Grafana
Grafana是一个可视化面板(Dashboard)工具,有着很是漂亮的图标和布局等展现功能,功能齐全的度量仪表盘和编译器,支持Graphite、zabbix、InfluxDB、Prometheus和Grafana主要特性运维
- 灵活丰富的图形化选项;
- 能够混合多种风格;
- 支持白天和夜间模式;
- 支持多个数据源;
1.四、监控组建架构
监控组件架构图:tcp
提示:InfluxDB用于数据存储,Cadvisor用户数据采集,Grafana用于数据展现。
监控组件架构部署方案:
- 建立自定义网络monitor(自定义网络名称),用于后期容器加入此网络中;
- 建立InfluxDB容器,建立数据用户、数据库;
- 建立Cadvisor容器;
- 建立Grafana容器,配置grafana;
1.五、开始部署
[root@flag ~]# iptables -F [root@flag ~]# setenforce 0 setenforce: SELinux is disabled [root@flag ~]# systemctl stop firewalld
安装docker-ce配置镜像加速 略
下载镜像组件
docker pull tutum/influxdb docker pull google/cadvisor docker pull grafana/grafana [root@flag ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE grafana/grafana latest 651ff2dc930f 2 weeks ago 187MB google/cadvisor latest eb1210707573 2 years ago 69.6MB tutum/influxdb latest c061e5808198 4 years ago 290MB
建立自定义网络
为了把后期建立的Cadvisor+InfluxDB+Grafana这三个容器都加入本身定义的网络便于理
解和管理,因此才新建一个自定义网络。(让这三个容器相互之间进行统一的管理和通讯)
[root@flag ~]# docker network create monitor 0533cc85ed9f3f9d6865e091120aa2ed051cbde09d8daf342dab456b6d7fc0ca [root@flag ~]# docker network ls NETWORK ID NAME DRIVER SCOPE 8aecbd2a0b19 bridge bridge local fc1c55c5fa26 host host local 0533cc85ed9f monitor bridge local 8714055457ff none null local
建立InfluxDB容器
启动容器,tutum/influxdb镜像这里没有指定版本,默认会pull最新版本的InfluxDB:
参数说明:
- -d:后台运行此容器;
- --name:启运容器分配名字influxdb;
- --net:把容器加入到新的网络monitor;
- -p:映射端口,8083端口为influxdb后台控制端口,8086端口是infuxdb的数据端口;
- tutum/influxdb:经过这个容器来运行的,默认会在docker官方仓库pull下来;
查看influxdb容器是否启动:
[root@flag ~]# docker ps -l CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a6f6543140ed tutum/influxdb "/run.sh" 6 minutes ago Up 6 minutes 0.0.0.0:8083->8083/tcp, 0.0.0.0:8086->8086/tcp influxdb
访问influxdb控制台http://192.168.200.111:8083
从上图能够看到,在Query Templates选项中提供了经常使用的操做模板,可根据这些模板来管理influxdb,下面咱们就来建立数据库和数据库用户。
CREATE USER "root" WITH PASSWORD '890' WITH ALL PRIVILEGES
建立Cadvisor数据库cadvisor、用户root,用户和数据库你们能够自行随意定义,用于后期grafana的配置:
CREATE DATABASE "cadvisor"
建立Cadvisor容器
[root@flag ~]# docker run -d --volume=/:/rootfs:ro --volume=/var/run:/var/run:rw --volume=/sys:/sys:ro --volume=/var/lib/docker/:/var/lib/docker:ro --net monitor --publish=8080:8080 --name=cadvisor google/cadvisor -storage_driver=influxdb -storage_driver_db=cadvisor -storage_driver_host=influxdb:8086 effa70d8cd00189b6ea51ae8e187d29df574fcd6194e5deda2ab5cd218430a55
参数说明:
- -d:后台运行次容器;
- --name:启动容器分配名字Cadvisor;
- --net:把容器加入到新的网络monitor;
- -p:映射端口8080;
- --mout:把宿主机的相文目录绑定到容器中,这些目录都是Cadvisor须要采集的目录文件和监控内容;
- -storage_driver:须要指定Cadvisor的存储驱动、数据主机、数据库名;
- google/Cadvisor:经过Cadvisor这个镜像来运行容器,默认会在docker官方仓库把镜像pull下来;
查看Cadvisor容器;
[root@flag ~]# docker ps -l CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES effa70d8cd00 google/cadvisor "/usr/bin/cadvisor -…" 6 minutes ago Up 6 minutes 0.0.0.0:8080->8080/tcp cadvisor
经过http://192.168.200.10:8080短裤访问测试一下,第一次访问这个页面有点慢
从上图能够看到,其实Cadvisor也有基础的图形界面展现功能,我么这里主要由它来作数据采集。
建立grafana容器
[root@flag ~]# docker run -d --name grafana --net monitor -p 3000:3000 grafana/grafana 6a4a527897bcf6b009ae8cc00e0ed21f1e330f9cd0aa4e5f004685a55ed38e71
查看运行结果:
[root@flag ~]# docker ps -l CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6a4a527897bc grafana/grafana "/run.sh" 8 seconds ago Up 6 seconds 0.0.0.0:3000->3000/tcp grafana
访问grafana,经过http://192.168.200.10:3000端口的方式访问,默认帐号密码(admin/admin),首次陆续须要更新密码。
添加数据源Add data source,以下图:
新建Dashboard,以下图:
Cadvisor+Prometheus+Grafana
2.一、Cadvisor产品简介
Cadvisor是Google开源的一款用于展现和分析容器运行状态的可视化工具。经过在主机上运行Cadvisor用户能够轻松的获取到当前主机上容器的运行统计信息,并以图表的方式向用户展现。
2.二、部署Cadvisor
被监控主机上部署Cadvisor容器
[root@10 ~]# docker rm -f $(docker ps -aq) 6a4a527897bc effa70d8cd00 a6f6543140ed [root@10 ~]# docker run -d \ --volume=/:/rootfs:ro \ --volume=/var/run:/var/run:ro \ --volume=/sys:/sys:ro \ --volume=/var/lib/docker/:/var/lib/docker:ro \ --volume=/dev/disk/:/dev/disk:ro \ --publish=8080:8080 \ --detach=true \ --name=cadvisor \ google/cadvisor:latest e7493105e8a02b82f1ec67517a2ee28124d2b6f2659d4c9524361ca0cdc95350
2.三、访问Cadvisor页面
访问http://192.168.200.10 cadvisor页面看到手机到的数据
2.四、Prometheus产品简介
Prometheus 是一个最初在 SoundCloud 上构建的开源系统监视和警报工具包。自 2012年成立以来,不少公司和组织都采用了Prometheus,该项目拥有很是活跃的开发者和用户社区。 它如今是一个独立的开源项目,能够独立于任何公司进行维护。 为了强调这一点,并阐明项目的治理结构,Prometheus于2016年加入Cloud Native Computing Foundation,做为继 Kubernetes 以后的第二个托管项目。
Prometheus 的主要特征有∶
- 多维度数据模型-由指标键值对标识的时间序列数据组成
- PromQL,一种灵活的查询语言
- 不依赖分布式存储;单个服务器节点是自治的
- 以 HTTP 方式,经过 pull模型拉取时间序列数据
- 支持经过中间网关推送时间序列数据
- 经过服务发现或者静态配置,来发现目标服务对象
- 支持多种多样的图表和界面展现
2.五、部署Prometheus
[root@10 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE prom/prometheus latest 0bc82119c95b 2 weeks ago 169MB grafana/grafana latest 651ff2dc930f 2 weeks ago 187MB google/cadvisor latest eb1210707573 2 years ago 69.6MB
先准备配置
[root@10 ~]# vi /tmp/prometheus.yml # my global config global: scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute. evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute. # scrape_timeout is set to the global default (10s). # Alertmanager configuration alerting: alertmanagers: - static_configs: - targets: # - alertmanager:9093 # Load rules once and periodically evaluate them according to the global 'evaluation_interval'. rule_files: # - "first_rules.yml" # - "second_rules.yml" # A scrape configuration containing exactly one endpoint to scrape: # Here it's Prometheus itself. scrape_configs: # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config. - job_name: 'prometheus' # metrics_path defaults to '/metrics' # scheme defaults to 'http'. static_configs: - targets: ['localhost:9090'] - job_name: 'docker' #定义一个叫docker的组 static_configs: - targets: ['192.168.200.10:8080'] #填写一个或多个cadvisor的主机地址用逗号隔开
运行容器
[root@10 ~]# docker run -d \ --name=prometheus -p 9090:9090 \ -v /tmp/prometheus.yml:/etc/prometheus/prometheus.yml \ -v /etc/localtime:/etc/localrime \ prom/prometheus
2.六、访问Prometheus页面
http://192.168.200.10:9090
看到docker组状态up为正常
查询项是能够查到数据的
2.七、部署Grafana
[root@10 ~]# docker run -d \ --name=grafana \ -p 3000:3000 \ grafana/grafana
2.八、配置Grafana
访问http://192.168.200.10:3000默认帐户admin密码admin首次登录须要修改密码
配置数据源
导入模板
选择对应的数据源,点击导入,就能够看到被监控主机的数据
准备测试容器