searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

WSL Docker释放磁盘空间

2024-09-26 09:25:34
100
0

问题背景

基于Windows10安装WSL并载入Ubuntu系统后,同时安装了Docker Desktop进行Windows平台下基于Linux子系统的容器内开发工作。

遇到困难

计划不再在Windows10平台上进行上述开发,基于docker rmdocker 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为后缀的磁盘镜像文件,用作其内容的存储空间,类似vmdkvdi等。

此类镜像文件的特点是​​​支持自动扩容​,但是一般​不会自动缩容​。因此一旦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左右,是非常高效和根本的解决方案。

0条评论
作者已关闭评论
LuckyJack
2文章数
0粉丝数
LuckyJack
2 文章 | 0 粉丝
LuckyJack
2文章数
0粉丝数
LuckyJack
2 文章 | 0 粉丝
原创

WSL Docker释放磁盘空间

2024-09-26 09:25:34
100
0

问题背景

基于Windows10安装WSL并载入Ubuntu系统后,同时安装了Docker Desktop进行Windows平台下基于Linux子系统的容器内开发工作。

遇到困难

计划不再在Windows10平台上进行上述开发,基于docker rmdocker 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为后缀的磁盘镜像文件,用作其内容的存储空间,类似vmdkvdi等。

此类镜像文件的特点是​​​支持自动扩容​,但是一般​不会自动缩容​。因此一旦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左右,是非常高效和根本的解决方案。

文章来自个人专栏
文章 | 订阅
0条评论
作者已关闭评论
作者已关闭评论
0
0