docker stats 无法直接接入 Grafana,因其仅输出非结构化终端流,无 API、无持久化;需用 cAdvisor 等工具暴露 Prometheus 格式指标,再通过 Prometheus 抓取并由 Grafana 可视化。

单纯用 docker stats 命令无法直接构建 Grafana 看板,因为它只输出实时终端流,不提供可被 Grafana 读取的结构化、持久化或 API 形式的数据源。要实现“基于 docker stats 数据的 Grafana 实时负载看板”,本质是**用其他工具采集并暴露等效指标,再接入 Grafana**。
为什么不能直接用 docker stats 接入 Grafana
docker stats 是一个 CLI 工具,运行时依赖 Docker 守护进程的实时 socket 通信,输出为格式化文本(非 JSON/HTTP/metrics),且无历史数据、无 API 接口、不支持多实例聚合。Grafana 无法从中拉取数据,也不兼容其输出格式。
替代方案:用 cAdvisor 暴露等效指标(推荐)
cAdvisor 是 Google 开发的容器监控代理,它底层正是调用与 docker stats 相同的 Docker Engine API,但封装为标准的 Prometheus metrics 格式(/metrics HTTP 接口),天然适配 Grafana + Prometheus 架构。
- 启动 cAdvisor 容器:
docker run -d \--name=cadvisor \--privileged \--volume=/:/rootfs:ro \--volume=/var/run:/var/run:rw \--volume=/sys:/sys:ro \--volume=/var/lib/docker/:/var/lib/docker:ro \--publish=8080:8080 \--detach=true \gcr.io/cadvisor/cadvisor:v0.49.1 - 访问
http://localhost:8080/metrics可看到类似container_cpu_usage_seconds_total{container="cadvisor",...}的原生指标,这正是docker stats中 CPU%、内存用量等字段的时序化表达 - 在 Prometheus 配置中添加 job 抓取该地址(
scrape_configs中加一项 target 为localhost:8080)
Grafana 中配置容器实时负载看板
接入 Prometheus 数据源后,在 Grafana 中新建 Dashboard,添加 Panel 即可展示实时负载:
-
CPU 使用率:用 PromQL 查询
100 * (rate(container_cpu_usage_seconds_total{image!=""}[1m]) / ignoring(container, pod) group_left(node) node_cpu_seconds_total{mode="system"} ),或更简化的100 * (rate(container_cpu_usage_seconds_total{container!="",name=~".+"}[1m]) / on(container) group_left() container_spec_cpu_quota{container!="",name=~".+"} * 100000) -
内存使用量 & 百分比:查询
container_memory_usage_bytes{container!="",name=~".+"}和container_memory_usage_percent{container!="",name=~".+"}(需 cAdvisor v0.47+) -
网络 I/O 实时速率:用
rate(container_network_receive_bytes_total[1m])和rate(container_network_transmit_bytes_total[1m]) - 建议开启自动刷新(如 5s 或 10s),并设置时间范围为 “Last 5 minutes” 或 “Live” 模式,获得接近
docker stats的实时感
轻量级补充:statsd + 自定义埋点(适合特定场景)
若你已有应用主动上报指标的习惯,也可用 statsd 收集自定义负载信号(如请求延迟 P95、队列长度),再通过 Grafana 的 StatsD 数据源展示。但这不是对 docker stats 的替代,而是另一条路径——它不监控容器本身资源,而是监控业务逻辑层的负载表现。











