强曰为道
与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

Docker 完全指南 / 14 - 监控方案

14 - 监控方案

使用 cAdvisor、Prometheus、Grafana 构建完整的容器监控体系。


14.1 容器监控概述

监控指标分类

类别指标说明
资源指标CPU、内存、磁盘 I/O、网络 I/O容器资源使用情况
容器指标运行状态、重启次数、健康检查容器生命周期
应用指标请求延迟、错误率、吞吐量应用性能
宿主机指标内核版本、磁盘空间、系统负载底层基础设施

常用监控工具

工具定位特点
docker stats基础 CLI实时查看,无历史数据
cAdvisor容器指标采集Google 开源,自动发现容器
Prometheus指标存储与时序数据库拉取模型,强大的查询语言
Grafana可视化面板丰富的仪表板,多数据源
DatadogSaaS 监控平台商业方案,功能全面
Zabbix传统监控企业级,学习曲线较陡

14.2 Docker 原生监控

docker stats

# 实时查看所有容器资源使用
docker stats

# 输出示例:
# CONTAINER   CPU %   MEM USAGE / LIMIT   MEM %   NET I/O       BLOCK I/O     PIDS
# web         0.15%   15MiB / 256MiB      5.86%   1.2kB / 0B    0B / 0B       2
# db          1.25%   120MiB / 512MiB     23.4%   5.6kB / 2.1kB 12MB / 0B     8

# 仅查看一次(不持续更新)
docker stats --no-stream

# 指定输出格式
docker stats --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.NetIO}}"

# JSON 格式输出
docker stats --no-stream --format '{"name":"{{.Name}}","cpu":"{{.CPUPerc}}","mem":"{{.MemUsage}}"}'

docker inspect

# 获取容器详细资源信息
docker inspect my-container | jq '.[0].HostConfig'

# 查看容器网络统计
docker exec my-container cat /proc/net/dev

# 查看容器 CPU 使用
docker exec my-container cat /proc/stat

# 查看容器内存使用
docker exec my-container cat /proc/meminfo

14.3 cAdvisor

cAdvisor (Container Advisor) 是 Google 开源的容器资源监控工具,自动采集容器的 CPU、内存、网络和磁盘使用数据。

部署 cAdvisor

# 快速部署
docker run -d \
    --name cadvisor \
    --volume /:/rootfs:ro \
    --volume /var/run:/var/run:ro \
    --volume /sys:/sys:ro \
    --volume /var/lib/docker/:/var/lib/docker:ro \
    --volume /dev/disk/:/dev/disk:ro \
    --publish 8080:8080 \
    --privileged \
    --device /dev/kmsg \
    gcr.io/cadvisor/cadvisor:v0.47.0

Docker Compose 部署

services:
  cadvisor:
    image: gcr.io/cadvisor/cadvisor:v0.47.0
    container_name: cadvisor
    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
    devices:
      - /dev/kmsg:/dev/kmsg
    privileged: true
    restart: unless-stopped

cAdvisor 界面

访问 http://localhost:8080

界面功能:
  ├── Subcontainers: 所有容器列表
  ├── Docker Containers: Docker 容器详情
  ├── 单容器页面:
  │   ├── CPU 使用率曲线
  │   ├── 内存使用曲线
  │   ├── 网络 I/O 曲线
  │   ├── 文件系统使用
  │   └── 进程列表
  └── Prometheus 指标端点: /metrics

14.4 Prometheus

Prometheus 架构

监控数据流:
  ┌──────────┐   pull    ┌────────────┐   PromQL   ┌──────────┐
  │ cAdvisor │ ────────> │ Prometheus │ ─────────> │ Grafana  │
  └──────────┘           └────────────┘            └──────────┘
  ┌──────────┐   pull          │
  │ 应用程序 │ ────────>       │
  └──────────┘                 │
  ┌──────────┐   push    ┌────┴───────┐
  │ 短期任务 │ ────────> │ Pushgateway│
  └──────────┘           └────────────┘

prometheus.yml 配置

global:
  scrape_interval: 15s
  evaluation_interval: 15s

