不能。docker stats 只对正在运行的容器输出数据;已停止或退出状态的容器执行该命令后对应行为空白或不显示,而“空闲”但仍在运行的容器会持续刷新数值,如 CPU% 接近 0.00%、MEM USAGE 稳定,即为其真实空闲态表现。

docker stats 能不能看到容器空闲时的资源占用?
不能。docker stats 只对正在运行的容器输出数据;已停止或退出状态的容器,执行该命令后对应行为空白或直接不显示。所谓“空闲”,如果指容器进程仍在后台运行但无业务负载(比如 nginx 启动后没请求),它依然算“运行中”,docker stats 会持续刷新数值——此时看到的 CPU% 接近 0.00%、MEM USAGE 稳定在几百 MB,就是它的真实空闲态表现。
怎么对比同一容器启动前后、有负载和无负载的资源差异?
关键不是等它“变空闲”,而是主动控制变量、分阶段采集快照:
- 启动容器后立刻执行
docker stats --no-stream,记录初始值(含冷启动开销) - 模拟真实负载(如发 100 次 HTTP 请求、跑一段批处理脚本)
- 负载结束后等待 5–10 秒,再执行一次
docker stats --no-stream,观察 MEM USAGE 是否回落、CPU% 是否归零 - 若内存未回落且持续缓慢上涨,可能是应用内存泄漏;若 CPU% 在无请求时仍 >0.1%,需检查后台健康检查、日志轮转或定时任务
为什么 Windows/macOS 上看到的“空闲内存”比 Linux 更高?
这不是容器的问题,是 Docker Desktop 底层虚拟机的资源管理逻辑不同:
- Windows(WSL2 后端):
vmmemWSL进程会预分配内存,即使容器空闲,任务管理器里也显示高位占用;实际可用内存由 WSL2 内核动态回收,但不实时反映在宿主机 UI 上 - macOS(Virtualization.framework):内存释放更积极,但如果你在 Docker Desktop 设置里启用了 “Memory limit”,空闲时看到的 MEM USAGE / LIMIT 才有意义;否则 LIMIT 显示的是宿主机总内存,不具备约束力
- Linux(原生 Docker):
docker stats中的 MEM USAGE 是 cgroup 实际用量(已减去 page cache),空闲态数值最贴近应用真实驻留内存
容易被忽略的“伪空闲”陷阱
有些容器看似静默,实则暗中吃资源:
-
crond或supervisord类进程会常驻并定期唤醒子任务,导致 PIDS 数稳定在 3–5,CPU% 波动但不归零 - Java 容器未设置
-XX:+UseContainerSupport,JVM 会按宿主机总内存分配堆,即使容器只用 100MB,MEM USAGE也可能卡在 1.2GB 不动 - Node.js 应用未关闭未处理的 Promise 或未清理
setInterval,事件循环持续活跃,CPU %始终 >0.02% - 容器内运行了
tail -f /var/log/app.log这类阻塞式命令,它本身不耗 CPU,但会阻止主进程退出,让容器维持“运行中”状态——这时docker stats显示的只是 shell 进程的基线开销
真正要确认空闲态是否合理,得结合 docker exec -it 看进程树,而不是只盯 docker stats 的汇总数字。











