开发者

Docker Desktop 的磁盘映像太大了:如何在 Mac 上缩小 Docker.raw

为什么 Docker.raw 看起来那么大、如何测量它的真实大小、哪些 prune 命令能释放空间并保留卷,以及何时该限制或移动它。

阅读约需 6 分钟MoreRoom 团队,Yando Pte. Ltd.以 Markdown 格式查看本页

要点速览

  • Docker Desktop 把所有镜像、容器、卷和构建缓存都放在同一个磁盘映像 Docker.raw 中,位于 ~/Library/Containers/com.docker.docker 内。
  • Docker.raw 是稀疏文件:访达和 ls -l 显示的是它的最大大小,而 du 显示的是它实际占用的空间。
  • 请在 Docker 内部用 docker system prune 缩小它,而不是删除这个文件。释放的空间几分钟内就会还给 macOS。
  • docker system prune 默认保留卷,除非加上 --volumes;即使加上,也只会移除匿名卷。
  • 调低磁盘使用上限或使用 Clean up data 都会抹掉整个磁盘映像,请把它们当作最后手段。

如何在 Mac 上缩小 Docker Desktop 的磁盘映像

  1. 测量真实大小. 运行 du -h ~/Library/Containers/com.docker.docker/Data/vms/0/data/Docker.raw,查看实际占用的空间,而不是最大值。
  2. 查看空间被谁占用. 在 Docker Desktop 运行时,运行 docker system df,列出镜像、容器、本地卷和构建缓存,以及可回收的部分。
  3. 清除构建缓存. 运行 docker builder prune。构建时会按需重新生成缓存;下一次构建会慢一些。
  4. 清理未使用的容器、网络和镜像. 运行 docker system prune -a。它会移除已停止的容器、未使用的网络、所有没有被容器使用的镜像,以及未使用的构建缓存。卷会被保留。
  5. 单独检查卷. 运行 docker volume ls,备份需要的数据,然后用 docker volume rm 移除不再使用的卷。
  6. 稍等片刻,再检查一次. 给 Docker Desktop 几分钟时间,把释放的数据块还给 macOS,然后再次对 Docker.raw 运行 du -h。

Mac 版 Docker Desktop 在一个小型虚拟机中运行 Linux 容器,而这台虚拟机把所有内容都存放在一个名为 Docker.raw 的磁盘映像文件中:镜像、容器、卷和构建缓存。这个文件可能增长到几十 GB。解决办法不是删除它,而是在 Docker 内部执行清理(prune);随后 Docker Desktop 会把释放的空间还给 macOS。

截至 2026 年 10 月,本文内容适用于在 macOS 27 Golden Gate、26 Tahoe、15 Sequoia 和 14 Sonoma 上运行的当前 Docker Desktop 版本。

Docker.raw 在哪里,实际有多大

默认情况下,这个磁盘映像位于:

~/Library/Containers/com.docker.docker/Data/vms/0/data/Docker.raw

如果你移动过它,可以在 Docker Desktop › Settings › Resources › Advanced 中查看当前位置。

Docker.raw 是一个稀疏文件。它的逻辑大小是磁盘映像所能达到的最大值,但只有 Docker 实际写入过的数据块才会占用 Mac 上的空间。访达和 ls -l 显示的是最大值,所以这个文件看起来可能大得吓人。要查看真实数字:

cd ~/Library/Containers/com.docker.docker/Data/vms/0/data
ls -klsh Docker.raw
du -h Docker.raw

在 ls -s 的输出中,第一个数字是实际分配的空间;大小那一列显示的是最大值。du 只报告已分配的空间。Docker 官方的 Mac 常见问题也是用同样的 ls -klsh 来检查的。

稀疏的 Docker.raw 文件:由磁盘使用上限决定的逻辑大小,与 Mac 上实际分配的数据块对比

查看空间被谁占用

在 Docker Desktop 运行时,让 Docker 给出明细:

docker system df
docker system df -v

第一条命令会列出 Images、Containers、Local Volumes 和 Build Cache,附带总大小,以及表示未在使用部分的 RECLAIMABLE 列。-v 版本会逐一列出每个镜像、容器和卷,便于你发现某个被遗忘的 10 GB 镜像,或旧项目留下的大卷。

由浅入深地清理

以下所有命令都是永久删除:Docker 对象没有废纸篓。镜像可以重新拉取或构建,卷则不行。

构建缓存

如果你在本地构建镜像,构建缓存往往是最大的一项。

docker builder prune

它会请求确认,然后移除未使用的构建缓存。加上 --all 可以清理得更彻底。在缓存重新填满之前,后续构建会花更长时间。

已停止的容器、未使用的网络和镜像

docker system prune
docker system prune -a

不带参数的 docker system prune 会移除已停止的容器、没有被任何容器使用的网络、悬空(未加标签的)镜像,以及未使用的构建缓存。加上 -a 后,还会移除所有没有被至少一个容器使用的镜像,通常释放的空间最多。之后需要的内容会被重新拉取或构建。请参阅 Docker 的清理指南和 docker system prune 参考文档。

卷:先检查,再移除