scrape_configs:
  # Prometheus 自身监控
  - job_name: 'prometheus'
    static_configs:
      - targets: ['localhost:9090']

  # cAdvisor 容器监控
  - job_name: 'cadvisor'
    static_configs:
      - targets: ['cadvisor:8080']
    metrics_path: /metrics

  # Docker Engine 指标
  - job_name: 'docker'
    static_configs:
      - targets: ['host.docker.internal:9323']

Docker Compose 完整监控栈

services:
  # ---- cAdvisor ----
  cadvisor:
    image: gcr.io/cadvisor/cadvisor:v0.47.0
    volumes:
      - /:/rootfs:ro
      - /var/run:/var/run:ro
      - /sys:/sys:ro
      - /var/lib/docker/:/var/lib/docker:ro
      - /dev/disk/:/dev/disk:ro
    devices:
      - /dev/kmsg:/dev/kmsg
    privileged: true
    restart: unless-stopped

  # ---- Prometheus ----
  prometheus:
    image: prom/prometheus:v2.49.0
    ports:
      - "9090:9090"
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml:ro
      - prometheus-data:/prometheus
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
      - '--storage.tsdb.retention.time=30d'
      - '--storage.tsdb.path=/prometheus'
    restart: unless-stopped

  # ---- Grafana ----
  grafana:
    image: grafana/grafana:10.2.0
    ports:
      - "3000:3000"
    environment:
      - GF_SECURITY_ADMIN_USER=admin
      - GF_SECURITY_ADMIN_PASSWORD=admin123
      - GF_INSTALL_PLUGINS=
    volumes:
      - grafana-data:/var/lib/grafana
      - ./grafana/provisioning:/etc/grafana/provisioning
    restart: unless-stopped

volumes:
  prometheus-data:
  grafana-data:

启用 Docker Engine 指标

// /etc/docker/daemon.json
{
  "metrics-addr": "0.0.0.0:9323",
  "experimental": true
}
# 重启 Docker
sudo systemctl restart docker

# 验证指标端点
curl http://localhost:9323/metrics

14.5 Grafana 配置

添加数据源

1. 访问 http://localhost:3000
2. 登录: admin / admin123
3. Configuration → Data Sources → Add data source
4. 选择 Prometheus
5. URL: http://prometheus:9090
6. Save & Test

推荐仪表板

Dashboard ID名称说明
893Docker & System MonitoringDocker 容器和系统监控
193Docker container monitoring容器详细监控
1860Node Exporter Full宿主机监控
14282Cadvisor ExportercAdvisor 专用
导入仪表板:
1. Grafana → + → Import
2. 输入 Dashboard ID (如 893)
3. 选择 Prometheus 数据源
4. Import

Grafana 自动配置数据源

# grafana/provisioning/datasources/datasource.yml
apiVersion: 1

datasources:
  - name: Prometheus
    type: prometheus
    access: proxy
    url: http://prometheus:9090
    isDefault: true
    editable: true

14.6 Prometheus 常用查询

容器 CPU 使用率

# 容器 CPU 使用率百分比
rate(container_cpu_usage_seconds_total{name=~".+"}[5m]) * 100

# 按容器名称查看
rate(container_cpu_usage_seconds_total{name="web"}[5m]) * 100

# 所有容器 CPU 使用排行
topk(5, rate(container_cpu_usage_seconds_total{name=~".+"}[5m]) * 100)

容器内存使用

# 容器内存使用量 (MB)
container_memory_usage_bytes{name=~".+"} / 1024 / 1024

# 容器内存使用百分比
container_memory_usage_bytes{name=~".+"} / container_spec_memory_limit_bytes{name=~".+"} * 100

# 内存使用排行
topk(5, container_memory_usage_bytes{name=~".+"} / 1024 / 1024)

容器网络 I/O

# 网络接收速率 (bytes/sec)
rate(container_network_receive_bytes_total{name=~".+"}[5m])

# 网络发送速率
rate(container_network_transmit_bytes_total{name=~".+"}[5m])

容器重启次数

# 容器重启次数
container_restart_count{name=~".+"}

