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

相关推荐
神奇的程序员7 分钟前
从已损坏的备份中拯救数据
运维·后端·前端工程化
虾..1 小时前
Linux 软硬链接和动静态库
linux·运维·服务器
Evan芙1 小时前
Linux常见的日志服务管理的常见日志服务
linux·运维·服务器
玄斎2 小时前
MySQL 单表操作通关指南:建库 / 建表 / 插入 / 增删改查
运维·服务器·数据库·学习·程序人生·mysql·oracle
trayvontang3 小时前
Nginx之location配置
运维·nginx
十六年开源服务商3 小时前
WordPress定制开发最佳公司的用户画像
运维
学Linux的语莫3 小时前
docker,docker-compose二进制包安装
docker
世岩清上4 小时前
AI驱动的智能运维:从自动化到自主化的技术演进与架构革新
运维·人工智能·自动化
张童瑶4 小时前
Linux SSH隧道代理转发及多层转发
linux·运维·ssh
石小千5 小时前
Linux安装OpenProject
linux·运维