docker 27原生上报容器底层物理状态的关键是启用experimental模式并配置metrics-addr,同时强制使用cgroups v2及显式声明prometheus collectors(cgroup/network/pids),指标直采自/sys/fs/cgroup路径,非用户态轮询。

要让 Docker 守护进程原生上报容器底层物理状态(如 CPU、内存、IO、网络、PIDs 等),关键不是单纯开启 metrics-addr,而是启用实验性指标能力并配合 cgroups v2 与 Prometheus 原生集成路径。Docker 27 起已将这一能力深度内置,无需额外导出器。
必须启用 experimental 模式
metrics-addr 是一个“开关型”配置项:它只在 "experimental": true 存在时才生效。若 daemon.json 中缺少该字段,即使写了 metrics-addr,Docker 启动时也会静默忽略。
- 编辑 /etc/docker/daemon.json,确保包含以下两项(顺序无关):
"experimental": true-
"metrics-addr": "127.0.0.1:9323"(本地采集用)或"0.0.0.0:9323"(远程采集需配防火墙) - 保存后执行
sudo systemctl reload docker或sudo systemctl restart docker - 验证是否生效:
curl -s http://localhost:9323/metrics | grep HELP | head -n 3,应看到类似# HELP docker_container_cpu_usage_seconds_total的输出
确保宿主机运行 cgroups v2
Docker 27 默认依赖 cgroups v2 提供细粒度、低延迟的底层指标(如 container_memory_pressure_ratio、container_blkio_io_serviced_recursive_total)。若系统仍使用 cgroups v1,多数新指标将缺失或为 0。
- 检查当前模式:
stat -fc %T /sys/fs/cgroup,返回cgroup2fs表示已启用 - 若返回
cgroup,需在内核启动参数中添加systemd.unified_cgroup_hierarchy=1并重启 - 确认 Docker 正在使用 v2:
docker info | grep "Cgroup Version",应显示Cgroup Version: 2
启用 network 和 pids 等扩展采集器(Docker 27+)
从 Docker 27 开始,可通过 prometheus.collectors 显式声明要暴露的指标类别。仅靠 metrics-addr 默认不开启网络和进程数统计。
- 在 daemon.json 的
prometheus块中加入 collectors 配置: "prometheus": { "enable": true, "collectors": ["cgroup", "network", "pids"] }- 其中
network收集容器网络命名空间下的基础计数(如 packet_in/out、bytes_in/out),虽非流级协议分析,但已是原生内核级数据 -
pids提供每个容器的进程数量,对防 fork bomb 和资源异常扩散至关重要
验证底层物理状态是否真实上报
原生上报的核心标志是:指标直接来自 /sys/fs/cgroup/ 层级路径,而非轮询 docker stats 这类用户态快照。可交叉比对以下三项:
- 查指标值:
curl -s http://localhost:9323/metrics | grep container_memory_usage_bytes,确认有非零数值且随容器负载变化 - 查对应 cgroup 路径:
ls /sys/fs/cgroup/docker/*/memory.current 2>/dev/null | head -1,应能定位到实际文件 - 查实时压力信号:
curl -s http://localhost:9323/metrics | grep container_memory_pressure_ratio,该指标仅 v2 + Docker 27 原生支持,值域为 0.0–1.0











