Docker 基础(六)- 监控和管理工具 - CIG

CIG 简介

在 Docker 的监控生态中,CIG 是一套堪称经典、久经沙场的轻量级容器监控 “三驾马车” 组合。它由三个著名的开源工具并网组合而成:

  • CcAdvisor(Google 出品:负责收集容器底层的各项硬核指标)
  • IInfluxDB(时序数据库:负责高速存储这些带有时间戳的指标数据)
  • GGrafana(炫酷大屏:负责将数据展现为精美的图形化仪表盘)

虽然现在企业级大集群流行 Prometheus + Grafana 的组合,但对于管理单机或中小型 CentOS 环境,CIG 架构因其部署极快、对内存消耗极小(轻量级)的特点,依然是单机全方位监控的绝对王者。


CIG 核心工作原理

在了解安装前,我们先用一张数据流向图看懂它们是怎么打配合的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[ 各个业务容器 ] (产生 CPU/内存/网络数据)


┌──────────────┐
│ cAdvisor │ ──(实时抓取并分析容器状态)
└──────────────┘


┌──────────────┐
│ InfluxDB │ ──(将结构化指标写入时序数据库)
└──────────────┘


┌──────────────┐
│ Grafana │ ──(读取数据库,渲染炫酷监控大屏)
└──────────────┘
  • cAdvisor 会直接挂载宿主机的 /var/run/docker.sock 和 /sys/fs/cgroup,实时偷窥所有容器的 CPU、内存、网络 I/O、磁盘 I/O。
  • 它把这些高频数据每隔几秒就一股脑写入 InfluxDB 1.x
  • Grafana 负责当 “打工人” 的眼睛,配置好 InfluxDB 数据源后,用折线图、柱状图把微服务是否有内存泄漏、CPU 突高直观地展示出来。


CIG 一键式安装部署

既然是 “三驾马车”,单个去 docker run 会让人精神崩溃。我们直接编写一个 docker-compose.yml,实现一键轰鸣并网。

准备宿主机目录

1
2
3
mkdir -p /opt/apps/cig/influxdb
mkdir -p /opt/apps/cig/grafana
chmod 777 /opt/apps/cig/grafana # 保证 Grafana 容器有权限写入


准备 cadvisor 镜像

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# 科学下载 cadvisor
$ wget https://github.com/google/cadvisor/releases/download/v0.49.1/cadvisor-v0.49.1-linux-amd64

# 将下载的 cadvisor-v0.49.1-linux-amd64 上传到宿主机,并改名为 cadvisor
$ mv cadvisor-v0.49.1-linux-amd64 cadvisor
$ chmod +x cadvisor


# 在宿主机和cadvisor同一个文件路径下编写 Dockerfile 文件
$ vim Dockerfile
# 使用极其轻量、安全的 alpine 作为底座(只有 5MB 大小)
FROM alpine:3.19
# 维护者标签
LABEL maintainer="owlias"
# 1. 物理注入 cAdvisor 运行所需的系统级安全和时区依赖(防断层差)
RUN apk --no-cache add ca-certificates libc6-compat device-mapper findutils tzdata && \
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
echo "Asia/Shanghai" > /etc/timezone
# 2. 将同级目录下的物理二进制文件拷贝到容器内部的系统命令路径下
COPY cadvisor /usr/bin/cadvisor
# 3. 暴露 cAdvisor 默认的核心监控端口
EXPOSE 8080
# 4. 核心拉起指挥官:完美继承外部 Compose 传进来的启动参数
ENTRYPOINT ["/usr/bin/cadvisor", "-logtostderr"]


# 构建 my-cadvisor:v0.49.1 镜像
# 因为完全是本地物理拷贝,这个构建过程会瞬间拉满并通车,直接吐出 Successfully tagged my-cadvisor:v0.49.1。
$ docker build -t my-cadvisor:v0.49.1 .
# 查看新构建的镜像
$ docker images | grep my-cadvisor


编写 docker-compose.yml

请在 /opt/apps/cig/ 目录下创建 docker-compose.yml,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
networks:
monitor-net:
name: monitor-net
driver: bridge

