问题背景
基于Windows10安装WSL并载入Ubuntu系统后,同时安装了Docker Desktop进行Windows平台下基于Linux子系统的容器内开发工作。
遇到困难
计划不再在Windows10平台上进行上述开发,基于docker rm
及docker rmi
等命令移除所有容器及对应镜像后,磁盘所占空间并没有释放,占用一度达30GB左右,主要来自XXX\DockerDesktopWSL\data\ext4.vhdx
这一文件。
PS:实际上清理Docker全部容器及镜像使用docker system prune -a
这一命令即可(如果只需清除无用镜像不要加入-a
),官方介绍为:
删除所有未使用的容器、网络、镜像(包括悬空和未引用的),并可选择删除卷(docker system prune | Docker Docs)
然而,基于Windows下的WSL作为Docker后端引擎的时候,情况会有些许不同。
产生原理
由于WSL实质上为一台虚拟机,而对于每台虚拟机,Windows将对应创建以vhdx
为后缀的磁盘镜像文件,用作其内容的存储空间,类似vmdk
、vdi
等。
此类镜像文件的特点是支持自动扩容,但是一般不会自动缩容。因此一旦Docker服务内占用空间过大,导致该镜像文件扩容,那么此时再使用docker system prune
清理虚拟机中的镜像文件,也不会释放已被占用的系统磁盘空间。
解决方案
前述镜像文件虽一般不会自动缩容,但支持我们的手动压缩。
首先需要寻找到相应的镜像文件,可在系统中搜索ext4.vhdx
文件,可能会搜索到多条记录,而Docker对应的镜像文件一般存放于C:\Users<你的用户名>\AppData\Local\Docker\wsl\data\ext4.vhdx
的位置(或其他自定义位置)。
找到该镜像文件后,我们对其进行手动压缩即可。
首先,删除Docker中的全部镜像:
docker system prune -a
之后退出Docker Desktop并关停WSL实例:
wsl --shutdown
最后打开 Windows 中提供的diskpart工具进行压缩:
diskpart
# open window Diskpart
select vdisk file="C:\Users\<你的用户名>\AppData\Local\Docker\wsl\data\ext4.vhdx"
attach vdisk readonly
compact vdisk
detach vdisk
exit
上述命令也可简化为:
Optimize-VHD -Path "path\to\disk.vhdx" -Mode Full
但笔者经过在Windows10家庭中文版下实践,找不到Optimize-VHD
工具,由于该工具是Hyper-V
的一部分,而Hyper-V
在家庭中文版并不会自带,因此采用diskpart方案即可。
如此操作完成之后,就可以看到磁盘空间已经收回了。
在此实例中,30GB左右的ext4.vhdx文件经过压缩,大小恢复至1GB左右,是非常高效和根本的解决方案。