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