找回密码
 立即注册

QQ登录

只需一步,快速开始

peUfSYR.png
查看: 52|回复: 0

Day 25 Prometheus+Grafana 企业级监控

[复制链接]

876

主题

13

回帖

2808

积分

管理员

积分
2808
发表于 2026-3-29 16:17:54 | 显示全部楼层 |阅读模式
Docker 30天实战系列 · Day 25

你有没有过这种经历:线上容器突然挂了,你一脸懵地看着
  1. docker ps
复制代码
,发现容器已经重启了三次,但完全不知道发生了什么。CPU 飙了?内存爆了?磁盘满了?全靠猜。

这就像开车没有仪表盘——油量多少不知道,水温多高不清楚,等到车抛锚了才知道出了问题。今天我们就来给 Docker 装上一套"全液晶仪表盘":Prometheus + Grafana 监控体系。

本文你将学到

  • 理解容器监控的整体架构和数据流向
  • 使用 cAdvisor 采集容器运行指标
  • 配置 Prometheus 存储和查询时序数据
  • 搭建 Grafana 仪表盘实现可视化
  • 编写 PromQL 查询常用容器指标
  • 配置基础告警规则,让问题主动找你

    阅读时间:15 分钟 | 实操时间:30 分钟 | 难度等级:中级

    ━━━━━━━━━━━━━━━━━━━━

    监控架构:三兄弟各司其职

    在动手之前,先搞清楚这套监控体系的分工。我喜欢用餐厅来类比:

  • cAdvisor 是"传菜员"——它贴身跟着每个容器,实时收集 CPU、内存、网络、磁盘等指标数据
  • Prometheus 是"账房先生"——它定时去 cAdvisor 那里拉数据,分门别类记在自己的时序数据库里
  • Grafana 是"大堂经理"——它从 Prometheus 那里取数据,画成漂亮的图表展示给你看

    数据流向用一张图表示:
    1. +------------+      +------------+      +-----------+
    2. |            | pull |            | query|           |
    3. |  cAdvisor  |<-----|Prometheus  |<-----|  Grafana  |
    4. |  (采集器)   |      | (时序库)    |      | (仪表盘)  |
    5. +------------+      +------------+      +-----------+
    6.      |                    |                   |
    7.      v                    v                   v
    8.   容器指标             存储+告警           可视化展示
    9.   CPU/内存/网络        PromQL查询         图表/仪表盘
    复制代码

    注意这里的关键设计:Prometheus 是主动去"拉"数据的(Pull 模型),而不是 cAdvisor 主动"推"过来。这个设计很巧妙——Prometheus 自己控制采集频率,哪个目标挂了它也能立刻知道。

    ━━━━━━━━━━━━━━━━━━━━

    实操:一键部署监控栈

    准备配置文件

    首先创建项目目录和 Prometheus 配置:
    1. mkdir -p monitoring && cd monitoring
    复制代码

    创建
    1. prometheus.yml
    复制代码
    配置文件:
    1. # prometheus.yml
    2. global:
    3.   scrape_interval: 15s      # 每15秒采集一次
    4.   evaluation_interval: 15s   # 每15秒评估一次告警规则
    5. rule_files:
    6.   - "alert_rules.yml"
    7. scrape_configs:
    8.   # 监控 Prometheus 自身
    9.   - job_name: "prometheus"
    10.     static_configs:
    11.       - targets: ["localhost:9090"]
    12.   # 监控容器(通过 cAdvisor)
    13.   - job_name: "cadvisor"
    14.     static_configs:
    15.       - targets: ["cadvisor:8080"]
    16.   # 监控宿主机(通过 Node Exporter)
    17.   - job_name: "node-exporter"
    18.     static_configs:
    19.       - targets: ["node-exporter:9100"]
    复制代码

    创建
    1. alert_rules.yml
    复制代码
    告警规则文件:
    1. # alert_rules.yml
    2. groups:
    3.   - name: container_alerts
    4.     rules:
    5.       # 容器 CPU 使用率超过 80%
    6.       - alert: ContainerHighCPU
    7.         expr: rate(container_cpu_usage_seconds_total{name!=""}[5m]) * 100 > 80
    8.         for: 2m
    9.         labels:
    10.           severity: warning
    11.         annotations:
    12.           summary: "容器 {{ $labels.name }} CPU 使用率过高"
    13.           description: "容器 {{ $labels.name }} CPU 使用率超过 80%,当前值: {{ $value }}%"
    14.       # 容器内存使用率超过 85%
    15.       - alert: ContainerHighMemory
    16.         expr: container_memory_usage_bytes{name!=""} / container_spec_memory_limit_bytes{name!=""} * 100 > 85
    17.         for: 2m
    18.         labels:
    19.           severity: warning
    20.         annotations:
    21.           summary: "容器 {{ $labels.name }} 内存使用率过高"
    22.           description: "容器 {{ $labels.name }} 内存使用率超过 85%,当前值: {{ $value }}%"
    23.       # 容器重启次数过多
    24.       - alert: ContainerFrequentRestart
    25.         expr: increase(container_last_seen{name!=""}[1h]) < 1
    26.         for: 5m
    27.         labels:
    28.           severity: critical
    29.         annotations:
    30.           summary: "容器 {{ $labels.name }} 可能频繁重启"
    复制代码

    编写 docker-compose.yml

    这是完整的监控栈编排文件:
    1. # docker-compose.yml
    2. services:
    3.   # 容器指标采集器
    4.   cadvisor:
    5.     image: gcr.io/cadvisor/cadvisor:v0.47.2
    6.     container_name: cadvisor
    7.     restart: unless-stopped
    8.     volumes:
    9.       - /:/rootfs:ro
    10.       - /var/run:/var/run:ro
    11.       - /sys:/sys:ro
    12.       - /var/lib/docker/:/var/lib/docker:ro
    13.       - /dev/disk/:/dev/disk:ro
    14.     ports:
    15.       - "8080:8080"
    16.     privileged: true
    17.     devices:
    18.       - /dev/kmsg:/dev/kmsg
    19.   # 时序数据库 + 告警引擎
    20.   prometheus:
    21.     image: prom/prometheus:v2.51.0
    22.     container_name: prometheus
    23.     restart: unless-stopped
    24.     volumes:
    25.       - ./prometheus.yml:/etc/prometheus/prometheus.yml:ro
    26.       - ./alert_rules.yml:/etc/prometheus/alert_rules.yml:ro
    27.       - prometheus_data:/prometheus
    28.     ports:
    29.       - "9090:9090"
    30.     command:
    31.       - "--config.file=/etc/prometheus/prometheus.yml"
    32.       - "--storage.tsdb.retention.time=15d"
    33.       - "--web.enable-lifecycle"
    34.     depends_on:
    35.       - cadvisor
    36.   # 可视化仪表盘
    37.   grafana:
    38.     image: grafana/grafana:10.4.0
    39.     container_name: grafana
    40.     restart: unless-stopped
    41.     environment:
    42.       - GF_SECURITY_ADMIN_USER=admin
    43.       - GF_SECURITY_ADMIN_PASSWORD=admin123
    44.       - GF_USERS_ALLOW_SIGN_UP=false
    45.     volumes:
    46.       - grafana_data:/var/lib/grafana
    47.     ports:
    48.       - "3000:3000"
    49.     depends_on:
    50.       - prometheus
    51.   # 宿主机指标采集(可选但推荐)
    52.   node-exporter:
    53.     image: prom/node-exporter:v1.7.0
    54.     container_name: node-exporter
    55.     restart: unless-stopped
    56.     volumes:
    57.       - /proc:/host/proc:ro
    58.       - /sys:/host/sys:ro
    59.       - /:/rootfs:ro
    60.     command:
    61.       - "--path.procfs=/host/proc"
    62.       - "--path.rootfs=/rootfs"
    63.       - "--path.sysfs=/host/sys"
    64.     ports:
    65.       - "9100:9100"
    66. volumes:
    67.   prometheus_data:
    68.   grafana_data:
    复制代码

    启动监控栈
    1. docker compose up -d
    复制代码

    预期输出:
    1. [+] Running 5/5
    2. ✔ Network monitoring_default    Created
    3. ✔ Volume "monitoring_prometheus_data"  Created
    4. ✔ Volume "monitoring_grafana_data"     Created
    5. ✔ Container cadvisor             Started
    6. ✔ Container node-exporter        Started
    7. ✔ Container prometheus           Started
    8. ✔ Container grafana              Started
    复制代码

    等待约 30 秒让各组件初始化完成,然后验证:
    1. # 检查所有容器是否正常运行
    2. docker compose ps
    3. # 验证 Prometheus 能采集到 cAdvisor 数据
    4. curl -s http://localhost:9090/api/v1/targets | python3 -m json.tool | head -20
    复制代码

    你应该能看到
    1. cadvisor
    复制代码
    1. prometheus
    复制代码
    1. node-exporter
    复制代码
    三个目标的状态都是
    1. "health": "up"
    复制代码


    ━━━━━━━━━━━━━━━━━━━━

    PromQL 入门:和数据对话

    Prometheus 有自己的查询语言叫 PromQL,你可以把它理解为"时序数据的 SQL"。打开
    1. http://localhost:9090
    复制代码
    ,在查询框里试试这些:

    常用查询示例

    查看所有容器的 CPU 使用率(最近5分钟平均):
    1. rate(container_cpu_usage_seconds_total{name!=""}[5m]) * 100
    复制代码

    这里
    1. rate()
    复制代码
    计算的是每秒变化率,乘以 100 转成百分比。
    1. name!=""
    复制代码
    过滤掉那些没名字的系统级 cgroup。

    查看容器内存使用量(MB):
    1. container_memory_usage_bytes{name!=""} / 1024 / 1024
    复制代码

    查看容器网络接收速率(KB/s):
    1. rate(container_network_receive_bytes_total{name!=""}[5m]) / 1024
    复制代码

    找出内存使用 Top 5 的容器:
    1. topk(5, container_memory_usage_bytes{name!=""})
    复制代码

    PromQL 的套路其实很固定:选指标 → 加过滤条件 → 套函数。掌握
    1. rate()
    复制代码
    1. increase()
    复制代码
    1. topk()
    复制代码
    1. histogram_quantile()
    复制代码
    这几个函数,日常监控就够用了。

    ━━━━━━━━━━━━━━━━━━━━

    Grafana 仪表盘搭建

    添加数据源

  • 打开
    1. http://localhost:3000
    复制代码
    ,用
    1. admin/admin123
    复制代码
    登录
  • 进入 Connections > Data Sources > Add data source
  • 选择 Prometheus
  • URL 填写
    1. http://prometheus:9090
    复制代码
    (容器间用服务名通信)
  • 点击 Save & test,看到绿色的 "Successfully queried the Prometheus API" 就对了

    导入现成仪表盘

    自己从零画仪表盘太费时间,Grafana 社区有大量现成模板。推荐这两个:

    Docker 容器监控(Dashboard ID: 893):

  • 进入 Dashboards > New > Import
  • 输入 ID
    1. 893
    复制代码
    ,点 Load
  • 选择刚才配置的 Prometheus 数据源
  • Import

    你会立刻看到一个完整的容器监控面板,包含 CPU、内存、网络、磁盘 IO 等图表。

    Node Exporter 宿主机监控(Dashboard ID: 1860):

    同样的步骤,输入 ID
    1. 1860
    复制代码
    导入,可以监控宿主机的系统资源。

    自定义面板

    如果想自己加一个面板,比如"各容器内存使用排行":

  • 在仪表盘页面点 Add > Visualization
  • 查询框输入:
    1. sort_desc(container_memory_usage_bytes{name!=""}) / 1024 / 1024
    复制代码
  • 右侧面板类型选 Bar gauge
  • 单位设置为 MB
  • 标题填"容器内存排行"

    几下点击,一个实用的面板就出来了。

    ━━━━━━━━━━━━━━━━━━━━

    告警配置进阶

    前面
    1. alert_rules.yml
    复制代码
    里已经定义了基础告警规则,但光有规则还不够——告警触发了得通知到人才行。

    查看告警状态

    打开
    1. http://localhost:9090/alerts
    复制代码
    ,可以看到当前所有告警规则的状态:

  • Inactive:一切正常,规则没触发
  • Pending:条件已满足,但还在等
    1. for
    复制代码
    指定的持续时间
  • Firing:告警已触发

    接入通知渠道

    生产环境建议配合 Alertmanager 使用,可以对接:

  • 企业微信/钉钉 Webhook
  • 邮件通知
  • PagerDuty
  • Slack

    在 docker-compose.yml 中增加 Alertmanager 服务:
    1.   alertmanager:
    2.     image: prom/alertmanager:v0.27.0
    3.     container_name: alertmanager
    4.     restart: unless-stopped
    5.     volumes:
    6.       - ./alertmanager.yml:/etc/alertmanager/alertmanager.yml:ro
    7.     ports:
    8.       - "9093:9093"
    复制代码

    然后在
    1. prometheus.yml
    复制代码
    中添加 Alertmanager 地址:
    1. alerting:
    2.   alertmanagers:
    3.     - static_configs:
    4.         - targets: ["alertmanager:9093"]
    复制代码

    具体的通知渠道配置因团队而异,这里就不展开了,核心思路就是"规则在 Prometheus 定义,通知在 Alertmanager 分发"。

    ━━━━━━━━━━━━━━━━━━━━

    常见问题 Q&A

    Q1:cAdvisor 占用资源多吗?会不会影响业务容器?

    cAdvisor 本身非常轻量,通常只占用 50-100MB 内存和极少的 CPU。它直接读取 Linux 内核的 cgroup 文件系统来获取指标,不会对业务容器产生干扰。不过在容器数量特别多(几百个以上)的场景下,建议适当调大采集间隔。

    Q2:Prometheus 数据会不会把磁盘撑爆?

    我们配置了
    1. --storage.tsdb.retention.time=15d
    复制代码
    ,也就是只保留最近 15 天的数据。按照采集 50 个容器、15 秒间隔来算,一天大约产生 200MB 数据,15 天也就 3GB 左右。如果你的容器特别多,可以调整保留时间或者增加磁盘。

    Q3:Grafana 仪表盘打开很慢怎么办?

    通常是查询时间范围太大导致的。把时间范围从"最近 7 天"缩小到"最近 1 小时"试试。另外检查一下面板里的 PromQL 查询有没有漏加
    1. {name!=""}
    复制代码
    过滤条件——不加过滤会查出大量系统级 cgroup 数据,严重拖慢速度。

    ━━━━━━━━━━━━━━━━━━━━

    小结

    今天我们搭建了一套完整的容器监控体系:

  • cAdvisor 负责采集每个容器的实时指标
  • Prometheus 负责存储时序数据,提供 PromQL 查询能力
  • Grafana 负责将数据可视化,让你一眼看清系统状态
  • 告警规则 让问题主动找你,而不是你去找问题

    这套方案是目前容器监控的事实标准,从个人项目到大厂生产环境都在用。掌握了它,你的容器就不再是"黑箱"了——每个容器用了多少 CPU、吃了多少内存、网络流量是否异常,全都一目了然。

    记住一句话:没有监控的系统就像没有仪表盘的汽车,跑得再快也不安全。

    明天的 Day 26,我们将进入 Docker Swarm 集群编排,学习如何把多台机器组成一个集群来运行容器。单机玩够了,是时候搞集群了。
  • 您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    扫码关注微信公众号

    Archiver|手机版|小黑屋|风叶林

    GMT+8, 2026-5-8 23:01 , Processed in 0.158331 second(s), 19 queries .

    Powered by 风叶林

    © 2001-2026 Discuz! Team.

    快速回复 返回顶部 返回列表