GB 到底藏在哪里
WSL2 上的 Docker Desktop 把一切——镜像、容器、卷、构建缓存——都放在特殊的 WSL 发行版里,每个发行版以单个动态 VHDX 文件的形式躺在 C: 盘上。每次 pull 都会加层,每次构建都会加缓存,而删除任何东西只释放 Linux 文件系统内部的空间:宿主机上的文件仍停在最高水位线上。你自己装的 Ubuntu 或 Debian 发行版也用各自的 ext4.vhdx 玩同一套把戏,而且这些在“大文件夹”猎捕行动中一无所获——因为对 Windows 来说,它们只是几个不透明的文件。
- docker-desktop-data(旧版 Docker)或 docker_data.vhdx(新版):%LOCALAPPDATA%\Docker\wsl 下 30–80 GB 的头号大户——镜像、容器、卷、构建缓存
- docker-desktop:跑 Docker 引擎本身的小型系统发行版
- 你自己的 WSL2 发行版:每个都在 %LOCALAPPDATA%\Packages\...\LocalState 下有一个 ext4.vhdx
- 构建缓存:即使删掉最终镜像,docker builder 仍保留中间层
- 悬空镜像和已停止的容器:被中断的构建与拉取留下的孤儿层
- 匿名卷:compose 文件每次构建时悄悄创建,连 docker image prune 都清不掉
先清理内部——压缩一个脏盘是白费功夫
压缩一个塞满死镜像的 VHDX,只会得到一个下周又重新膨胀的小文件,所以操作顺序很重要。从内部开始:docker system df 显示镜像、容器、卷和缓存实际占了多少,这些数字通常让人吃惊。docker system prune -a 删除未使用镜像和已停止的容器,--volumes 连孤儿卷一起带上——确认你没删掉自己真想要的数据库数据。接着 docker builder prune 清掉反复重建最爱撑大的构建缓存;只有当 docker system df 报出一个你能接受的数字时,才值得去动宿主机上的文件。
然后缩小磁盘:三种受支持的方法
先运行 wsl --shutdown,否则文件会被运行中的容器和发行版锁定。在较新的 WSL 版本上,wsl --manage <发行版> --set-sparse true 会把 VHDX 标记为稀疏文件,让 Windows 回收空闲块;在旧环境里,可靠的路子是导出再导入——wsl --export 导出为 .tar,wsl --unregister 注销,wsl --import 导入到新文件夹——文件会按真实数据大小重建。Docker Desktop 还能在 Settings > Resources > Advanced 里把整个磁盘镜像搬到另一个驱动器,并自动迁移数据——当 C: 盘对你的工作来说就是太小时,这是老实的解决办法。既然到了那里,顺便给增长设个上限:同一设置页里有磁盘大小限制,而每月看一眼 docker system df 的习惯能让你守住它。
常见问题与解答
Docker Desktop 为什么占这么多磁盘空间?
Docker 把每个镜像、层、卷和构建缓存条目都放在一个按需增长、从不自动收缩的动态 VHDX 里。用 docker system df 查看明细,清理不需要的,然后压缩或导出/导入磁盘。
怎么缩小 WSL2 的 Docker VHDX 文件?
先运行 wsl --shutdown,然后用 wsl --manage <发行版> --set-sparse true 把磁盘设为稀疏,或者把发行版导出为 .tar、注销后重新导入——新的 VHDX 会与你的真实数据大小一致。
联系我们: [email protected]