Debian系统优化Docker存储空间的实用方案
一 存储占用盘点与快速清理
- 查看整体占用与可回收空间:
- 清理无用资源(按风险从低到高):
- 删除虚悬镜像:docker image prune
- 删除未被容器引用的镜像:docker image prune -a
- 按时间清理(如保留最近7天):docker image prune -a --filter “until=168h”
- 一键清理容器、网络、悬挂镜像与构建缓存:docker system prune -af
- 谨慎使用:docker system prune -a --volumes(会删除未使用的数据卷,先确认无业务数据)
- 建议先执行 docker system df 评估占用,再选择对应清理级别,避免误删。
二 控制构建缓存与镜像体积
- 启用并配置 BuildKit 垃圾回收(推荐):
- 编辑 /etc/docker/daemon.json,加入:
- “builder”: { “gc”: { “enabled”: true, “defaultKeepStorage”: “20GB” } }
- 重启 Docker:systemctl restart docker
- 作用:自动清理构建缓存,避免长期堆积占用 /var/lib/docker
- Dockerfile 层与体积优化要点:
- 使用更小的基础镜像(如 alpine、debian:slim)
- 采用多阶段构建,只将运行时产物拷贝到最终镜像
- 合并同类 RUN 指令,并在同一层内清理临时文件,避免“删了仍占层”的问题
- 示例(同一层内下载、解压并删除压缩包,减少中间层体积与缓存):
- RUN curl -o /tmp/app.tar.gz https://example.com/app.tar.gz &&
tar -xzf /tmp/app.tar.gz -C /opt &&
rm -f /tmp/app.tar.gz
三 调整Docker根目录与扩容
- 方案一 修改 data-root(推荐,可控性强)
- 停止 Docker:systemctl stop docker
- 迁移数据:rsync -aP /var/lib/docker/ /mnt/docker_data/
- 配置 /etc/docker/daemon.json:{ “data-root”: “/mnt/docker_data” }
- 启动 Docker:systemctl start docker
- 验证:docker info | grep “Docker Root Dir”
- 方案二 符号链接(快速但不如方案一规范)
- 停止 Docker → 迁移目录 → 建立软链:ln -sf /mnt/docker_data /var/lib/docker → 启动 Docker
- 方案三 扩容底层磁盘/分区(适用于根分区不足)
- 通过 fdisk/parted/lvm 扩容后,扩容文件系统(如 resize2fs/xfs_growfs),再按方案一迁移或直接使用新增空间
- 操作前务必备份关键数据与镜像(如 docker save 重要镜像)。
四 存储驱动与数据持久化策略
- 存储驱动选择(Debian 现代内核优先):
- 推荐 overlay2:性能好、开销低、镜像层共享高效,适合大多数场景
- 备选 btrfs/zfs:具备快照、压缩、校验等高级能力,适合有快照/压缩需求的环境
- 老旧环境可能见到 devicemapper/aufs,但在新环境一般不再优先
- 数据持久化与性能:
- 将数据库、日志、上传文件等写入 Docker Volume 或绑定挂载,避免写入容器可写层
- 对高 IOPS 场景优先使用本地 SSD 与合适的卷驱动,减少联合文件系统的额外开销
五 自动化维护与监控
- 定时清理脚本示例(保留最近3天镜像与构建缓存):
- 编辑 /usr/local/bin/docker-cleanup.sh
- #!/usr/bin/env bash
set -e
docker system df >/var/log/docker-df-pre.log
docker image prune -af --filter “until=72h”
docker system prune -af --filter “until=72h”
docker system df >/var/log/docker-df-post.log
- 赋权并加入 cron:0 3 * * * /usr/local/bin/docker-cleanup.sh
- 日常巡检命令:
- 空间:df -h
- Docker 占用:docker system df -v
- 容器资源:docker stats
- 重要镜像建议打标签并纳入仓库管理,清理前核对 docker ps -a 与 docker images,避免影响线上。