You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

/var/lib/docker分区df与du显示容量不一致问题咨询

Why does df -h and du -sch show different usage for /var/lib/docker?

这个问题我碰到过好多次了,结合Docker的场景,主要是这几个原因导致df和du的统计结果对不上:

  • 被Docker进程持有的已删除文件
    Linux文件系统有个特殊机制:如果一个文件已经被删除,但还有进程在打开它(比如Docker守护进程或者运行中的容器在写日志),df会继续统计这个文件占用的空间,但du遍历目录结构时找不到这个文件,自然不会把它算进去。这种情况在Docker环境里特别常见——比如你手动删除了容器的日志文件,但容器还在运行,进程还握着文件句柄,那这部分空间就一直被占用着,df能看到,du却看不到。
    你可以用这个命令排查这类文件:lsof | grep deleted | grep docker,找到对应的进程后,重启容器或者Docker daemon就能释放这部分空间了。

  • Docker分层存储的共享层与跨文件系统挂载
    Docker采用分层文件系统(比如overlay2),很多镜像层是被多个容器共享的。du默认会把每个文件的大小都统计一遍,哪怕是通过硬链接共享的层,而df统计的是实际占用的磁盘块(共享层只算一次),这就会导致du的结果比df大很多。
    另外,如果有跨文件系统的挂载(比如把宿主机其他分区的目录挂载到了/var/lib/docker下的子目录),du会把这些挂载进来的内容也算进去,但df只统计当前分区的使用。你可以给du加上-x参数跳过跨文件系统的内容:du -schx /var/lib/docker,这样统计出来的结果会更接近df的数值。

  • Docker未清理的残留资源
    有时候你以为已经清理了Docker资源,但其实还有构建缓存、悬空镜像、未使用的数据卷或者停止的容器残留着。du会把这些都算进去,但更推荐用Docker自带的命令docker system df来查看Docker资源的真实占用——它能清晰区分镜像、容器、卷的空间使用情况,比du更精准。

总结一下,你可以按这个步骤排查:

  1. 先运行docker system df查看Docker自身的资源占用
  2. 用du -schx /var/lib/docker统计当前分区内docker目录的真实大小,和df结果对比
  3. 用lsof命令排查被进程持有的已删除文件

内容的提问来源于stack exchange,提问作者gurbelunder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 07:43:57