温馨提示×

Debian系统如何优化Docker存储空间

小樊
45
2025-12-07 01:09:57
栏目: 云计算

Debian系统优化Docker存储空间的实用方案

一 存储占用盘点与快速清理

  • 查看整体占用与可回收空间:
    • 命令:docker system df -v
  • 清理无用资源(按风险从低到高):
    • 删除虚悬镜像: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 层与体积优化要点:
    • 使用更小的基础镜像(如 alpinedebian: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
    • 赋权并加入 cron0 3 * * * /usr/local/bin/docker-cleanup.sh
  • 日常巡检命令:
    • 空间:df -h
    • Docker 占用:docker system df -v
    • 容器资源:docker stats
  • 重要镜像建议打标签并纳入仓库管理,清理前核对 docker ps -adocker images,避免影响线上。

0