分析 Docker 磁盘占用

以下是分析 Docker 磁盘占用的详细步骤和工具指南,帮助开发者快速定位和清理冗余数据:

1. 查看 Docker 磁盘使用概览

复制代码
docker system df

输出说明

复制代码
TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
Images          15        10        5.2GB     1.1GB (21%)
Containers      12        5         1.3GB     800MB (61%)
Local Volumes   7         3         2.5GB     1.8GB (72%)
Build Cache     45        0         3.7GB     3.7GB (100%)

各部分含义解析

1)Images(镜像)

  • TOTAL:系统中存在的镜像总数(包括中间层镜像)。
  • ACTIVE:当前被容器使用的镜像数量。
  • SIZE:所有镜像占用的总磁盘空间。
  • RECLAIMABLE :可回收的镜像空间(未被任何容器使用的镜像)。示例 :1.234GB(52%)表示可以通过 docker image prune 释放 1.234GB,占总镜像空间的 52%。

2)Containers(容器)

  • TOTAL:系统中存在的容器总数(包括已停止的容器)。
  • ACTIVE:当前正在运行的容器数量。
  • SIZE:所有容器的可写层占用的总空间(容器内文件的变更)。
  • RECLAIMABLE :已停止容器的可写层空间。示例 :100.2MB(81%)表示可以通过 docker container prune 释放 100.2MB。

3)Local Volumes(本地卷)

  • TOTAL:系统中存在的本地卷总数。
  • ACTIVE:当前被容器挂载的卷数量。
  • SIZE:所有卷占用的总磁盘空间。
  • RECLAIMABLE :未被任何容器使用的卷空间。示例 :456.7MB(80%)表示可以通过 docker volume prune 释放 456.7MB。

4)Build Cache(构建缓存)

  • TOTAL:Docker 构建过程中创建的缓存层总数。
  • ACTIVE:当前被新构建复用的缓存层数量。
  • SIZE:所有构建缓存占用的总空间。
  • RECLAIMABLE :未被使用的缓存空间(默认全部可回收)。示例 :3.456GB(100%)表示可以通过 docker builder prune 释放全部缓存。

2. 定位具体占用项

(1) 镜像占用分析
复制代码
# 列出所有镜像(按大小排序)
docker images --format "{{.ID}}\t{{.Repository}}\t{{.Tag}}\t{{.Size}}" | sort -k 4 -h -r


# 查看悬空镜像(未被任何容器引用的中间层)
docker images --filter "dangling=true"
(2) 容器占用分析
复制代码
# 列出所有容器(包括已停止的,显示磁盘占用)
docker ps -a --size

输出关键列

  • SIZE: 容器可写层大小(增量修改)。

  • VIRTUAL SIZE: 容器关联镜像的总大小。

(3) 数据卷占用分析
复制代码
# 列出所有数据卷
docker volume ls

