docker stats 显示的内存值与 free -h 差异大,是因为前者统计 cgroup v2 的 memory.current(含 RSS + page cache + slab 等实际占用物理内存),后者显示的 available 是内核估算的可回收内存(已扣除缓存),二者统计口径不同,并非 bug。

直接看 docker stats,别点 Docker Desktop 界面右下角那个“资源使用”小图标——它只显示 WSL2 整体开销,不是容器级数据。
docker stats 显示的内存值为什么和 free -h 差很多?
Docker 的内存统计默认不减缓存(cache),而 free -h 里显示的 “available” 是扣掉缓存后的估算值。两者口径不同,不是 bug。
-
docker stats报的是 cgroup v2 的memory.current,即当前实际使用的物理内存 + 缓存页 - 如果想接近
free的逻辑,得自己算:memory.current - memory.stat.inactive_file(需进容器cat /sys/fs/cgroup/memory.stat) - Windows 上用 WSL2 时,
docker stats还可能受 WSL2 动态内存回收延迟影响——容器已停,vmmemWSL进程仍占着内存没还
怎么让 docker stats 输出更实用?
默认输出太宽、字段太多,容易漏关键项。加几个参数能快速聚焦:
- 只看 CPU 和内存:
docker stats --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}" - 禁用实时刷新,取单次快照(适合脚本调用):
docker stats --no-stream --format "{{.Name}}: {{.MemPerc}}" - 查特定容器,避免被其他容器刷屏:
docker stats my-app nginx-proxy - 加
--no-trunc防止容器 ID 被截断,方便后续docker inspect定位
为什么 docker stats 里看不到某个容器?
常见原因就三个,按顺序排查:
- 容器根本没在运行:
docker ps -a | grep <name>确认状态是Up,不是Exited或Created - 容器启动失败后自动退出,但没设
restart: always,docker stats不显示已停止的容器 - 你用的是旧版 Docker Desktop(docker stats 会漏报——升级到最新版或改用
curl --unix-socket /var/run/docker.sock http://localhost/containers/<id>/stats?stream=false直接调 API
真正难搞的从来不是怎么看数据,而是看到数据后发现:容器内存涨得慢、降得更慢,vmmemWSL 占着 12GB 不放,docker stats 却说所有容器加起来才用了 1.2GB。这时候得切到 WSL2 层面查 /proc/meminfo 和 wsl --shutdown,而不是继续盯着容器指标调参数。



















