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
输出里会区分 Images、Containers、Local Volumes、Build 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 -a 和 docker 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 卷数据的安全边界,可以继续阅读站内其他容器数据备份文章,避免清理后才发现误删关键数据。