卸载 Docker Desktop,别把命名数据卷一起清掉
Docker Desktop 不是一个单独的应用程序,它包含图形界面、后台虚拟机、挂到 /usr/local/bin 的命令行工具,还有一块会悄悄涨到几十 GB 的磁盘镜像,把它拖进废纸篓只去掉了界面,其余都还在。
它还有个别处少见的地方:官方卸载程序本身就是会删数据的那一步,事后清理反倒无关痛痒,下面按能保住数据的顺序来,并说明哪些残留可丢、哪些以后还想要回来。
卸载会销毁容器、镜像和数据卷
Docker 说得很直白,卸载 Docker Desktop 会销毁容器、镜像、数据卷以及本机其它 Docker 数据,没有撤销,也不进废纸篓,更不会再弹一次确认。
多数内容可以重建,镜像能重新拉取,容器能从 Dockerfile 再构建,例外是命名数据卷,本地数据库真正的数据就在这里,你开发了几个月的 Postgres 或 MySQL 容器,行数据存在数据卷里而不是镜像里,卸载时它会和别的一起被删掉。
在动手之前,先列出已有内容:
docker volume ls
某个数据卷重要的话,在卸载前备份,不要等卸载之后:
docker run --rm -v <volume>:/from -v "$PWD":/to alpine \
tar czf /to/<volume>.tgz -C /from .
从未推送到远端的自建镜像同理,docker image ls 能看出本机有什么,不在仓库里的就只存在于这台 Mac。
若只是为了腾空间,未必需要卸载
Docker 把几乎所有东西放在一个很大的虚拟磁盘镜像里,通常这就是它占空间最大的那一块,在 Docker 内部做清理往往就能腾出想要的空间,工具还留着,而且可逆,先用 docker system df 看各项占比,再读 在 Mac 上清理 Docker,不必丢掉数据,里面讲了清理方式,以及磁盘文件为什么不会自己缩小。
如果目标是彻底卸掉 Docker,继续往下。
用 Docker 自带的卸载程序
Docker 自带卸载程序,做的不只是删掉应用程序包,它会卸下后台服务,并去掉访达拖拽卸载后仍会留下的命令行符号链接。
从应用里操作的话,打开 Docker Desktop,点右上角疑难解答图标,选 Uninstall 再确认,在终端里则运行:
/Applications/Docker.app/Contents/MacOS/uninstall
然后把 Docker 从应用程序移到废纸篓。
如果卸载程序报 operation not permitted,Docker 文档说可以安全忽略,因为卸载其实已经完成,这条提示来自 macOS 保护应用的容器目录,没有“完全磁盘访问权限”时,终端碰不到那里。
还剩什么,分别归谁
卸载程序跑完后仍会留下一些目录,Docker 点名了两个:
~/Library/Group Containers/group.com.docker
~/.docker
它们不是同一类东西,差别正是关键。
~/.docker 是配置,里面有上下文、守护进程设置,以及 docker login 留下的仓库凭据,若以后重装 Docker,或改用 Colima、Rancher Desktop、OrbStack,这个目录往往值得保留,删掉它等于每个仓库都要重新登录。
~/Library/Group Containers/group.com.docker 和应用容器目录装的是虚拟机状态和磁盘镜像,几十 GB 就在这里,既然已接受容器和数据卷都没了,这块才是值得清掉的空间大头。
除了这两处,Docker 还会在 Library 下留下 macOS 常见痕迹:缓存、日志、偏好设置、已保存的应用程序状态,这些都可以丢,所以下手前值得分清哪个是缓存、哪个是凭据,而不是照着文件名里的 docker 一路删过去。
确认它真的卸干净了
做两项检查,先确认没有进程还在跑:
pgrep -fl -i docker
再确认命令行工具已断开链接:
which docker docker-compose
两者都应该没有输出,若 docker 仍能解析到路径,多半是单独用 Homebrew 装过命令行工具,那是另一套包,按设计会在 Docker Desktop 卸载后继续存在,brew list | grep docker 可以确认。
更快一次看清全部残留
手动路径可行,但前提是你已经知道有哪些路径、哪条才是数据,多数指南恰恰跳过这一步,而出错时代价也最大。
Mole 会在动手删除前列出应用留下的每一个文件,按类别分组,让你看清目录实际是什么,旁边还有占用大小,你先审一遍,取消勾选要保留的,清掉的内容进废纸篓而不是直接消失,就 Docker 而言,磁盘镜像通常占回收空间的绝大部分,提交前能看到这个数字,清理才不会变成惊吓。
重装之后哪些会回来
镜像和容器会回来,因为它们本来就能重建,镜像重新 pull,容器按 Dockerfile 再 build 一次,命名数据卷不会,它是唯一一类没有别处副本的东西,这也是前面让你先备份的原因。
~/.docker 留着的话,registry 登录状态和 context 配置一并回来,省掉重新 docker login,删掉了就得重登一遍,不影响功能。
虚拟磁盘镜像会重新创建,但是空的,它的体积会随着你重新拉镜像慢慢涨回去,所以「卸载 Docker 腾出几十 GB」这件事,在你重装并恢复日常使用之后基本会还原,真想长期把这块压住,得靠定期 docker system prune,而不是卸载重装。