分析 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 磁盘占用。

相关推荐
就叫飞六吧2 小时前
Kubernetes弹性伸缩:让应用自动应对流量洪峰与低谷
云原生·容器·kubernetes
独行soc2 小时前
2025年渗透测试面试题总结-某战队红队实习面经(附回答)(题目+回答)
linux·运维·服务器·学习·面试·职场和发展·渗透测试
星川皆无恙3 小时前
大数据产品销售数据分析:基于Python机器学习产品销售数据爬虫可视化分析预测系统设计与实现
大数据·运维·爬虫·python·机器学习·数据分析·系统架构
sky北城4 小时前
Jenkins忘记admin密码后的恢复步骤
运维·jenkins
瑟王5 小时前
Kubernetes笔记(1)Kubernetes入门
容器·kubernetes
FBI HackerHarry浩5 小时前
Linux云计算训练营笔记day02(Linux、计算机网络、进制)
linux·运维·网络·笔记·计算机网络·进制
乐言3616 小时前
接口自动化工具如何选择?以及实战介绍
运维·自动化
原来是猿7 小时前
Linux下的好玩的命令
linux·运维·服务器
IT小饕餮7 小时前
华为私有协议Hybrid
运维·服务器·华为
Lw老王要学习7 小时前
25_05_02Linux架构篇、第1章_03安装部署nginx
linux·运维·nginx·架构·云计算·it