# Docker 占用太多磁盘空间：清理构建缓存，保留镜像和数据卷

> 用 MangoDisk 查看 Docker 构建缓存的预计占用，在保留镜像、容器和数据卷的前提下清理未使用缓存，并了解重新构建与磁盘空间回收的区别。

**如果占用主要来自构建缓存，可以先清理未使用的缓存，保留镜像、容器、网络和数据卷。** Docker 提供的 `builder prune` 就是针对构建缓存的清理命令。不过，清掉缓存后，下一次构建可能需要重新下载依赖或生成数据；“现在未使用”不代表“以后用不上”。[Docker 构建缓存清理说明](https://docs.docker.com/reference/cli/docker/builder/prune/)

想先看清这部分占用，再决定是否值得清理，可以用 [MangoDisk](/zh) 的深度清理。它会读取本机默认 Docker context 的缓存信息，在界面中显示预计占用；由你选择是否执行，清理交给 Docker 的官方命令完成。

## 用 MangoDisk 查看 Docker 构建缓存

Docker 的命令行能够查看和清理缓存。MangoDisk 把这两步放进图形界面，让你先查看候选占用和清理影响，再选择是否处理，不必记住不同 prune 命令的参数和范围。

![MangoDisk Windows 简体中文版深度清理界面，可查看各类清理条目及预计占用](https://assets.mangodisk.app/images/screenshots/windows/zh/light-01-deep-cleanup.jpg)

*上图为深度清理界面示例，不是本次 Docker 检查的截图；具体条目取决于本机扫描结果。*

打开[深度清理](/zh/docs/features/deep-clean)，完成**标准扫描**，在**容器缓存**中查看 **Docker 构建缓存**。这个条目默认不选中，扫描不会自动删除缓存。

准备清理时：

1. 等正在进行的构建任务结束，保持 Docker 服务运行；使用 Docker Desktop 时，不要先退出它。
2. 查看 Docker 构建缓存的预计占用，确认可以接受后续重新构建或下载的成本。
3. 选择**暂不选择**，只勾选 **Docker 构建缓存**，核对清理计划后再确认执行。

**这个条目不会删除镜像、容器、网络或数据卷，但不能按单个项目选择缓存。** 当前实现调用 `docker --context default builder prune --all --force`，清理默认 context 下 Docker 判定为未使用的构建缓存。不要把它理解为“只清某个旧项目”。[MangoDisk v1.1.7 的 Docker 清理实现](https://github.com/harry0703/MangoDisk/blob/v1.1.7/src-tauri/crates/mangodisk-core/src/cleanup/cleaners/docker_build_cache.rs)

这里的 context 是 Docker 客户端连接服务的配置。MangoDisk 固定使用 `default`，不会跟随你当前选中的其他 context；如果这个目标无法连接，条目就无法正常预览。其他本机 context、自定义 Buildx builder 和远程服务，需要另行核对，不属于这个条目的覆盖范围。[Docker context 说明](https://docs.docker.com/engine/manage-resources/contexts/)

Docker 服务需要运行，才能提供缓存信息并执行清理。如果没有扫描结果，先确认 Docker 已安装、服务可连接；不能据此认定 Docker 没有占用空间。

## 预计占用不等于实际释放空间

MangoDisk 的预览估算，只统计 Docker 标记为**未使用、未共享且大小非零**的构建缓存记录。共享数据不计入这项估算，也不能把所有镜像和缓存的显示大小直接相加。

2026 年 10 月 9 日，在 macOS 15.7.7 上使用 Docker 29.1.3 进行只读检查，返回了 134 条构建缓存记录。其中 56 条符合上述统计条件，按 Docker 显示的大小合计约 **11.6 GB**。这是清理前的近似估算，没有执行删除，也不是已释放空间的结果。

预览数字用于判断是否值得处理，不是一份可以逐条勾选的缓存清单。执行时，Docker 按 `builder prune --all` 的规则决定哪些未使用的缓存可以移除；宿主机最终增加多少可用空间，还需要清理后另行检查。

## 先分清缓存和需要保留的数据

构建缓存保存了可以复用的构建步骤结果，帮助后续构建少做重复工作。项目、依赖或构建方式变化后，缓存也会变化；缓存占用较大，并不意味着 Docker 出了故障。[Docker 构建缓存说明](https://docs.docker.com/build/cache/)

<table>
<thead>
  <tr>
    <th>
      内容
    </th>
    
    <th>
      用途
    </th>
    
    <th>
      本文的处理方式
    </th>
  </tr>
</thead>

<tbody>
  <tr>
    <td>
      构建缓存
    </td>
    
    <td>
      复用构建步骤及相关数据
    </td>
    
    <td>
      确认可接受重建成本后，按需清理未使用部分
    </td>
  </tr>
  
  <tr>
    <td>
      镜像
    </td>
    
    <td>
      创建容器所需的运行环境
    </td>
    
    <td>
      保留，不随构建缓存一起清理
    </td>
  </tr>
  
  <tr>
    <td>
      容器
    </td>
    
    <td>
      运行或已停止的应用实例，可能含仍需保留的内容
    </td>
    
    <td>
      保留；停止不等于可以删除
    </td>
  </tr>
  
  <tr>
    <td>
      数据卷
    </td>
    
    <td>
      持久保存数据库、上传文件等数据
    </td>
    
    <td>
      保留，不按缓存处理
    </td>
  </tr>
</tbody>
</table>

数据卷的生命周期独立于容器。即使当前没有容器使用它，里面也可能存着需要保留的数据，不能仅凭“未使用”就删掉。[Docker 数据卷说明](https://docs.docker.com/engine/storage/volumes/)

同样，构建缓存是否值得保留，也要看接下来的工作。如果马上还要反复构建同一套项目，或要在离线环境中工作，保留缓存通常更合适。磁盘确实紧张、能够重新获取依赖时，再考虑清理。

## 用官方命令查看和清理

习惯命令行的用户，可以直接完成同样的检查。下面的命令显式使用 `default`，和上述 MangoDisk 条目保持一致。先查看连接配置，确认目标是本机 Docker 服务：

```sh
docker context ls
docker context inspect default
```

确认连接目标后，查看空间占用，再按需展开详细信息。这些命令只查看，不删除：

```sh
docker --context default system df
docker --context default system df --verbose
```

比较镜像、容器、数据卷和构建缓存的占用。如果最大的部分是数据卷，清理构建缓存就无法解决主要问题；应先确认卷中保存的是什么。[Docker 空间占用命令说明](https://docs.docker.com/reference/cli/docker/system/df/)

**确认可以移除这个目标下所有未使用的构建缓存，并接受后续重建成本后**，再执行：

```sh
docker --context default builder prune --all
```

`--all` 表示处理所有未使用的构建缓存，而不只是悬空缓存（dangling cache）。上面的手动命令没有加 `--force`，会保留 Docker 自身的确认提示。清理不经过回收站或废纸篓，缓存不能从其中恢复；后续构建需要重新生成相关数据。[Docker builder prune 参数说明](https://docs.docker.com/reference/cli/docker/builder/prune/)

MangoDisk 使用 `--force` 是为了在应用确认清理后执行命令，不会再弹出终端提示。它当前不提供按缓存年龄筛选或设置保留容量的选项；有这些需求时，可以参考官方命令参数单独处理。

只想清构建缓存时，不需要改用 `system prune`。它还会处理停止的容器、未使用的网络和镜像；加上 `--volumes` 后，还会涉及未使用的匿名卷。两者的范围不同，不能当作同一个命令替换。[Docker system prune 范围说明](https://docs.docker.com/reference/cli/docker/system/prune/)

## 清理后检查缓存和磁盘占用

清理完成后，在同一个 context 下再次查看：

```sh
docker --context default system df
```

先比较构建缓存的占用，再查看系统的可用磁盘空间。以后再次构建时，Docker 可能重新执行部分步骤、下载依赖并生成缓存，这是正常行为。不要为了让缓存一直保持很小而每次构建完都清空。

如果使用 Mac 版 Docker Desktop，还要区分**磁盘镜像的容量上限**和**实际占用**。Docker Desktop 把 Linux 容器和镜像保存在磁盘镜像中，有些工具显示的是它的最大容量；可以在 **Settings → Resources → Advanced** 中查看实际占用和容量上限。[Docker Desktop Mac 存储说明](https://docs.docker.com/desktop/troubleshoot-and-support/faqs/macfaqs/)

不要把 `Docker.raw` 当作普通缓存文件删除，也不要为了让数字变小直接降低磁盘镜像容量上限。Docker 官方说明，降低上限会删除现有磁盘镜像，导致容器和镜像丢失。这与本文只清构建缓存的目标不同。

如果构建缓存已经不大，磁盘仍然很满，可以用 MangoDisk 的[磁盘空间分析](/zh/docs/features/disk-analysis)定位其他大目录。空间可能来自原始素材、旧项目依赖或其他工具的构建产物，需要按各自用途处理，不必反复清理同一项 Docker 缓存。

其他开发工具可以参考 [npm 缓存与 node_modules 的区别](/zh/blog/clean-npm-cache)、[Cargo cache 与 target 文件夹的区别](/zh/blog/cargo-cache-vs-target-folder)，也可以从[开发者磁盘清理指南](/zh/blog/topics/developer-cleanup)继续排查。

本文产品范围按 MangoDisk v1.1.7 说明。执行前可阅读[安全清理指南](/zh/docs/safety)，确认清理计划与需要保留的数据。

[下载 MangoDisk](/zh)，先查看 Docker 构建缓存的预计占用，再决定是否值得清理。镜像、容器和数据卷继续保留，后续构建的成本由你权衡。
