Docker 在 Mac 上占用太大?这样安全回收空间
AskClean 团队 · 更新于 2026-07-31
先运行 docker system df -v,确认真正占空间的是镜像、停止容器、构建缓存还是卷;再只清理诊断出来的类别。没有完成备份前,不要删除可能保存数据的卷;Docker.raw 也不能在访达中手动删除或移动。

为什么 Docker 在 macOS 上看起来特别大
Docker Desktop 会在一个轻量 Linux 虚拟机中运行容器。镜像、容器可写层、构建缓存和卷,并不是以普通文件夹形式散落在访达里,而是存进一个大型磁盘映像。根据 Docker Desktop 版本和配置,这个文件通常叫 Docker.raw。
磁盘映像的最大容量、访达显示的逻辑大小,以及 Docker 当前真正使用的空间,未必是同一个数字。稀疏文件可以拥有很大的逻辑范围,但只占用部分宿主机块。因此,应该先看 Docker 自己的统计和 macOS 剩余空间,不能把访达里最大的数字直接当成可回收量。
手动删除 Docker.raw 会绕过 Docker 的对象管理,可能一次摧毁所有本地镜像、容器和卷;直接在访达中移动也可能让 Docker Desktop 无法启动。Docker 官方 Mac 文档明确要求通过 Settings 修改磁盘映像位置。
先做一次只读的 Docker 存储审计
启动 Docker Desktop,打开终端,运行 docker system df。它会汇总镜像、容器、本地卷、构建缓存以及 Docker 认为可回收的空间;加上 -v,即 docker system df -v,可以看到明细。
「可回收」也要结合上下文理解。一份镜像可能被多个容器共享,删掉一个标签不一定能释放它显示的全部体积;某个卷目前没有连接运行中的容器,也不代表里面的数据库以后不会再用。
同时打开 Docker Desktop Settings > Resources,检查当前版本提供的磁盘使用上限与磁盘映像位置。改动前先记录原值。如果 Docker 已经无法启动,在重置或重装前,应按照 Docker 的恢复流程备份数据文件。
- 运行 docker system df -v,并保存带日期的输出。
- 运行 docker ps -a,确认哪些停止容器已经真正废弃。
- 运行 docker image ls,把重要镜像标签对应到仍在维护的项目或 CI 流程。
- 运行 docker volume ls,确认每个可能含数据的卷属于谁、是否已有可恢复备份。
- 最后检查构建缓存,使用 docker builder du 或当前 Builder 支持的相应命令。
卷没有连接运行中容器,并不等于可以删除。Compose 项目、停止的数据库和临时恢复流程都可能留下仍然重要的卷。
选择性删除停止容器与不用的镜像
确定某些停止容器已经不再需要后,可以使用 docker container rm 加容器名称或 ID。删除停止容器会丢掉它的可写层变化,但默认不会删除单独命名的卷,除非你明确要求处理卷。
删除明确不用的镜像,可以运行 docker image rm 加标签或 ID。如果 Docker 提示仍有容器引用,不要直接强制删除,先检查那个容器。对于频繁重建、网络较慢的项目,保留少量昂贵的基础镜像完全合理。
分类命令比一上来 system prune 影响面更小。docker container prune 会在确认后删除全部停止容器;docker image prune 默认只删 dangling 镜像,加 -a 后会扩大到所有未被容器引用的镜像。每次都应该读完确认摘要。
只清构建缓存,不碰数据卷
BuildKit 会保留构建层,让下一次构建复用没有变化的步骤。在活跃开发机上,构建缓存可能成为最大的可回收类别,而且通常可以从 Dockerfile 与构建上下文重新生成。
默认 Builder 可以使用 docker builder prune 清理不用的构建缓存;由 buildx 管理的 Builder 使用 docker buildx prune,并按当前 Docker 版本检查可用选项。这些命令默认会询问确认,不加 force 参数反而是一道有用的安全闸门。
清完后,下一次镜像构建会更慢,也可能重新下载依赖。如果每周都发生,不应该只安排定时清缓存,还要改进 Dockerfile 和缓存策略:先安装不常变化的依赖,再复制频繁修改的源代码;收紧 .dockerignore;给长期 CI Builder 设置明确缓存预算。
运行 docker system prune 前要知道什么
docker system prune 是一个组合清理命令。Docker 文档说明,默认会删除停止容器、不用的网络、dangling 镜像和不用的构建缓存。完成前面的审核后,这个范围可能正合适。
默认命令不会删除卷。加入 --volumes 后,范围会扩展到匿名卷,而里面可能是真实业务或开发数据库。不能把这个参数随手加上,更不能从论坛复制一行命令后不看当前 Docker 版本的删除清单。
-a 会把镜像清理从 dangling 镜像扩大到所有未被容器引用的镜像。即使没有数据丢失,也可能带来很大的重新下载和构建成本。能够识别大镜像时,优先点名删除。
- 完成只读审计,并备份所有重要卷。
- 如果问题集中在构建缓存或停止容器,先单独清理该类别。
- 只有接受确认框中全部项目时,才运行不带 -a、--volumes 的 docker system prune。
- 重新运行 docker system df -v,并启动重要项目做验证。
- 等待 Docker Desktop 回收宿主机块后,再检查 macOS 剩余空间。
把卷和数据库当成数据,不是缓存
卷的设计目标就是比容器活得更久。PostgreSQL、MySQL 或其他开发服务的卷,即使相关容器已经停止或删除,也可能保存着唯一一份本地数据。在确认归属与备份前,应该把卷当成文档,而不是缓存。
Docker 的备份文档明确指出,卷数据需要单独备份。能使用数据库自身导出工具时优先使用;否则也要采用经过恢复测试的卷备份流程。直接从正在运行的数据库卷里复制一堆文件,并不自动等于一致性备份。
在 Compose 文件中给卷起明确名字,并记录创建它的项目、恢复方式和过期时间。这样下一次清理就是执行保留策略,而不是猜谜。
缩小、迁移或重置 Docker Desktop 存储
清理对象后宿主机空间仍然紧张,就通过 Docker Desktop Settings 管理磁盘映像。不同版本提供的控件可能不同,但受支持的设置界面才是调整磁盘上限或映像位置的正确入口。
不要在访达里拖动 Docker.raw。Docker 官方明确要求通过 Settings 迁移。在恢复出厂设置、卸载或执行破坏性的磁盘大小调整前,先导出需要保留的镜像,或确认它们能够重新拉取;卷要单独备份,必要配置也要保存。
删除 Docker 对象后,宿主机空间回收可能有延迟,具体取决于磁盘映像格式和 Docker Desktop 行为。Docker 的 Mac FAQ 说明,Docker.raw 通常比旧的 qcow2 格式更快归还宿主机空间。清理完成后先重新测量,不要立刻追加更激进的删除。
AskClean 会做什么,又刻意不做什么
AskClean 可以显示 Docker Desktop 的启动器缓存,并揭示 Docker 管理的数据在 Mac 上占用了多少空间。它会把 Docker.raw、Docker Group Container 数据、凭据、镜像和卷标成「由提供方管理」或「永不默认选择」,而不是当成普通 App 缓存丢进废纸篓。
容器对象和虚拟磁盘仍应使用 Docker 自己的 CLI 与 Settings 管理。AskClean 的作用是让隐藏占用可见,并阻止一次普通清理跨过凭据或卷数据的边界。安全流程应是:AskClean 找出位置,docker system df -v 做诊断,最后只清理正确类别。
Docker 各类数据的清理风险
同一个虚拟磁盘里,既有可重建层,也有持久数据。
| 类别 | 检查方式 | 删除后果 |
|---|---|---|
| 构建缓存 | docker system df -v / Builder 工具 | 以后重新构建或下载,不应影响卷数据。 |
| 停止容器 | docker ps -a | 失去容器可写层;单独命名的卷通常保留。 |
| 不用的镜像 | docker image ls | 以后需要时必须重新拉取或构建。 |
| 卷 | docker volume ls | 可能永久失去应用或数据库的持久数据。 |
| Docker.raw | Docker Desktop Settings | 手动删除可能抹掉全部本地 Docker 对象和卷。 |
常见问题
Docker.raw 为什么这么大?
它是 Docker Desktop 的 Linux 虚拟磁盘,里面包含镜像、容器、缓存和卷。它的逻辑大小或上限可能与实际占用的宿主机块不同,因此要先看 docker system df -v 和 Docker Desktop Settings。
docker system prune 安全吗?
只有在你接受它列出的全部类别时才安全:默认包括停止容器、不用的网络、dangling 镜像和不用的构建缓存。先审计;不了解额外下载成本和数据风险时,不要加 -a 或 --volumes。
docker system prune 会删除卷吗?
默认不会。加入 --volumes 会扩大到匿名卷。即使看起来没有使用,卷也可能保存重要数据库数据,删除前必须确认归属并完成备份。
可以直接在访达删除 Docker.raw 吗?
不要手动删除或移动。这样可能摧毁全部本地 Docker 状态,或让 Docker Desktop 无法启动。对象使用 Docker CLI 管理,磁盘映像使用 Docker Desktop Settings 管理。
参考来源