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 命令,因为由运行时自己管理这部分空间,比删文件可靠得多。