卷中保存的是无法重建的数据,例如本地数据库。这正是 Docker 默认从不移除卷的原因。

docker volume ls
docker volume rm <name>

docker system prune --volumes 只会额外移除没有被任何容器使用的匿名卷。docker volume prune 的行为相同;docker volume prune --all 还会移除没有容器在用的具名卷。请先备份所有重要数据。

命令 容器 镜像 构建缓存 卷
docker system prune 已停止的 仅悬空镜像 未使用的 保留
docker system prune -a 已停止的 所有未使用的 未使用的 保留
docker system prune -a --volumes 已停止的 所有未使用的 未使用的 未使用的匿名卷
docker volume prune --all — — — 所有未使用的

空间没有回来时

清理释放的是虚拟机内部的数据块,Docker Desktop 会在后台把它们交还给 macOS。Docker 提到这可能需要几分钟。请再次用 du -h Docker.raw 检查。如果过了一段时间数字仍没有变化,请退出并重新打开 Docker Desktop。

无论文件内部发生什么,访达都会一直显示它的最大大小,所以请用 du 而不是访达来判断进展。

限制或移动磁盘映像

在 Settings › Resources › Advanced 中,较新的版本把这个设置叫作 Disk usage limit(旧版本叫 Disk image size)。它决定磁盘映像最多能增长到多大。Docker 的 Mac 常见问题提醒,减小最大值会删除当前的磁盘映像,其中的所有镜像、容器和卷都会随之消失。请先清理、导出需要的内容,然后再调低它。

同一面板中还有 Disk image location。使用其中的 Browse 按钮,可以把 Docker.raw 移到更大的内置宗卷或外置 SSD 上。不要在访达中移动这个文件:Docker Desktop 可能会找不到它。

重置选项

Docker Desktop 的 Troubleshoot 界面(从菜单栏中的鲸鱼菜单打开,或点按 Dashboard 右上角附近的问号图标)中有 Clean up data,旧版本中叫 Clean / Purge data。根据 Docker 的故障排除页面,它会销毁所有本地容器和镜像,同时保留你的设置。由于卷也存放在同一个磁盘映像中,请假定它们也会一并消失。只有在你愿意从头开始时才使用它。

同一菜单中的 Reset to factory defaults 还会重置所有设置。

以不同方式管理磁盘空间的替代方案

  • OrbStack 把容器、镜像和 Linux 虚拟机存放在 ~/Library/Group Containers/HUAQ24HBR6.dev.orbstack/data 中。其文档介绍了动态磁盘管理,用量会按需增减。请在 OrbStack 中或用同样的 docker 命令清理;删除数据文件会丢失其中的一切。
  • Colima 是一款免费的命令行运行时,把虚拟机存放在 ~/.colima 中。docker 的 prune 命令用法相同,colima prune 会清除 Colima 缓存的下载文件,colima delete 则会移除一个配置文件及其全部数据。

两者都使用标准的 docker 命令行工具,因此上文关于清理、卷和构建缓存的内容同样适用。

MoreRoom 能帮你做什么

MoreRoom 免费版会找到 Docker Desktop 的磁盘映像,标注为“请先检查”,并提醒你应当执行清理,而不是删除这个文件。当你选择清理时,MoreRoom 会运行 Docker 自己的 docker system prune --all --force:已停止的容器、未使用的网络、未使用的镜像和构建缓存会被移除,卷会被保留。这条命令是永久性的,并会明确标注。MoreRoom 也能识别 OrbStack 和 Colima 的数据,同样标注为“请先检查”。

MoreRoom 不会删除 Docker.raw,不会移除卷,也不会更改 Docker 的磁盘使用上限。Pro 还提供“收集器”(一次清理多个项目)和目标模式。

常见问题

可以删除 Docker.raw 吗?

可以,但其中的所有镜像、容器和卷都会丢失,Docker Desktop 会新建一个空文件。请改为在 Docker 内部执行清理。如果你确实想从头开始,请使用 Docker Desktop 的 Troubleshoot 菜单中的 Clean up data,它会保留你的设置。

为什么访达显示的 Docker.raw 比 Docker 报告的大得多?

Docker.raw 是稀疏文件。访达和 ls -l 显示的是由磁盘使用上限决定的最大大小,而 du 和 ls -s 显示的是实际写入磁盘的数据块。

docker system prune 会删除我的卷吗?

默认不会。加上 --volumes 后,它还会移除没有被任何容器使用的匿名卷。具名卷(例如你创建的数据库卷)只有用 docker volume prune --all 或 docker volume rm 才会被移除。

为什么清理后可用空间没有增加?

Docker Desktop 会在后台把释放的空间还给 macOS,可能需要几分钟。请再次对 Docker.raw 运行 du -h 查看。如果数字没有变化,请重新启动 Docker Desktop。另外,只有镜像真正被删除时空间才会释放,仅仅取消标签是不够的。

调低磁盘使用上限安全吗?

只有在你可以接受丢失其中内容时才安全。Docker 的 Mac 文档提醒,减小最大大小会删除当前磁盘映像,连同其中所有镜像、容器和卷。

本指南提到的文件夹