services:
# 1. 存储端:InfluxDB (注意:CIG 经典组合通常使用 1.x 版本,2.x 语法大改且自带 UI)
my_influxdb:
image: influxdb:1.8.10
container_name: cig_influxdb
restart: always
networks:
- monitor-net
ports:
- "8086:8086"
volumes:
- /opt/apps/cig/influxdb:/var/lib/influxdb
environment:
- INFLUXDB_DB=cadvisor # 预先创建一个叫 cadvisor 的数据库
- INFLUXDB_ADMIN_USER=admin
- INFLUXDB_ADMIN_PASSWORD=adminpassword

# 2. 收集端:cAdvisor
my_cadvisor:
# 核心改变:换成专为 Cgroups v2 优化的稳定版镜像
# image: lagoudal/cadvisor:v0.49.1-cgroupv2
# 换成自己创建的镜像
image: my-cadvisor:v0.49.1
container_name: cig_cadvisor
restart: always
privileged: true
networks:
- monitor-net
ports:
- "8080:8080"
volumes:
- /:/rootfs:ro
- /var/run:/var/run:ro
- /sys:/sys:ro
- /var/lib/docker/:/var/lib/docker:ro
- /dev/disk/:/dev/disk:ro
- /sys/fs/cgroup:/sys/fs/cgroup:ro
command: -storage_driver=influxdb -storage_driver_host=my_influxdb:8086 -storage_driver_db=cadvisor

# 3. 展示端:Grafana
my_grafana:
image: grafana/grafana:latest
container_name: cig_grafana
restart: always
networks:
- monitor-net
ports:
- "3000:3000"
volumes:
- /opt/apps/cig/grafana:/var/lib/grafana
environment:
- GF_SECURITY_ADMIN_PASSWORD=admin # 默认网页登录密码
depends_on:
- my_influxdb


一键合闸启动

1
2
cd /opt/apps/cig/
docker compose up -d

检查状态:输入 docker compose ps,当看到三个容器全部为 Up 时,说明你的单机专业监控网已经全面铺开!

1
2
3
$ curl http://192.168.1.8:8080
$ curl http://192.168.1.8:8086/query?q=show databases
$ curl http://192.168.1.8:3000


CIG 监控大屏配置与使用

服务起来后,数据已经在默默流动了。我们需要去 Grafana 配置大屏把它展现出来。

第一步:登录 Grafana。打开 Mac 浏览器,访问:http://your-centos-ip:3000。默认账号:admin/admin。

第二步:并网 InfluxDB 数据源 (Data Source)。

  • 点击左侧边栏的齿轮 (Configuration) -> Data Sources。
  • 点击 Add data source,选择 InfluxDB。
  • 关键配置项:
    • URL: 输入 http://my_influxdb:8086 (利用 Docker 内部网络别名直接直连)。
    • Database: 输入 cadvisor(对应 Compose 里创建的数据库名)。
    • User / Password: 输入 admin / adminpassword。
    • 点击最下方的 Save & test。如果出现绿色提示 Data source is working,说明数据通道完全打通!

第三步:白嫖官方绝美大屏模板(不用自己辛辛苦苦画图)。Grafana 社区有全球开发者分享的现成模板,我们直接输入代码导入即可。

  • 点击左侧加号 + (Create) -> Import。
  • 在 Import via grafana.com 文本框中,输入经典的 cAdvisor 监控大屏 ID:193(或者 11277,这是一张非常炫酷的中文容器监控大屏模板)。
  • 点击 Load。
  • 在接下来的配置页中,最下方的 InfluxDB 下拉框里,选择你刚刚在第二步创建的那个数据源。
  • 点击 Import!

瞬间,一幅科技感爆棚的 Docker 监控大盘就展现在你面前,瞬间一幅科技感爆棚的 Docker 监控大盘就展现在你面前:

  • 在左上角的下拉菜单里,任意切换查看你宿主机上的不同容器(比如切换到 my_mysql_3300 或者 app_user_8081)。
  • 实时观察该容器的 CPU 利用率曲线、实时内存逼近值、网络每秒吞吐量(KB/s)。
  • 当你的 Java 微服务突然因为高并发卡死或者发生内存泄漏(OOM)时,大屏上的折线图会直接冲顶,帮你瞬间锁定真凶。