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:
yamlservices: 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 采集:
yamlservices: 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 拉取指标,存到自己的时序数据库:
yamlservices: 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:
yamlservices: grafana: image: grafana/grafana:10.3.0 ports: - "3000:3000" environment: - GF_SECURITY_ADMIN_PASSWORD=admin volumes: - grafana_data:/var/lib/grafana
配置步骤:
- 打开
http://localhost:3000(默认 admin/admin) - 添加数据源 → Prometheus → URL 填
http://prometheus:9090 - 导入 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 监控栈
yamlversion: "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 + cAdvisor | 1-2GB |
| 中等规模 | 完整监控栈 + Alertmanager | 2-4GB |
| 大规模/生产 | Kubernetes + Prometheus Operator | 按需扩展 |
起步建议:先跑 cAdvisor + Prometheus + Grafana 三件套,够用了再加告警。