故障排查

Docker 磁盘爆满排查与清理

·5 分钟阅读·1759 字

Docker 磁盘空间占满排查流程与镜像容器清理方案

📋 目录

一、先查看磁盘占用总览

# 统计镜像/容器/数据卷/构建缓存占用
docker system df

输出四项:

  1. Images:镜像占用(无用旧镜像、多版本镜像)
  2. Containers:停止容器占用(退出未删容器的读写层)
  3. Local Volumes:数据卷占用(孤立无容器挂载的卷)
  4. 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

四、磁盘异常暴涨排查思路(实操步骤)

  1. docker system df 定位:镜像/容器/卷/缓存哪一项占比最高
  2. 镜像过高docker images | sort -k5 -h 找大体积废弃镜像,docker rmi 镜像ID
  3. 容器过高docker ps -s -a 查看容器真实占用SIZE,批量删停止容器
  4. Volume过高
# 列出所有卷+占用
docker volume ls
# 进入docker卷目录看大文件
du -sh /var/lib/docker/volumes/*
  1. 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

五、日常优化规范

  1. 构建用多阶段构建缩小镜像体积;
  2. 下线容器及时docker rm,不用遗留exited容器;
  3. 定期定时任务:每周执行docker system prune
  4. 容器配置日志滚动,防止日志爆盘。

关联文档 -../Docker 三种挂载 — 存储挂载

  • ../../linux/故障排查/服务器 IO 过高排查流程 — IO 排查