6月5日 22:29

Docker 容器怎么监控?Prometheus + Grafana 完整方案

容器出问题了,docker stats 只能看到 CPU 和内存——磁盘 IO、网络、进程状态全不知道。完整的监控系统需要指标采集、存储、可视化、告警四层。

Docker 监控的四层架构

shell
容器 → 采集器 → 存储后端 → 可视化 cAdvisor Prometheus Grafana Node Loki Exporter
  • 采集层:从容器和宿主机收集指标数据
  • 存储层:时序数据库存指标,日志库存日志
  • 可视化层:Dashboard 展示趋势、图表
  • 告警层:超过阈值自动通知

指标采集:cAdvisor + Node Exporter

cAdvisor——容器指标

Google 出品,自动发现所有容器,采集 CPU、内存、网络、磁盘 IO:

yaml
services: cadvisor: image: gcr.io/cadvisor/cadvisor:latest ports: - "8080:8080" volumes: - /:/rootfs:ro - /var/run:/var/run:ro - /sys:/sys:ro - /var/lib/docker/:/var/lib/docker:ro

cAdvisor 自带一个简单的 Web UI(http://localhost:8080),可以看每个容器的实时指标。

Node Exporter——宿主机指标

cAdvisor 只管容器,宿主机本身的 CPU、内存、磁盘、网络由 Node Exporter 采集:

yaml
services: node-exporter: image: prom/node-exporter:latest ports: - "9100:9100" volumes: - /proc:/host/proc:ro - /sys:/host/sys:ro - /:/rootfs:ro command: - '--path.procfs=/host/proc' - '--path.sysfs=/host/sys' - '--path.rootfs=/rootfs'

Prometheus——指标存储和查询

Prometheus 定时从 cAdvisor 和 Node Exporter 拉取指标,存到自己的时序数据库:

yaml
services: prometheus: image: prom/prometheus:latest ports: - "9090:9090" volumes: - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml - prometheus_data:/prometheus volumes: prometheus_data:
yaml
# prometheus/prometheus.yml global: scrape_interval: 15s scrape_configs: - job_name: 'cadvisor' static_configs: - targets: ['cadvisor:8080'] - job_name: 'node' static_configs: - targets: ['node-exporter:9100'] - job_name: 'app' static_configs: - targets: ['app:8080']

scrape_interval: 15s 表示每 15 秒采集一次。容器数量多时可以调大到 30s-60s 减少负载。

常用 PromQL 查询

promql
# 所有容器的 CPU 使用率 rate(container_cpu_usage_seconds_total{name!=""}[5m]) * 100 # 容器内存使用量(MB) container_memory_usage_bytes{name!=""} / 1024 / 1024 # 宿主机磁盘使用率 (1 - node_filesystem_avail_bytes / node_filesystem_size_bytes) * 100 # 容器网络流入速率 rate(container_network_receive_bytes_total[5m])

Grafana——可视化 Dashboard

Prometheus 的 UI 只适合临时查询。正式的监控面板用 Grafana:

yaml
services: grafana: image: grafana/grafana:10.3.0 ports: - "3000:3000" environment: - GF_SECURITY_ADMIN_PASSWORD=admin volumes: - grafana_data:/var/lib/grafana

配置步骤:

  1. 打开 http://localhost:3000(默认 admin/admin)
  2. 添加数据源 → Prometheus → URL 填 http://prometheus:9090
  3. 导入 Dashboard:推荐 ID 11600(Docker 监控)和 1860(Node Exporter 全量)

导入方式:Dashboard → Import → 输入 ID → Load → 选择 Prometheus 数据源

告警:Alertmanager

Prometheus 本身只负责判断规则,告警通知由 Alertmanager 发送:

yaml
# prometheus/alert_rules.yml groups: - name: docker_alerts rules: - alert: ContainerCpuHigh expr: rate(container_cpu_usage_seconds_total{name!=""}[5m]) * 100 > 80 for: 5m labels: severity: warning annotations: summary: "容器 {{ $labels.name }} CPU 超过 80%" - alert: ContainerMemoryHigh expr: container_memory_usage_bytes / container_spec_memory_limit_bytes * 100 > 90 for: 5m labels: severity: critical - alert: DiskSpaceLow expr: (1 - node_filesystem_avail_bytes / node_filesystem_size_bytes) * 100 > 85 for: 10m

for: 5m 表示持续 5 分钟才告警——避免短暂波动误报。

完整的 docker-compose 监控栈

yaml
version: "3.8" services: prometheus: image: prom/prometheus:latest volumes: - ./prometheus:/etc/prometheus - prometheus_data:/prometheus command: - '--config.file=/etc/prometheus/prometheus.yml' - '--storage.tsdb.retention.time=30d' grafana: image: grafana/grafana:10.3.0 ports: - "3000:3000" volumes: - grafana_data:/var/lib/grafana cadvisor: image: gcr.io/cadvisor/cadvisor:latest volumes: - /:/rootfs:ro - /var/run:/var/run:ro - /sys:/sys:ro - /var/lib/docker/:/var/lib/docker:ro node-exporter: image: prom/node-exporter:latest volumes: - /proc:/host/proc:ro - /sys:/host/sys:ro command: - '--path.procfs=/host/proc' - '--path.sysfs=/host/sys' alertmanager: image: prom/alertmanager:latest volumes: - ./alertmanager:/etc/alertmanager volumes: prometheus_data: grafana_data:

这套组合约需 2-3GB 内存,覆盖了指标采集、存储、可视化、告警四层。

监控方案选择

规模推荐方案内存需求
单机开发docker stats + cAdvisor Web< 500MB
小团队(<20 容器)Prometheus + Grafana + cAdvisor1-2GB
中等规模完整监控栈 + Alertmanager2-4GB
大规模/生产Kubernetes + Prometheus Operator按需扩展

起步建议:先跑 cAdvisor + Prometheus + Grafana 三件套,够用了再加告警。

标签:Docker