构建Docker容器监控系统(Cadvisor +InfluxDB+Grafana)

目录

案例概述

[Cadvisor +InfluxDB+Grafana](#Cadvisor +InfluxDB+Grafana)

[1.1、 Cadvisor](#1.1、 Cadvisor)

1.2、InfluxDB

1.3、Grafana

1.4、监控组件架构

1.5、开始部署

安装docker-ce

阿里云镜像加速器

创建自定义网络

创建influxdb容器


案例概述

Docker作为目前十分出色的容器管理技术,得到大量企业的青睐,在生产环境中使用Docker容器部署服务及应用的场景越来越多。所以面对日益庞大的docker服务群应用,如何具有针对性的,有效的监控也变成了企业运维人员工作需求。

容器信息采集及监控的方案有很多,有docker自身的docker stats命令、Scout、Data Dog、Prometheus等,本次为大家分享两款比较经典的容器开源监控组合方案Cadvisor +InfluxDB+Grafana和Cadvisor +Prometheus+Grafana。

Cadvisor +InfluxDB+Grafan a

1.1 Cadvisor

Cadvisor 是Google用来监测单节点资源信息的监控工具。 Cadvisor 提供了基础查询界面和http接口,方便其他组件如Grafana 、Prometheus等进行数据抓取。Cadvisor 可以对Docker主机上的资源及容器进行实时监控和性能数据采集,包括CPU使用情况、内存使用情况、网络吞吐量及文件系统使用情况等。Cadvisor 使用Go语言开发,利用Linux的Cgroups获取容器的资源使用信息。

Google的Kubernetes中也默认地将其作为单节点的资源监控工具,各个节点默认会安装上Cadvisor组件。

Cadvisor 产品特点:

  • 可以展示主机和容器两个层次的监控数据。
  • 可以展示历史变化数据。
  • 谷歌公司的开源产品。
  • 监控指标齐全。
  • 方便部署,有官方的docker镜像。
  • 默认只在本地保存1分钟数据,可以集成InfluxDB等第三方存储使用。

由于 Cadvisor 提供的操作界面略显简陋,而且需要在不同页面之间跳转,并且只能监控一个 Host,这不免会让人质疑它的实用性。但 Cadvisor 的一个亮点是它可以将监控到的数据导出给第三方工具,由这些工具进一步加工处理。

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

1.2 InfluxDB

InfluxDB是一个由InfluxData开发的开源非关系型时序型数据库。它由Go写成,着力于高性能地查询与存储时序型数据。InfluxDB被广泛应用于存储系统的监控数据,IoT行业的实时数据等场景。同类型的数据库产品还有Elasticsearch、Graphite等。

InfluxDB应用场景:性能监控,应用程序指标,物联网传感器数据和实时分析等的后端存储。

InfluxDB主要功能

  • 基于时间序列,支持与时间有关的相关函数(如最大,最小,求和等);
  • 可度量性:你可以实时对大量数据进行计算;
  • 基于事件:它支持任意的事件数据;

InfluxDB主要特点

  • 无结构(无模式):可以是任意数量的列;
  • 支持拓展;
  • 支持min, max, sum, count, mean, median 等一系列函数,方便统计;
  • 原生的HTTP支持,内置HTTP API;
  • 强大的类SQL语法;
  • 自带管理界面,方便使用;

1.3 Grafana

Grafana是一个可视化面板(Dashboard)工具,有着非常漂亮的图表和布局等展示功能,功能齐全的度量仪表盘和图形编辑器,支持Graphite、zabbix、InfluxDB、Prometheus和OpenTSDB等组件作为数据源。

Grafana主要特性

  • 灵活丰富的图形化选项;
  • 可以混合多种风格;
  • 支持白天和夜间模式;
  • 支持多个数据源;

1. 4、监控组件架构

监控组件架构图:

提示:InfluxDB用于数据存储,Cadvisor 用户数据采集,Grafana用于数据展示。

监控组件架构部署方案:

  1. 创建自定义网络monitor(自定义网络名称),用于后期容器加入此网络中;
  2. 创建Influxdb容器,创建数据用户、数据库;
  3. 创建Cadvisor 容器;
  4. 创建Grafana容器,配置grafana;

1. 5、开始部署

安装docker-ce

[root@localhost ~]# iptables -F

[root@localhost ~]# setenforce 0

setenforce: SELinux is disabled

[root@localhost ~]# systemctl stop firewalld

[root@localhost ~]# cd /etc/yum.repos.d/

[root@localhost ~]# wget http://mirrors.aliyun.com/repo/Centos-7.repo

[root@localhost ~]# yum -y install yum-utils device-mapper-persistent-data lvm2

[root@localhost ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

[root@localhost ~]# yum -y install docker-ce

[root@localhost ~]# systemctl start docker

[root@localhost ~]# systemctl enable docker

[root@localhost ~]# docker version

Client: Docker Engine - Community
 Version:           24.0.5
 API version:       1.43
 Go version:        go1.20.6
 Git commit:        ced0996
 Built:             Fri Jul 21 20:39:02 2023
 OS/Arch:           linux/amd64
 Context:           default

Server: Docker Engine - Community
 Engine:
  Version:          24.0.5
  API version:      1.43 (minimum version 1.12)
  Go version:       go1.20.6
  Git commit:       a61e2b4
  Built:            Fri Jul 21 20:38:05 2023
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.6.22
  GitCommit:        8165feabfdfe38c65b599c4993d227328c231fca
 runc:
  Version:          1.1.8
  GitCommit:        v1.1.8-0-g82f18fe
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

阿里云镜像加速器

阿里云登录 - 欢迎登录阿里云,安全稳定的云计算服务平台欢迎登录阿里云,全球领先的云计算及人工智能科技公司,阿里云为200多个国家和地区的企业、开发者和政府机构提供云计算基础服务及解决方案。阿里云云计算、安全、大数据、人工智能、企业应用、物联网等云计算服务。https://cr.console.aliyun.com/

[root@localhost ~]# cat << END > /etc/docker/daemon.json

{
        "registry-mirrors":[ "https://nyakyfun.mirror.aliyuncs.com" ]
}
END

[root@localhost ~]# systemctl daemon-reload

[root@localhost ~]# systemctl restart docker

下载组件镜像

[root@localhost ~]# docker pull tutum/influxdb

Using default tag: latest
latest: Pulling from tutum/influxdb
a3ed95caeb02: Pull complete 
23efb549476f: Pull complete 
aa2f8df21433: Pull complete 
ef072d3c9b41: Pull complete 
c9f371853f28: Pull complete 
a248b0871c3c: Pull complete 
749db6d368d0: Pull complete 
db2492acfcc3: Pull complete 
b7e7d2e12d53: Pull complete 
4272a53eef10: Pull complete 
9b2fefdb5321: Pull complete 
Digest: sha256:5b7c5e318303ad059f3d1a73d084c12cb39ae4f35f7391b79b0ff2c0ba45304b
Status: Downloaded newer image for tutum/influxdb:latest
docker.io/tutum/influxdb:latest

[root@localhost ~]# 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@localhost ~]# docker pull grafana/grafana

Using default tag: latest
latest: Pulling from grafana/grafana
97518928ae5f: Pull complete 
5b58818b7f48: Pull complete 
d9a64d9fd162: Pull complete 
4e368e1b924c: Pull complete 
867f7fdd92d9: Pull complete 
387c55415012: Pull complete 
07f94c8f51cd: Pull complete 
ce8cf00ff6aa: Pull complete 
e44858b5f948: Pull complete 
4000fdbdd2a3: Pull complete 
Digest: sha256:18d94ae734accd66bccf22daed7bdb20c6b99aa0f2c687eea3ce4275fe275062
Status: Downloaded newer image for grafana/grafana:latest
docker.io/grafana/grafana:latest

[root@localhost ~]# docker images

REPOSITORY        TAG       IMAGE ID       CREATED         SIZE
grafana/grafana   latest    9b957e098315   20 months ago   275MB
google/cadvisor   latest    eb1210707573   4 years ago     69.6MB
tutum/influxdb    latest    c061e5808198   6 years ago     290MB

创建自定义网络

为了把后期创建的Cadvisor+InfluxDB+Grafana这三个容器都加入自己定义的网络便于理解和管理,所以才新建一个自定义网络。

[root@localhost ~]# docker network create monitor

bfe09a56d338b3173da008204dac13e46873ab8c46601683bba6457178e7dbcc

[root@localhost ~]# docker network ls

NETWORK ID     NAME      DRIVER    SCOPE
dbe5fb2353e8   bridge    bridge    local
fc4521838733   host      host      local
bfe09a56d338   monitor   bridge    local
4e2c57eec484   none      null      local

创建influxdb容器

启动容器,tutum/influxdb镜像这里没有指定版本,默认会pull最新版本的influxdb:

[root@localhost ~]# docker run -d --name influxdb --net monitor -p 8083:8083 -p 8086:8086 tutum/influxdb

ec8e368b7d5e6f7b525fc823fdcc2c9f3d8665712645babcf0bba8bfeffe18a3

参数说明:

  • -d :后台运行此容器;
  • --name :启运容器分配名字influxdb;
  • --net : 把容器加入到新的网络monitor;
  • -p :映射端口,8083端口为infuxdb后台控制端口,8086端口是infuxdb的数据端口;
  • tutum/influxdb:通过这个容器来运行的,默认会在docker官方仓库pull下来;

查看influxdb容器是否启动:

[root@localhost ~]# docker ps -l

CONTAINER ID   IMAGE            COMMAND     CREATED          STATUS          PORTS                                                                                  NAMES
ec8e368b7d5e   tutum/influxdb   "/run.sh"   45 seconds ago   Up 43 seconds   0.0.0.0:8083->8083/tcp, :::8083->8083/tcp, 0.0.0.0:8086->8086/tcp, :::8086->8086/tcp   influxdb

访问influxdb控制台http://192.168.2.118:8083;

从上图可以看到,在Query Templates选项中提供了常用的操作模板,可根据这些模版来管理influxdb,下面我们就来创建数据库和数据库用户。

CREATE USER "root" WITH PASSWORD '123456' WITH ALL PRIVILEGES

创建Cadvisor 数据库cadvisor 、用户root,用户和数据库大家可以自行随意定义,用于后期grafana的配置:

CREATE DATABASE "cadvisor"

创建Cadvisor 容器

[root@localhost ~]# 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

3090cec78b680888f6c14776b3aaaa785676577fe2f781a09373a2a43397a1ac
  • -d:后台运行此容器;
  • --name:启运容器分配名字Cadvisor ;
  • --net:把容器加入到新的网络monitor;
  • -p:映射端口8080;
  • --mout:把宿主机的相文目录绑定到容器中,这些目录都是Cadvisor 需要采集的目录文件和监控内容;
  • -storage_driver:需要指定Cadvisor 的存储驱动、数据库主机、数据库名;
  • google/Cadvisor :通过Cadvisor 这个镜像来运行容器,默认会在docker官方仓库把镜像pull下来;

查看Cadvisor 容器:

[root@localhost ~]# docker ps -l

CONTAINER ID   IMAGE             COMMAND                   CREATED              STATUS              PORTS                                       NAMES
3090cec78b68   google/cadvisor   "/usr/bin/cadvisor -..."   About a minute ago   Up About a minute   0.0.0.0:8080->8080/tcp, :::8080->8080/tcp   cadvisor

通过http://192.168.2.118:8080端口访问测试一下,第一次访问这个页面有点慢

从上图可以看到,其实Cadvisor 也有基础的图形展示功能,我们这里主要用它来做数据采集。

准备测试镜像

[root@localhost ~]# docker run -itd --name nginx -p 800:80 nginx

Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
648e0aadf75a: Pull complete 
262696647b70: Pull complete 
e66d0270d23f: Pull complete 
55ac49bd649c: Pull complete 
cbf42f5a00d2: Pull complete 
8015f365966b: Pull complete 
4cadff8bc2aa: Pull complete 
Digest: sha256:67f9a4f10d147a6e04629340e6493c9703300ca23a2f7f3aa56fe615d75d31ca
Status: Downloaded newer image for nginx:latest
19eb36575c3e16b5ebbc94cdd89d7c7f89642f223eab8d9190e8070b33a6714b

[root@localhost ~]# docker images nginx

REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
nginx        latest    89da1fb6dcb9   11 days ago   187MB

[root@localhost ~]# docker ps -l

CONTAINER ID   IMAGE     COMMAND                   CREATED              STATUS              PORTS                                 NAMES
19eb36575c3e   nginx     "/docker-entrypoint...."   About a minute ago   Up About a minute   0.0.0.0:800->80/tcp, :::800->80/tcp   nginx

创建granafa容器

[root@localhost ~]# docker run -d --name grafana --net monitor -p 3000:3000 grafana/grafana

1850cc7d09fd452a20ff2c995de92073bb094c4aec0e8cbf88ec92e62fe1c581

查看运行结果:

[root@localhost ~]# docker ps -l

CONTAINER ID   IMAGE             COMMAND     CREATED          STATUS          PORTS                                       NAMES
1850cc7d09fd   grafana/grafana   "/run.sh"   48 seconds ago   Up 47 seconds   0.0.0.0:3000->3000/tcp, :::3000->3000/tcp   grafana

访问granfana,通过http://192.168.2.118:3000端口的方式访问,默认账户密码(admin/admin),首次登陆需要更新密码。

添加数据源Add data source,如下图:

新建 Dashboard,如下图:

到这里Cadvisor+InfluxDB+Grafana容器监控系统就部署完成了,至于其它grafana的监控项配置不重点介绍。大家如果感兴趣可以参考一些官方资料都是图形化的界面操作。

相关推荐
网络研究院1 小时前
Am I Isolated:一款安全态势基准测试工具
容器·工具·基准测试·安全态势
涔溪2 小时前
Docker简介
spring cloud·docker·eureka
内核程序员kevin3 小时前
在Linux环境下使用Docker打包和发布.NET程序并配合MySQL部署
linux·mysql·docker·.net
kayotin4 小时前
Wordpress博客配置2024
linux·mysql·docker
Ztiddler4 小时前
【Linux Shell命令-不定期更新】
linux·运维·服务器·ssh
小小不董5 小时前
Oracle OCP认证考试考点详解082系列16
linux·运维·服务器·数据库·oracle·dba
IPdodo全球网络5 小时前
如何利用静态住宅IP优化Facebook商城的网络稳定性与运营效率
运维·服务器
颜淡慕潇5 小时前
【K8S问题系列 | 9】如何监控集群CPU使用率并设置告警?
后端·云原生·容器·kubernetes·问题解决
运维&陈同学5 小时前
【模块一】kubernetes容器编排进阶实战之k8s基础概念
运维·docker·云原生·容器·kubernetes·云计算
信子姚青5 小时前
K8s使用nfs
容器