用Docker部署应用的团队几乎都会遇到同一个问题:服务器磁盘用着用着就满了,df一看明明没装多少东西。这通常是Docker在悄悄吃空间——构建产生的悬空镜像、反复拉取的新版本镜像、以及不设上限的容器日志,都会在不知不觉中把磁盘塞满。本文整理一套Docker磁盘清理的完整方法。

先看清楚空间都被谁占了
清理之前先做体检,明确空间去向,避免盲目删除。Docker自带的命令可以直接给出占用概览:
# 查看Docker各项资源占用
sudo docker system df
# 查看镜像与容器占用的详细情况
sudo docker system df -v | head -60
# 查看最大的镜像
sudo docker images | sort -k7 -h | tail -10
输出里的 Images 指镜像层占用的总量,Containers 指运行中容器的可写层,Local Volumes 是具名数据卷,Build Cache 是构建缓存。看清这几项的比例,就知道该从哪里入手了。
清理悬空镜像与无用资源
docker system prune 是最常用的清理命令,会删除已停止的容器、悬空镜像与无用网络。加 -a 参数会进一步删除所有未被容器使用的镜像,谨慎使用,因为删除后需要重新拉取:
# 只清理悬空资源(推荐日常使用)
sudo docker system prune -f
# 彻底清理所有未使用镜像与构建缓存
sudo docker system prune -a --volumes -f
需要说明:–volumes 会删除未被容器引用的数据卷,里面可能存有重要数据,执行前务必确认没有需要保留的卷。建议先用 docker volume ls 检查一遍。
清理失控增长的容器日志
容器默认会把日志写到宿主机的 /var/lib/docker/containers 下,如果不加限制,单个容器日志可以涨到几个G甚至几十个G。最有效的做法是从源头限制:在 /etc/docker/daemon.json 里配置日志轮转后重启Docker:
{
"log-driver": "json-file",
"log-opts": {
"max-size": "20m",
"max-file": "5"
}
}
# 重启Docker使配置生效
sudo systemctl restart docker
对已经超大的日志文件,可以清空正在使用的日志(容器无需重启,因为它是按文件追加写入的):
# 找出占用最大的容器日志文件
sudo du -sh /var/lib/docker/containers/*/*-json.log | sort -rh | head
# 清空指定容器的日志文件
sudo truncate -s 0 /var/lib/docker/containers/<容器ID>/*-json.log
如何从源头减少磁盘占用
- 镜像尽量使用精简的基础镜像(如alpine),减小镜像体积;
- Dockerfile里把依赖安装与清理放在同一层,减少中间层残留;
- 不用的旧镜像通过标签策略定期清理,或接入镜像仓库的保留策略;
- 高频更新的服务做好日志采集(如接入日志平台),宿主机上不保留过多历史日志;
- 为日志目录和数据目录单独挂载数据盘,避免与系统盘争抢空间。
相关问答FAQs
- 问:docker system prune -a 会把正在用的镜像删掉吗?答:不会,它只删除没有被任何容器(含停止容器)引用的镜像,但删除后重新拉取需要时间,生产环境请谨慎。
- 问:清理构建缓存会影响什么?答:只会让下次构建重新拉取依赖、构建时间变长,不会影响已构建的镜像。
- 问:容器日志能设置自动清理吗?答:可以,最推荐的方式是配置daemon.json的日志轮转参数,或使用docker-compose中logging段的max-size配置。
Docker磁盘问题预防大于清理:日志限流、精简镜像、定期prune应该成为日常运维习惯。建议把 docker system df 和日志大小检查加入每周巡检脚本,在磁盘告警之前就发现问题,而不是等空间满了再连夜清理。
【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!