Docker系统空间占用过大的清理方法详解
作者:gs80140
在日常使用 Docker 的过程中,我们经常会发现服务器磁盘空间莫名其妙地被占满。特别是 /var/lib/docker/overlay2 目录动辄几十个 G,让人怀疑是不是有人用 Docker 挖矿了……
其实,大部分情况下问题并不复杂:很多 Docker 镜像层、构建缓存、停止的容器,仍然占用大量空间却没有被清理。解决方案也非常简单,一条命令就能完成清理!
问题现象
使用 df -h 查看磁盘使用情况:
df -h
发现根目录 / 使用率接近 100%:
/dev/vda1 99% /var/lib/docker/overlay2 占用非常大
进一步查看是 Docker 的 overlay2 目录占用了大量空间:
du -h --max-depth=1 /var/lib/docker/overlay2 | sort -hr | head
结果显示几十 GB 的无效目录,甚至根本不是正在使用容器的层:
20G /var/lib/docker/overlay2/abc123...
18G /var/lib/docker/overlay2/9dd...
...
但是这些目录又不敢直接 rm -rf 删除,担心删错了导致容器启动失败。
判断哪些目录不能删
我们可以用 docker inspect 判断某个 overlay2 层是否属于正在运行的容器:
docker inspect <CONTAINER_ID> --format '{{.GraphDriver.Data.UpperDir}}'
如果匹配到 /var/lib/docker/overlay2/<id>/diff 说明是正在使用,不能动。
但是手动检查太费时间!有没有一条命令能自动清理?
解决方案:一条命令,自动清理
docker system prune
默认清理内容:
| 清理内容 | 说明 |
|---|---|
| 停止的容器 | Exited 状态 |
| 无用的网络 | bridge 等临时网络 |
| dangling images | <none> 类型的镜像层 |
| build cache | Docker 构建缓存 |
执行时会提示确认:
WARNING! This will remove:
- all stopped containers
- all networks not used by at least one container
- all dangling images
- all build cache
Are you sure you want to continue? [y/N] y
效果立竿见影:清理后 overlay2 目录明显缩小,磁盘恢复正常!
如果想清理更多空间
docker system prune -a
这会额外清理 所有未使用的镜像(包括没有运行容器引用的)
更彻底的版本(连 volumes 一起清)
docker system prune -a --volumes
注意:执行前一定要确认 volume 是否还在使用!
清理前后对比
| 状态 | 磁盘使用率 |
|---|---|
| 清理前 | 98% |
| 执行 docker system prune 后 | 降到 65% |
| 再执行 -a --volumes 后 | 仅 40% |
建议定期维护
可以写成定时任务,每周清理一次:
# /etc/crontab 0 3 * * SUN root docker system prune -a -f
总结
| 问题 | 解决方法 |
|---|---|
| overlay2 占空间大 | docker system prune |
| 停止的容器太多 | docker ps -a → docker rm |
| 镜像太多 | docker image prune -a |
| 卷占空间 | docker volume prune |
实战经验
千万不要手动 rm -rf /var/lib/docker/overlay2/...
最安全的清理方式永远是 Docker 官方命令!
这样不仅避免误删容器层,也让 Docker 内部的元数据保持一致,系统更稳定。
结语
如果你也遇到系统空间被 Docker 吃光的问题,不妨试试这一条命令:
docker system prune
到此这篇关于Docker系统空间占用过大的清理方法详解的文章就介绍到这了,更多相关Docker空间占用过大清理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