14.7 告警配置

Prometheus 告警规则

# alert_rules.yml
groups:
  - name: container_alerts
    rules:
      # 容器 CPU 使用率过高
      - alert: ContainerHighCPU
        expr: rate(container_cpu_usage_seconds_total{name=~".+"}[5m]) * 100 > 80
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "容器 {{ $labels.name }} CPU 使用率过高"
          description: "CPU 使用率已超过 80%,当前值: {{ $value }}%"

      # 容器内存使用率过高
      - alert: ContainerHighMemory
        expr: container_memory_usage_bytes{name=~".+"} / container_spec_memory_limit_bytes{name=~".+"} * 100 > 85
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "容器 {{ $labels.name }} 内存使用率过高"

      # 容器频繁重启
      - alert: ContainerRestartLoop
        expr: increase(container_restart_count{name=~".+"}[1h]) > 3
        labels:
          severity: critical
        annotations:
          summary: "容器 {{ $labels.name }} 在过去 1 小时内重启超过 3 次"

      # 容器停止运行
      - alert: ContainerDown
        expr: absent(container_last_seen{name=~".+"})
        for: 1m
        labels:
          severity: critical
        annotations:
          summary: "容器 {{ $labels.name }} 已停止"

Alertmanager 配置

# alertmanager.yml
global:
  smtp_smarthost: 'smtp.gmail.com:587'
  smtp_from: 'alert@example.com'

route:
  group_by: ['alertname', 'severity']
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 4h
  receiver: 'web.hook'

receivers:
  - name: 'web.hook'
    webhook_configs:
      - url: 'http://alertmanager-webhook:5001/'
    email_configs:
      - to: 'admin@example.com'
        subject: 'Docker 告警: {{ .GroupLabels.alertname }}'
        body: '{{ range .Alerts }}{{ .Annotations.summary }}{{ end }}'

14.8 生产环境监控栈

# 完整的监控栈
services:
  # 容器指标采集
  cadvisor:
    image: gcr.io/cadvisor/cadvisor:v0.47.0
    volumes:
      - /:/rootfs:ro
      - /var/run:/var/run:ro
      - /sys:/sys:ro
      - /var/lib/docker/:/var/lib/docker:ro
    devices:
      - /dev/kmsg:/dev/kmsg
    privileged: true

  # 宿主机指标
  node-exporter:
    image: prom/node-exporter:v1.7.0
    volumes:
      - /proc:/host/proc:ro
      - /sys:/host/sys:ro
      - /:/rootfs:ro
    command:
      - '--path.procfs=/host/proc'
      - '--path.sysfs=/host/sys'
      - '--path.rootfs=/rootfs'

  # 指标存储
  prometheus:
    image: prom/prometheus:v2.49.0
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
      - prometheus-data:/prometheus

  # 告警管理
  alertmanager:
    image: prom/alertmanager:v0.27.0
    volumes:
      - ./alertmanager.yml:/etc/alertmanager/alertmanager.yml
    ports:
      - "9093:9093"

  # 可视化
  grafana:
    image: grafana/grafana:10.2.0
    ports:
      - "3000:3000"
    volumes:
      - grafana-data:/var/lib/grafana

volumes:
  prometheus-data:
  grafana-data:

要点回顾

要点核心内容
监控体系cAdvisor (采集) + Prometheus (存储) + Grafana (可视化)
关键指标CPU、内存、网络 I/O、磁盘 I/O、容器重启
告警Prometheus Alertmanager 配置告警规则和通知
预配置使用 Grafana 导入现成仪表板快速上手
生产建议添加 Node Exporter 监控宿主机指标

注意事项

资源占用: cAdvisor + Prometheus + Grafana 约需 1-2GB 内存。资源有限的环境考虑使用轻量方案。

数据保留: Prometheus 默认保留 15 天数据。根据需求调整 --storage.tsdb.retention.time

安全: 生产环境务必修改 Grafana 默认密码,并配置认证和 HTTPS。


下一步

15 - 镜像仓库:学习 Harbor 私有仓库与镜像签名。