引言:/var/lib/docker 爆满的困境

在使用 Docker 的过程中,你是否遇到过服务器磁盘空间突然被占满的“灾难”?尤其是当你执行 docker images 时,却发现镜像体积看似正常,却无法解释 /var/lib/docker 目录的异常膨胀?这种问题的根源往往隐藏在 容器的可写层 中——一个被忽视的“隐形杀手”。

本文将带你深入排查 Docker 容器磁盘空间占用的真相,并提供从诊断到清理的完整解决方案。

一、Docker 磁盘空间的构成

Docker 的磁盘空间主要由以下组件占用:

  • 镜像(Images):基础镜像
  • 容器(Containers):容器运行时产生的可写层
  • 卷(Volumes):持久化数据的存储

当 /var/lib/docker 爆满时,90% 的情况与 镜像或容器的可写层有关。以下是关键排查步骤。

二、定位问题:容器的“双面数据”

查看 Docker 整体磁盘使用
docker system df

Docker磁盘空间爆满的隐形杀手:容器可写层的深度排查指南_容器

RECLAIMABLE 列:显示可回收空间比例,若数值高,则说明存在大量可清理资源。

深入查看容器磁盘占用
docker ps -a --format "table {{.ID}}\t{{.Names}}\t{{.Size}}"

Docker磁盘空间爆满的隐形杀手:容器可写层的深度排查指南_Docker_02

关键概念解析:

1.29MB(前值需关注):容器的可写层大小

这是容器运行时产生的增量数据,包括:

  • 容器内修改的文件(如日志、缓存)
  • 安装的新软件包
  • 持久化数据(如果未挂载卷)
  • 临时文件或未清理的中间产物

576MB(后值):容器的镜像大小

这是容器所依赖的镜像总和(包括所有基础层),即使多个容器共享同一镜像,每个容器的 VIRTUAL SIZE 会重复计算。

如何查找问题容器?
  • 可写层异常大:例如 5GB 的可写层远超预期。
  • 未正确挂载卷:本应持久化的数据直接写入容器文件系统。

Docker磁盘空间爆满的隐形杀手:容器可写层的深度排查指南_容器_03

即便一个服务器上的容器有数百个,使用上述方法,只用30秒便找到了问题容器

三、清理方案:释放被占用的空间

  • 删除有问题的容器,进行重建: docker rm <容器名>
  • 删除未使用的镜像: docker image prune -a
  • 删除未使用的匿名volume :docker volume prune

四、监控与预警

使用 Prometheus/Influxdb + Grafana 监控 Docker 磁盘(/var/lib/docker)使用情况,设置阈值告警。

结语:从“爆满”到“可控”

Docker 的磁盘空间问题并非不可解,关键在于理解容器的“双面数据”——镜像的虚拟大小与可写层的增量占用。通过系统化的排查和预防措施,可以将 /var/lib/docker 的“隐形杀手”转化为可控资源,让 Docker 环境高效运行。