开发者存储空间指南

Docker 正在占用我 Mac 的空间

Docker Desktop 把一切都放在一个文件里。你每构建一次它就变大,而删除镜像并不会让它变小。这里说明原因,以及什么才真正能拿回空间。

14 天免费试用,无需银行卡。 之后一次性 15 美元,可用于 3 台电脑,macOS 与 Linux。

Bytesweep 的矩形树图显示 Docker 磁盘映像占据了 Mac 个人文件夹的大部分

空间在哪里

macOS 上的 Docker Desktop 运行着一个 Linux 虚拟机,而那台虚拟机的整个文件系统就是你 Mac 上的一个稀疏文件:

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

查看它真实的磁盘占用 —— 而不是逻辑大小,后者始终等于你允许 Docker 使用的上限:

du -h -d0 ~/Library/Containers/com.docker.docker/Data/vms/0/data/

为什么删除镜像不会让它变小

移除镜像释放的是虚拟机文件系统 内部 的块,但你 Mac 上的那个文件仍保持原来的大小 —— 它早已向 macOS 要走了那么多空间。较新的 Docker Desktop 版本会从虚拟机内部发出 TRIM,让 macOS 回收被释放的块,但这按 Docker 自己的节奏进行,而不是你执行 prune 的那一刻。在此之前, docker system df 报告释放了好几 GB,而访达显示毫无变化。

把空间拿回来

按顺序:破坏性最小的在前。

1. 先看看 Docker 认为自己占了多少

永远从这里开始。它会分别列出镜像、容器、卷和构建缓存,并告诉你每一项有多少可以回收。

docker system df -v

2. 清除构建缓存

在经常构建镜像的机器上,这通常是最大的单项,也是最安全可以移除的 —— 代价只是下一次构建更慢。

docker builder prune -a

3. 清理确实没在用的东西

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

docker system prune

加上 -a 还会移除所有未被运行中容器使用的镜像 —— 这意味着以后要重新拉取。只有在你确定时才加 --volumes数据库的数据就存在卷里,而这也是本页唯一一条会销毁你无法重新下载的东西的命令。

4. 动手之前先列出卷

确认到底会删掉什么:

docker volume ls
docker volume ls -f dangling=true

Docker 很少是唯一的原因

你可以把这页上的每条命令都跑一遍,而在同一台 Mac 上,Xcode DerivedData 和几个被遗忘的模型权重通常一样大。Bytesweep 在一次十秒的扫描中,把 Docker 的真实磁盘占用和其他所有项并排量出来,让你一次把磁盘理清,而不是逐个工具地追着跑。

5. 让 macOS 回收这个文件

清理之后,Docker Desktop 有一个官方方式来归还已释放的块: 设置 → 资源 → 高级 → 磁盘用量或者退出并重新打开 Docker Desktop,启动时会触发 TRIM。给它一分钟,再重新检查文件大小,然后再判断是否没生效。

6. 调低磁盘上限

设置 → 资源中,虚拟磁盘上限决定了 Docker.raw 允许长到多大。调低它本身不会释放任何空间,但能给问题设个上限。当初「以防万一」把它调高,正是这个文件涨到 64 GB 的原因。

7. 最后手段

设置 → 故障排查 → Clean / Purge data 会彻底重置虚拟机的磁盘,把文件恢复到接近零。它会删掉你所有的镜像、容器和卷。请在其他办法都无效、并且你清楚卷里有什么的时候再用。

不要在访达里删除 Docker.raw。 它不是缓存文件,而是整个 Docker 安装的数据;在 Docker 运行时删除它,可能让虚拟机进入一种反正也需要重置的状态。

也值得检查

Docker 很少是孤单的

在那台 Docker 涨到 50 GB 的 Mac 上,Xcode 的 DerivedData 和本地 AI 模型通常紧随其后。如果你要回收空间,值得一次性把整块磁盘量一遍,而不是一次修一样。 完整清单 →

在 Linux 上没有映像文件

Linux 上的 Docker 直接写入 /var/lib/docker,因此 prune 会立即释放空间,上面的 TRIM 问题也完全不存在。 Linux 磁盘清理 →

把 Docker 和其他一切放在一起看

Bytesweep 会量出 Docker 真实的磁盘占用,把它和 Xcode、模拟器、node_modules 以及模型权重并排显示,并标出哪些可以安全清理 —— 完全不碰你的卷。

问题

删除 Docker.raw 安全吗?

在访达里不安全,Docker 运行时也不安全。那一个文件就是你所有的镜像、容器和卷。如果你真的想从头开始,请用 Docker Desktop 的「故障排查 → Clean / Purge data」,它做的是同一件事,但方式是 Docker 认可的。

为什么 docker system prune 说释放了 20 GB,却什么都没变?

因为它释放的是虚拟机文件系统内部的 20 GB,而不是你 Mac 上的。在 TRIM 运行、macOS 回收这些块之前,文件都保持原来的大小。退出并重新打开 Docker Desktop 通常会触发它。

docker system prune 会删掉我的数据库吗?

只有在你加上 --volumes时才会。不加这个参数,它不会碰卷。加上之后,任何未挂载到容器的卷都会被删除,而一个已停止的数据库的卷就算未挂载。

Docker.raw 应该多大?

没有标准答案,但在有几个活跃项目的机器上,15 到 25 GB 属正常,60 GB 则意味着构建缓存从未清理过。先用 docker system df -v 查一下,再断定是镜像的问题。