AskCleanAskClean问净

Docker 在 Mac 上占用太大?这样安全回收空间

AskClean 团队 · 更新于 2026-07-31

先运行 docker system df -v,确认真正占空间的是镜像、停止容器、构建缓存还是卷;再只清理诊断出来的类别。没有完成备份前,不要删除可能保存数据的卷;Docker.raw 也不能在访达中手动删除或移动。

Docker 存储中分布着容器、镜像层、构建缓存,以及一份受保护的数据卷
一个虚拟磁盘里既有可重建缓存,也有持久数据;清理前必须分开检查。

为什么 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 的恢复流程备份数据文件。

  1. 运行 docker system df -v,并保存带日期的输出。
  2. 运行 docker ps -a,确认哪些停止容器已经真正废弃。
  3. 运行 docker image ls,把重要镜像标签对应到仍在维护的项目或 CI 流程。
  4. 运行 docker volume ls,确认每个可能含数据的卷属于谁、是否已有可恢复备份。
  5. 最后检查构建缓存,使用 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 镜像扩大到所有未被容器引用的镜像。即使没有数据丢失,也可能带来很大的重新下载和构建成本。能够识别大镜像时,优先点名删除。

  1. 完成只读审计,并备份所有重要卷。
  2. 如果问题集中在构建缓存或停止容器,先单独清理该类别。
  3. 只有接受确认框中全部项目时,才运行不带 -a、--volumes 的 docker system prune。
  4. 重新运行 docker system df -v,并启动重要项目做验证。
  5. 等待 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.rawDocker 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 管理。

参考来源

继续清理开发者存储