docker stats 默认会一直刷屏,按 Ctrl+C 才停。如果只想看某一刻的 CPU、内存占用,加 --no-stream 让它取一次就退出。

典型场景是:在脚本里定时采集容器用量、排查某个容器是不是刚吃了大量内存,或者只想把一次结果贴进工单。这时候滚动输出既碍事,也没法直接接管道。

为什么默认会一直刷

docker stats 本质上是一个持续采样的客户端。它每隔一小段时间向 Docker 守护进程要一次统计数据,然后重绘整屏。这个循环不会自己停,所以终端里看到的是一块不断刷新的表格。

--no-stream 的作用就是关掉这个循环:只请求一次、打印一次、进程退出。退出后终端回到提示符,输出可以正常重定向到文件或被其他命令处理。

需要知道的一点是,单次快照里的 CPU 百分比是一个采样区间内的平均值,不是瞬间值。第一次取数时区间很短,数值可能有偏差;连续取两三次再对比会更稳。

怎么做

最基本的一次性快照,直接加参数即可:

# 取一次所有运行中容器的资源用量后立即退出
docker stats --no-stream

如果只关心某个容器,把容器名或 ID 放在后面。这样输出只有一行,方便阅读:

# 只看名为 web 的容器,取一次快照
docker stats --no-stream web

想指定列、去掉不需要的字段,用 --format。它接受 Go 模板语法,字段名来自 docker stats 的输出列:

# 只输出容器名、CPU 百分比和内存用量,便于脚本解析
docker stats --no-stream --format "{{.Name}} {{.CPUPerc}} {{.MemUsage}}"

写进脚本采集时,通常还会配合 --no-trunc 保留完整容器 ID,避免短 ID 撞车:

# 保留完整 ID,输出一行 CSV 追加到日志
docker stats --no-stream --no-trunc --format "{{.ID}},{{.CPUPerc}},{{.MemUsage}}" >> stats.log

注意 --no-stream 不能和 --all 之外的一些交互式用法混着期待实时效果;它本来就是一次性的,别指望它持续监控。要持续采集,就在外部用循环或定时任务反复调用它。

怎么确认成功了

命令正常结束时,终端直接回到提示符,没有残留的刷新画面。输出里每个容器一行,列头和默认模式一致。

如果容器名写错,会看到类似 Error response from daemon: No such container: xxx 的报错,说明名字或 ID 不对,用 docker ps 核对一下。

如果输出为空但没报错,多半是当时没有运行中的容器。docker stats 默认只统计运行中的容器,已停止的不在列表里。

接管道时如果格式串写错字段名,模板会渲染成空值或报模板错误,检查 --format 里的字段拼写即可。

边界和代价

单次快照只反映取样那一刻,抓不到短时尖峰。要观察波动,还是得用持续模式或外部监控系统。

--no-stream 每次调用都会新建一次到守护进程的连接,高频循环调用会有额外开销,采集间隔别设得太密。

另外,容器内的进程如果已经退出但容器还在,统计值可能接近零,这不代表容器不存在,只是没有活跃负载。判断容器状态应该看 docker ps,而不是只看 stats 的数字。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注