Docker 在 Mac 上占了太多磁盘:哪些能删,哪些绝不能碰

Docker Desktop 在 macOS 上怎么存数据,为什么 Docker.raw 看起来比实际大,以及安全回收空间的 docker 命令。

在 macOS 上,Docker 运行在一个 Linux 虚拟机里,它存的所有东西(镜像、容器、卷、构建缓存)都在一个磁盘镜像文件里。空间就是被这个文件吃掉的,而它也恰恰是你绝不能在 Finder 里删的那一个。

看真实占用

ls -lh ~/Library/Containers/com.docker.docker/Data/vms/0/data/Docker.raw   # 逻辑大小
du -h  ~/Library/Containers/com.docker.docker/Data/vms/0/data/Docker.raw   # 实际占用

Docker.raw 是稀疏文件。ls 显示的是它最多能长到多大,du 显示的是现在实际占了多少,两者可以差几十个 GB。

问 Docker 里面有什么

docker system df        # 镜像、容器、卷、构建缓存
docker system df -v     # 同上,逐项列出

回收空间:从最温和到最彻底

docker builder prune            # 只清构建缓存
docker image prune              # 悬空镜像
docker container prune          # 已停止的容器
docker system prune             # 以上全部,外加未使用的网络
docker system prune -a --volumes   # 再加上所有未使用的镜像和卷

卷里放的是数据库等状态。--volumes 会删掉此刻没有容器在用的每一个卷,包括你昨天停掉的那个项目的 Postgres 数据。

绝不要手动删磁盘镜像

从宿主机删掉 Docker.raw,会一次毁掉所有镜像、容器和卷,而且里面的东西从宿主机一侧无法重建。想让文件变小,请在 Docker Desktop 的 Settings › Resources 里调低上限,或者用 Troubleshoot 里的「Clean / Purge data」,那才是官方支持的重来方式。

Siftaway 怎么处理

Siftaway 会把磁盘镜像连同两个体积一起显示,并标为受保护:只报告,绝不动。对于构建缓存和悬空镜像,它会提示你使用上面的 docker 命令,因为由运行时自己管理这部分空间,比删文件可靠得多。