必须先执行docker system prune -a --volumes清理冗余资源,再通过零填充和qemu-img压缩docker.raw文件才能释放真实磁盘空间;跳过清理直接操作虚拟磁盘将导致空间无法回收。

Mac上Docker虚拟磁盘(Docker.raw)持续膨胀却无法自动收缩,导致“其他”类存储暴增、系统变慢、可用空间跌破20GB,必须直接干预底层虚拟机磁盘文件才能释放真实空间。
先执行安全的系统级资源清理
这一步能清除大量冗余数据,为后续磁盘收缩创造条件。不跳过它直接动虚拟磁盘,会导致dd零填充后空间仍不释放。
打开终端,输入:
docker system prune -a --volumes
看到提示“WARNING! This will remove…”时,输入【y】并回车确认。该命令会删除所有已停止容器、未被引用的镜像、未挂载卷、未使用网络及全部构建缓存。
等待命令完成,注意终端末尾显示的“Total reclaimed space: X.XXGB”——这是你马上能拿回来的第一批空间。
定位并检查Docker.raw文件实际占用
进入Docker Desktop设置 → Resources → Disk image size,记下当前分配值(例如64GB)。这个数值只是上限,不代表真实占用。
关闭Docker Desktop(右键菜单栏图标 → Quit Docker Desktop)。
在终端中运行:
ls -lh ~/Library/Containers/com.docker.docker/Data/vms/0/data/Docker.raw
若显示大小接近你设定的上限(如63.9G),说明磁盘文件已严重膨胀且内部存在大量未归还的空闲块——这正是零填充要解决的问题。
启动虚拟机并执行零填充清理
第一步:重新打开Docker Desktop,等待状态栏图标变为绿色(表示VM已启动)。
第二步:打开终端,运行以下命令启动一个临时Alpine容器并执行零写入:
docker run --rm -it -v /var/lib/docker:/mnt alpine sh -c "dd if=/dev/zero of=/mnt/tmp.zeros bs=1M count=2048 && sync && rm /mnt/tmp.zeros"
这条命令会在Docker虚拟机内部的根文件系统里写入2GB零数据再删除,触发底层qcow2镜像的空闲块标记。不能用主机端dd直接写Docker.raw,否则会破坏文件系统结构。
第三步:等待容器退出后,立即关闭Docker Desktop。
压缩Docker.raw文件释放物理空间
在终端中执行:
qemu-img convert -O qcow2 -c ~/Library/Containers/com.docker.docker/Data/vms/0/data/Docker.raw ~/Library/Containers/com.docker.docker/Data/vms/0/data/Docker.raw.compact
这一步会创建一个压缩后的新镜像文件,-c参数启用zlib压缩,对空块做高效去重。原始Docker.raw不会被删,但新文件通常能缩小30%~70%。
确认新文件生成且大小合理后,执行原子替换:
mv ~/Library/Containers/com.docker.docker/Data/vms/0/data/Docker.raw.compact ~/Library/Containers/com.docker.docker/Data/vms/0/data/Docker.raw
【务必等Docker Desktop完全退出后再执行此步,否则将导致数据损坏】
重启Docker Desktop,再次查看磁盘用量,系统级存储应明显回落。