# 查看数据卷详情(包括挂载点和占用空间)
docker system df -v
(4) 构建缓存分析
复制代码
# 查看构建缓存(包括未使用的中间层)
docker builder prune --dry-run
(5) 日志文件分析
复制代码
# 查看容器日志文件占用(默认路径)
sudo du -sh /var/lib/docker/containers/*/*-json.log

# 查看单个容器的日志大小
docker logs <容器名> --since 1h | wc -c  # 统计最近1小时的日志大小

3. 清理策略

(1) 清理未使用的镜像
复制代码
# 删除悬空镜像
docker image prune

# 删除未被容器引用的所有镜像
docker image prune -a
(2) 清理停止的容器
复制代码
# 删除所有已停止的容器
docker container prune

# 删除指定条件的容器(如退出状态为0的)
docker rm $(docker ps -aq --filter "status=exited")
(3) 清理数据卷
复制代码
# 删除未使用的数据卷
docker volume prune
(4) 清理构建缓存
复制代码
# 删除所有构建缓存
docker builder prune --all
(5) 清理日志文件
  • 手动清理

    复制代码
    # 清空日志文件(不删除文件)
    truncate -s 0 /var/lib/docker/containers/<容器ID>/*-json.log
  • 自动轮转

    在容器启动时限制日志大小(docker rundocker-compose.yml):

    复制代码
    logging:
      driver: "json-file"
      options:
        max-size: "10m"   # 单个日志文件最大10MB
        max-file: "3"      # 最多保留3个日志文件

4. 深度分析工具

(1) 可视化工具 - dive

分析镜像层内容,定位大文件:

复制代码
# 安装 dive
curl -sS https://webinstall.dev/dive | bash

# 分析镜像
dive <镜像名>
(2) 目录分析工具 - ncdu

扫描 Docker 存储目录:

复制代码
# 安装 ncdu
sudo apt install ncdu

# 分析 Docker 数据目录
sudo ncdu /var/lib/docker

5. 预防磁盘占满

(1) 配置 Docker 存储驱动

编辑 /etc/docker/daemon.json,限制存储大小(适用于 devicemapperoverlay2):

复制代码
{
  "storage-driver": "overlay2",
  "storage-opts": [
    "overlay2.size=20G"  # 限制存储池大小
  ]
}
(2) 监控告警
  • 使用 cAdvisor + Prometheus + Grafana 监控 Docker 资源。

  • 设置磁盘空间阈值告警(如超过 80% 触发清理脚本)。

6. 常见问题

问题 1:/var/lib/docker 占用过大

原因:镜像层、日志或未清理的容器堆积。

解决

复制代码
# 清理所有未使用的 Docker 资源
docker system prune --all --volumes
问题 2:容器日志持续增长

原因:未配置日志轮转或应用日志输出过多。

解决 :配置 max-sizemax-file 参数,或改用非阻塞日志驱动(如 journald)。

7. 注意事项

谨慎使用 -a 标志prune -a 会删除所有未使用的资源(如镜像、缓存),可能导致后续构建或部署变慢。

监控关键资源 :重点关注 Build Cache 的大小,尤其是频繁进行 Docker 构建的环境。

生产环境慎用:在生产环境清理资源前,建议先备份重要数据,避免意外删除。

总结

资源类型 占用位置 清理命令
镜像 /var/lib/docker/image docker image prune -a
容器 /var/lib/docker/containers docker container prune
数据卷 /var/lib/docker/volumes docker volume prune
日志 容器日志文件 配置日志轮转

通过定期检查(如每周执行 docker system prune)和合理配置,可有效控制 Docker 磁盘占用。

相关推荐
xcs194057 分钟前
集运维 麒麟桌面版v10 sp1 2403 aarch64 离线java开发环境自动化安装
运维·自动化
BAOYUCompany10 分钟前
暴雨服务器成功中标华中科技大学集成电路学院服务器采购项目
运维·服务器
超龄超能程序猿1 小时前
Bitvisse SSH Client 安装配置文档
运维·ssh·github
奈斯ing1 小时前
【Redis篇】数据库架构演进中Redis缓存的技术必然性—高并发场景下穿透、击穿、雪崩的体系化解决方案
运维·redis·缓存·数据库架构
Connie14511 小时前
k8s多集群管理中的联邦和舰队如何理解?
云原生·容器·kubernetes
鳄鱼皮坡1 小时前
仿muduo库One Thread One Loop式主从Reactor模型实现高并发服务器
运维·服务器
即将头秃的程序媛2 小时前
centos 7.9安装tomcat,并实现开机自启
linux·运维·centos
小Mie不吃饭2 小时前
FastAPI 小白教程:从入门级到实战(源码教程)
运维·服务器
fo安方3 小时前
运维的利器–监控–zabbix–第三步:配置zabbix–中间件–Tomcat–步骤+验证
运维·中间件·zabbix
超喜欢下雨天4 小时前
服务器安装 ros2时遇到底层库依赖冲突的问题
linux·运维·服务器·ros2