文章目录

Docker容器磁盘占用不断增长镜像层堆积的清理方法

发布于 2026-06-07 00:48:37 · 浏览 4 次 · 评论 0 条

Docker容器磁盘占用不断增长镜像层堆积的清理方法

Docker 在长期运行后,其占用的磁盘空间可能会悄然增长。问题的核心通常在于镜像层的堆积和容器数据的残留。本指南将手把手教你如何准确诊断问题,并执行一系列针对性清理,彻底释放磁盘空间。


第一步:诊断问题,明确清理目标

盲目清理可能误删有用数据。首先需要了解 Docker 当前的磁盘使用情况,弄清楚空间究竟被什么占用了。

  1. 执行 docker system df 命令,查看 Docker 各类资源(镜像、容器、卷)的总体空间占用摘要。

    docker system df

    输出示例:

    TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
    Images          15        5         3.2GB     2.1GB (65%)
    Containers      8         3         150MB     120MB (80%)
    Local Volumes   10        4         1.5GB     800MB (53%)
    Build Cache     0         0         0B        0B

    重点关注 RECLAIMABLE 列,它表示可回收的空间。数字越大,清理的收益就越高。

  2. 执行 docker system df -v 命令,查看 更详细的资源列表。这会列出每一个镜像、容器和卷的具体信息,帮助你判断哪些是已停止的旧容器、哪些是无主的卷(即“悬空卷”)。

    docker system df -v

第二步:执行清理操作

根据诊断结果,按需选择以下一种或多种清理方式。

方法一:清理停止的容器

容器停止后,其文件系统层默认会保留。这是最常见的空间占用源之一。

  1. 执行 docker container prune 命令,删除 所有已停止的容器。

    docker container prune

    执行命令后,系统会列出所有将被删除的容器并请求确认,输入 y 并回车即可。

方法二:清理无用的镜像

包括“悬空镜像”(在构建新镜像时产生的、无标签的旧中间层)和不再使用的镜像版本。

  1. 执行 docker image prune 命令,删除 所有悬空镜像。

    docker image prune
  2. 执行 docker image prune -a 命令,删除 所有未被任何容器使用(包括运行中和已停止的)的镜像。这是一个更彻底的清理。

    docker image prune -a

    警告:此操作会删除所有你通过 docker pulldocker build 获取但当前未被任何容器使用的镜像。请确保你不再需要它们。

方法三:清理未使用的卷

卷是 Docker 持久化数据的地方。删除容器时,其关联的卷默认不会被自动删除,久而久之就会成为“无主之物”。

  1. 执行 docker volume prune 命令,删除 所有未被任何容器使用的本地卷。

    docker volume prune

    警告:卷中通常保存着数据库数据、应用配置等关键信息。执行前,请务必确认这些卷真的不再需要。你可以先用 docker volume ls 查看卷列表。

方法四:使用终极清理命令一键清理

docker system prune 是一个集大成的清理命令,可以同时清理容器、网络、悬空镜像和构建缓存。

  1. 执行 docker system prune清理 容器、网络、悬空镜像。

    docker system prune
  2. 执行 docker system prune -a --volumes进行最彻底的清理。这会额外删除所有未使用的镜像和所有未使用的卷。

    docker system prune -a --volumes

    警告:这是最强大的清理命令,会移除所有非运行态的容器、未使用的镜像和未使用的卷。仅在你确认要进行“大扫除”时使用。


第三步:针对特殊场景的深度清理

清理构建缓存

在构建镜像时,Docker 会缓存中间层以加速后续构建。这些缓存也可能占用大量空间。

  1. 执行 docker builder prune 命令,清理 所有构建缓存。

    docker builder prune

    如果只想清理超过特定时间的缓存,可以使用 --filter 参数,例如清理 24 小时前的缓存:docker builder prune --filter “until=24h”

精准清理特定镜像或容器

如果不想进行全局清理,只想删除特定的镜像或容器。

  1. 使用 docker image rm [镜像ID或名称] 命令,删除 指定镜像。

    docker image rm my-old-app:1.0

    或者使用镜像 ID 的前几位:

    docker image rm fce289e99eb9
  2. 使用 docker container rm [容器ID或名称] 命令,删除 指定容器。

    docker container rm my-stopped-app

第四步:建立定期维护策略(可选)

为了防止磁盘空间问题再次悄然发生,可以考虑将清理命令设置为定期任务。

  1. 编写 一个简单的清理脚本,例如 docker-cleanup.sh

    #!/bin/bash
    echo "开始 Docker 定期维护..."
    # 清理停止的容器
    docker container prune -f
    # 清理悬空镜像
    docker image prune -f
    # 清理无主卷
    docker volume prune -f
    echo "Docker 定期维护完成。"

    注意:脚本中使用了 -f 参数来跳过确认提示,使其适合自动化运行。

  2. 利用 crontab 在 Linux 系统上设置 定时任务。例如,设置为每周日凌晨 3 点执行一次。

    • 打开 crontab 编辑器:crontab -e
    • 添加 以下行:0 3 * * 0 /path/to/docker-cleanup.sh
    • 保存 并退出。

通过以上从诊断到执行,再到策略建立的完整流程,你可以有效控制 Docker 的磁盘占用,解决镜像层堆积问题,保持系统整洁高效。

评论 (0)

暂无评论,快来抢沙发吧!

扫一扫,手机查看

扫描上方二维码,在手机上查看本文