
1. Docker磁盘空间管理概述作为容器化技术的核心工具Docker在长期使用过程中会逐渐积累大量磁盘占用。这些占用主要来自四个方面无用的镜像层dangling images、停止的容器stopped containers、未挂载的数据卷dangling volumes以及容器日志文件。特别是在开发测试环境中频繁构建镜像和创建容器会导致磁盘空间快速消耗。我曾经遇到过生产服务器因为Docker占满磁盘而服务崩溃的情况——当时/var分区100%占用导致所有写操作失败包括最基本的命令补全都无法使用。这种问题往往发生在不知不觉中等收到磁盘告警时通常为时已晚。2. 磁盘空间分析工具2.1 查看磁盘使用概况使用docker system df命令可以快速了解Docker的整体磁盘使用情况类似于Linux的df命令$ docker system df TYPE TOTAL ACTIVE SIZE RECLAIMABLE Images 147 36 7.204GB 3.887GB (53%) Containers 37 10 104.8MB 102.6MB (97%) Local Volumes 3 3 1.421GB 0B (0%) Build Cache 0B 0B这个输出显示Images所有镜像占用了7.2GB其中53%的空间(3.8GB)可以回收Containers容器占用了104MB97%的空间可以回收Volumes数据卷占用了1.4GB但都在使用中无法回收2.2 深入分析大文件当发现某个目录异常占用空间时可以使用组合命令定位# 查看Docker根目录大小 $ du -hs /var/lib/docker/ 97G /var/lib/docker/ # 按目录大小排序 $ du -h /var/lib/docker/ | sort -rh | head -n 20 92G /var/lib/docker/containers/a376aa694b22 3.2G /var/lib/docker/overlay2 ...3. 空间清理操作指南3.1 基础清理命令docker system prune是最常用的清理命令# 安全清理默认保留最近24小时的数据 $ docker system prune # 彻底清理包括所有未使用的镜像 $ docker system prune -a --volumes这个命令会删除所有停止的容器所有未被任何容器引用的网络所有dangling镜像无tag的中间层镜像未被使用的数据卷需加--volumes参数警告prune -a会删除所有未被容器使用的镜像包括可能有用的缓存镜像。生产环境慎用。3.2 针对性清理方法3.2.1 镜像清理删除特定模式的镜像# 删除所有none标签的中间镜像 $ docker rmi $(docker images -f danglingtrue -q) # 删除90天前的镜像 $ docker image prune -a --filter until2160h3.2.2 容器清理批量删除已停止的容器# 删除所有已退出的容器 $ docker rm $(docker ps -aq -f statusexited) # 删除创建时间超过30天的容器 $ docker container prune --filter until720h3.2.3 数据卷清理清理孤儿数据卷$ docker volume prune4. 日志文件管理实战4.1 日志空间占用问题容器日志是磁盘占用的重灾区。我曾经遇到一个Nginx容器日志就占用了92GB空间的案例$ ls -lh /var/lib/docker/containers/a376aa694b22*/a376aa694b22*-json.log -rw-r----- 1 root root 92G Mar 1 10:00 a376aa694b22-json.log4.2 临时清理日志快速清空日志文件不影响正在运行的容器$ truncate -s 0 /var/lib/docker/containers/*/*-json.log4.3 长期日志管理方案在docker-compose.yml中配置日志轮转services: nginx: image: nginx:alpine logging: driver: json-file options: max-size: 100m max-file: 3等效的docker run命令$ docker run --log-opt max-size100m --log-opt max-file3 nginx:alpine5. 系统级优化策略5.1 修改Docker存储位置当默认/var分区空间不足时可以修改Docker的根目录# 停止Docker服务 $ systemctl stop docker # 移动数据到新位置 $ mv /var/lib/docker /mnt/data/ # 创建符号链接 $ ln -s /mnt/data/docker /var/lib/docker # 修改启动配置(/etc/docker/daemon.json) { data-root: /mnt/data/docker } # 重启服务 $ systemctl start docker5.2 存储驱动优化对于生产环境建议使用overlay2存储驱动需Linux内核4.x{ storage-driver: overlay2, storage-opts: [ overlay2.override_kernel_checktrue ] }6. 常见问题解决方案6.1 清理后空间未释放如果执行清理命令后磁盘空间没有变化可能是以下原因有进程仍在使用已删除的文件$ lsof | grep deletedDocker引擎存在缓存尝试重启Docker服务$ systemctl restart docker6.2 空间被overlay2占用overlay2目录占用过大时可以尝试# 查看各层大小 $ docker system df -v # 清理构建缓存 $ docker builder prune6.3 内核版本问题在Linux 3.13内核上可能存在空间回收BUG建议升级到4.4内核$ uname -r 3.13.0-86-generic # 需要升级7. 自动化维护方案7.1 定时清理脚本创建/etc/cron.weekly/docker-cleanup#!/bin/bash docker system prune -f docker volume prune -f find /var/lib/docker/containers/ -name *.log -size 1G -exec truncate -s 0 {} \;7.2 监控告警设置在Prometheus中添加Docker磁盘监控- alert: DockerDiskUsage expr: sum(container_fs_usage_bytes{device~/dev/.*}) by (instance) / sum(container_fs_limit_bytes{device~/dev/.*}) by (instance) * 100 85 for: 10m labels: severity: warning annotations: summary: Docker disk usage high on {{ $labels.instance }}对于长期运行的Docker环境建议建立定期维护机制而非等到磁盘告警才处理。每周执行一次基础清理每月进行一次全面检查可以保持系统稳定运行