要点速览
- 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 的磁盘映像
- 测量真实大小. 运行 du -h ~/Library/Containers/com.docker.docker/Data/vms/0/data/Docker.raw,查看实际占用的空间,而不是最大值。
- 查看空间被谁占用. 在 Docker Desktop 运行时,运行 docker system df,列出镜像、容器、本地卷和构建缓存,以及可回收的部分。
- 清除构建缓存. 运行 docker builder prune。构建时会按需重新生成缓存;下一次构建会慢一些。
- 清理未使用的容器、网络和镜像. 运行 docker system prune -a。它会移除已停止的容器、未使用的网络、所有没有被容器使用的镜像,以及未使用的构建缓存。卷会被保留。
- 单独检查卷. 运行 docker volume ls,备份需要的数据,然后用 docker volume rm 移除不再使用的卷。
- 稍等片刻,再检查一次. 给 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 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 文档提醒,减小最大大小会删除当前磁盘映像,连同其中所有镜像、容器和卷。