一、先查看磁盘占用总览
# 统计镜像/容器/数据卷/构建缓存占用
docker system df
输出四项:
- Images:镜像占用(无用旧镜像、多版本镜像)
- Containers:停止容器占用(退出未删容器的读写层)
- Local Volumes:数据卷占用(孤立无容器挂载的卷)
- Build Cache:构建缓存(build残留中间缓存)
只看明细
# 镜像大小排序
docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}" | sort -k4 -h
# 查看所有停止容器
docker ps -a
二、一键清理命令(prune系列,生产分级使用)
1.清理停止的容器、无用网络、悬空镜像、构建缓存(最常用)
docker system prune
- 删除:已停止容器(died/exited)、未被使用网桥网络、dangling悬空镜像**:**、build缓存
- 不删正常在用镜像、在用volume
2.加 -a 彻底清理(慎用,空闲镜像全删)
# -a:删除所有未被容器引用的镜像 + 上述资源
docker system prune -a
3.清理孤立数据卷(重点,磁盘暴涨元凶)
# -v:删除没有任何容器挂载的无用volume
docker system prune -av
volume一旦挂载容器不会被删,只有孤儿卷被清理。
4.按时间清理(7天未使用资源)
# 删除7天以上未使用镜像、容器
docker system prune -a --filter "until=168h"
三、分项精准清理(精细化运维,推荐)
1)清理悬空镜像 (构建残留)
docker image prune
# 全清无用镜像
docker image prune -a
悬空镜像成因:Dockerfile重新build,旧镜像无tag变成none。
2)批量清理退出容器
# 删除所有已停止容器
docker container prune
# 手动删指定容器
docker rm $(docker ps -aq -f status=exited)
容器即便停止,Upper读写层仍占用磁盘。
3)清理无用数据卷
docker volume prune
场景:容器删除但忘了删-v,遗留孤儿卷堆积。
4)清理构建缓存
docker builder prune
四、磁盘异常暴涨排查思路(实操步骤)
docker system df定位:镜像/容器/卷/缓存哪一项占比最高- 镜像过高:
docker images | sort -k5 -h找大体积废弃镜像,docker rmi 镜像ID - 容器过高:
docker ps -s -a查看容器真实占用SIZE,批量删停止容器 - Volume过高:
# 列出所有卷+占用
docker volume ls
# 进入docker卷目录看大文件
du -sh /var/lib/docker/volumes/*
- Docker运行日志爆满(最容易忽略)
容器stdout日志无限打满磁盘:
# 查找超大容器日志
find /var/lib/docker/containers/ -name *-json.log -size +1G
# 清空日志(不能rm直接删,要truncate)
truncate -s 0 xxx-json.log
根治:docker run 配置日志驱动限制大小 --log-opt max-size=100m --log-opt max-file=3
五、日常优化规范
- 构建用多阶段构建缩小镜像体积;
- 下线容器及时
docker rm,不用遗留exited容器; - 定期定时任务:每周执行
docker system prune; - 容器配置日志滚动,防止日志爆盘。
关联文档 -../Docker 三种挂载 — 存储挂载
- ../../linux/故障排查/服务器 IO 过高排查流程 — IO 排查