Docker overlay2存储驱动磁盘暴涨

Docker 使用 overlay2 存储驱动时,/var/lib/docker/overlay2 目录会随镜像、容器、卷和构建缓存不断膨胀,甚至把磁盘占满。
很多新手一看到这个目录很大就慌,直接删除整个目录,结果容器全部无法启动。
这篇文章会先帮你定位到底是哪部分在占空间,再按安全顺序清理,最后给出可验证的结果,全程可直接照做。

先确认空间到底被谁占了

登录服务器执行 df -h 查看磁盘整体使用率,然后进入 Docker 数据目录确认 overlay2 的大小:

du -sh /var/lib/docker/overlay2

如果这个目录确实巨大,再执行 docker system df 看各类资源的占用详情:

docker system df -v

输出里会区分 ImagesContainersLocal VolumesBuild Cache 四个维度。不要只看 overlay2 目录大小就下结论,因为镜像层数据也挂在这里。
下面按风险从低到高逐步清理。

安全释放磁盘的四个步骤

1. 清理停止的容器和悬空镜像

docker container prune -f
docker image prune -f

container prune 会删除所有已停止的容器;image prune 只清理没有标签且不被容器使用的悬空镜像。
这一步很安全,不会影响正在运行的容器。

如果确定某些旧镜像完全不用了,可以按名字或 ID 精确删除:

docker rmi 镜像ID

2. 清理无主的 Docker 卷

卷是独立于镜像存在的数据,误删会导致数据丢失。
先列出所有卷,再找出没有被容器引用的卷:

docker volume ls -f dangling=true

确认这些卷确实无用后,再执行清理:

docker volume prune -f

高危操作:不要直接删 /var/lib/docker/volumes 目录。如果某个卷当前正被容器使用,直接删目录会造成数据库或应用数据损坏。

3. 清理构建缓存

Docker 构建镜像时产生的缓存经常占用大量空间,尤其是频繁 build 的项目。
执行:

docker builder prune -f

如果连最新的构建缓存也想全部清掉,可加 -a

docker builder prune -a -f

4. 一键清理所有未使用资源

如果磁盘告急,且希望一次清掉容器、镜像、网络和构建缓存,用:

docker system prune -a --volumes

注意这个命令会删除所有未被容器使用的镜像和卷,执行前务必确认没有需要保留的数据
建议先跑一遍 docker ps -adocker volume ls 做备份确认。

overlay2 目录仍然很大的定位方法

清理完上述内容后,如果 overlay2 目录依旧占了几十 GB,说明有容器或日志在持续写入。
进入 overlay2 目录逐个查大小:

cd /var/lib/docker/overlay2
du -sh */ | sort -rh | head -20

把最大目录的 ID 和容器关联起来:

docker ps -q | xargs docker inspect --format '{{.Name}} {{.GraphDriver.Data.UpperDir}}'

对应的 UpperDir 目录就是该容器产生的可写层。
找到容器后,重点检查容器内日志文件是否过大。
Docker 默认日志驱动是 json-file,日志会不断累积:

du -sh /var/lib/docker/containers/*/*-json.log

对于日志特别大的容器,建议在 daemon.json 里加上日志轮转配置:

{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  }
}

修改后执行 systemctl restart docker,新容器日志会被限制在 10MB 以内。
如果想立即回收已占用的日志空间,先清空当前日志文件:

truncate -s 0 /var/lib/docker/containers/容器ID/容器ID-json.log

不要直接删除 json 日志文件,否则可能引起 Docker 读写异常。

清理前后如何验证结果

操作完成后,再次执行 docker system df,对比各类资源数值是否明显下降。
同时用 df -h 确认磁盘使用率已经回落。

如果空间仍然紧张,需要检查是否存在进程占用已删除文件:

lsof +L1 | grep deleted

这条命令会列出被进程打开但已标记删除的文件,这些文件不会因为删除了 while 释放空间,需要重启对应进程或容器才能真正释放。

日常避免磁盘暴涨的三个习惯

  • 给镜像打标签别只拉 latest,防止旧镜像难以识别和清理。
  • 定期执行 docker system df 查看趋势,设置 crontab 每周清理一次悬空镜像和构建缓存。
  • 日志限制一定要提前配置,不要等磁盘满了才想起改 daemon.json。

Docker overlay2 磁盘暴涨多数时候不是存储驱动本身的问题,而是镜像、容器、卷和日志堆积的结果。
按本文顺序先查后清、先安全后激进,绝大多数服务器都能在不影响业务的前提下释放大量空间。
如果你正在处理 overlay2 目录持续增大的问题,建议先做镜像和容器清理,确认日志配置后再考虑是否扩容磁盘。

关于 Docker 卷数据的安全边界,可以继续阅读站内其他容器数据备份文章,避免清理后才发现误删关键数据。

分享到:
上一篇
MySQL单表千万级数据,分表方案
下一篇
Redis生产持久化RDB+AOF
1
系统公告

机房迁移升级通知

尊敬的用户: IP 段 103.23.148.x、156.224.29.x 原香港一区线路波动、攻击频繁,平台定于 7 月 5 日凌晨分批迁移至香港 GIA 机房,硬件升级 AMD 铂金机型。 迁移均在凌晨操作,最大程度降低业务影响,迁移期间服务器临时关机; 升级后配置不降低、费用不涨价,数据默认同步迁移; 迁移后 IP 全部更换,请及时修改域名解析、防火墙白名单; 建议提前备份重要数据,有问题可联系在线客服。 感谢理解与支持! 泽御云科技 2026.06.30
服务中心
客服
在线客服
24小时为您服务
咨询
联系我们
联系我们,为您的业务提供专属服务。
24/7 技术支持
如果您遇到寻求进一步的帮助,请过工单与我们进行联系。
24/7 即时支持
泽御云
售前客服
泽御云
泽御云
售后客服
泽御云
技术支持
评价
您对当前页面的整体感受是否满意?
😞
非常不满意
😕
不满意
😐
一般
🙂
满意
😊
非常满意