docker 磁盘占用排查与清理实战 2025-11-27 程序之旅 暂无评论 4 次阅读 **Docker 磁盘占用排查与清理实战** 本文给出一套可复制的排查与清理流程,聚焦 Docker 镜像/容器/卷/构建缓存与日志。适合空间告急或想控盘的场景。 **先判断是不是 Docker 占用** - 看分区占用:`df -hT`(关注 `/` 和 Use%) - 看 Docker 资源占用:`docker system df -v` - Images/Containers/Volumes:实际数据 - Build cache:构建中间产物(可安全清理,影响是下次构建变慢) **定位 Docker 数据路径与大户** - Docker 根数据目录:`/var/lib/docker`(overlay2/volumes/containers 等) - 统计各子目录大小 ``` sudo du -xh --max-depth=1 -x /var/lib/docker | sort -hr sudo du -xh --max-depth=1 -x /var/lib/docker/overlay2 | sort -hr sudo du -xh --max-depth=1 -x /var/lib/docker/volumes | sort -hr ``` - 找容器的绑定挂载(bind mount 的宿主机目录也算在系统盘) ``` docker ps -q | xargs -r docker inspect --format '{{.Name}} -> {{range .Mounts}}{{.Type}} {{.Source}} => {{.Destination}} {{end}}' # 对输出里的每个 Source 做 du sudo du -shx <某个宿主机路径> ``` **清理策略(由温和到激进)** - 构建缓存(最安全,常见能回收 GB 级) ``` # 清理默认 builder 的 BuildKit 缓存(你看到的 1.7G 就在这里) docker builder prune -af # 更保守:只删 7 天前的缓存 docker builder prune --filter 'until=168h' -f # 若使用 buildx 自定义 builder docker buildx prune -af ``` - 未用镜像/容器/网络(不影响运行中容器) ``` docker image prune -a -f # 删未被容器使用的镜像(含旧标签) docker container prune -f # 删已退出容器 docker network prune -f # 删未用网络 ``` - 未用卷(谨慎;仅删除未被任何容器引用的卷) ``` docker volume prune -f ``` - 一键聚合(更激进) ``` docker system prune -af --volumes # 包含未用卷 ``` 提示:`-a` 扩大清理范围,`-f` 跳过确认。正在运行的容器不会被删,但后续构建会因无缓存而变慢。 **容器“变胖”的两个常见原因** - 容器可写层增长(`docker system df -v` 里的 SIZE 列) - 这是容器文件系统内部的变化,常见于写入未挂载到卷的路径。解决:将数据改为卷/绑定挂载;必要时重建容器。 - 容器日志过大(json-file 驱动) - 日志文件:`/var/lib/docker/containers//-json.log` - 临时截断(不中断服务): ``` sudo truncate -s 0 /var/lib/docker/containers/*/*-json.log ``` - 从源头限制(编辑 `/etc/docker/daemon.json`): ``` { "log-driver": "json-file", "log-opts": { "max-size": "50m", "max-file": "3" } } # 然后:sudo systemctl reload docker ``` **推荐实战流程(可一条条执行)** 1) 判断是否需要动 Docker ``` df -hT docker system df -v ``` 2) 优先回收“无伤”的构建缓存 ``` docker builder prune -af ``` 3) 清理未用资源 ``` docker image prune -a -f docker container prune -f docker network prune -f # 如需一起清理卷:docker system prune -af --volumes ``` 4) 若占用仍高,定位具体目录 ``` sudo du -xh --max-depth=1 -x /var/lib/docker | sort -hr docker ps -q | xargs -r docker inspect --format '{{.Name}} -> {{range .Mounts}}{{.Type}} {{.Source}} => {{.Destination}} {{end}}' ``` 5) 针对性处理 - 日志过大:截断或开启日志轮转 - 可写层增胖:改为卷/绑定挂载,必要时重建容器 - 卷太大:确认数据是否可删/归档,再清理 **常用命令速查** - 查看 Docker 占用:`docker system df -v` - 查看镜像/容器/卷:`docker images -a`、`docker ps -a`、`docker volume ls` - 清理构建缓存:`docker builder prune -af` - 清理未用镜像/容器/网络/卷:`docker image|container|network|volume prune` - 一键清理:`docker system prune -af --volumes` - 容器日志路径:`/var/lib/docker/containers/*/*-json.log` 如果你愿意,我可以根据你的当前输出,给出一组“最小代价、最大回收”的具体命令顺序,并估算能释放的空间。 打赏: 微信, 支付宝 标签: docker 本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。