Docker Desktop竟然不会自动释放磁盘占用
> > 操作系统:Windows 11 家庭中文版 (23H2,22631.4037)16GB > > Docker Desktop 版本:v4.34.3 >1. 缘起
docker pull docker-0.unsee.tech/savatar101/omniparse:0.1
拉取镜像,某个片段卡住,我主动取消了改操作,Ctrl+C。发现磁盘占用10多个G。
本来以为二次pull时,会有缓存,但是发现之前下载好的片段还是在重新下载。
这不就是典型的“既立又婊”么,占用空间了不说,还要重新下载,绝对不能接受。
于是,各种磁盘清理,清空回收站,但都没有鸟用(费玉清:请问女人结婚有什么用?答案是:有鸟用🦜)。Docker Desktop也重启过几次。
问AI怎么回事,按照他的回复清理了镜像啥的。
docker image prune -a
删除所有未被容器使用的镜像和悬空的镜像docker container prune
清理停止的容器(慎用,容器我还是要保留的)docker volume prune
删除所有未被容器使用的卷命令清理所有未使用的容器、镜像、网络和数据卷。慎用(幸好没用,不然之前下的image要重新下)docker system prune -a --volumes
但问题依旧,容器没装成,还百搭了20G SSD空间。想想都不爽。
2. 寻因
直接问的Deepseek(联网模式),提示词问题烂的一笔:windows wls docker pull 非官方镜像没有成功,清理后磁盘没有恢复原来大小。怎么回事
好在AI给出了正确答案,
原来是因为:👉 Docker Desktop的虚拟磁盘(如ext4.vhdx、docker_data.vhdx)在Windows系统中不会自动缩减空间占用。即使实际使用空间远低于最大值,系统仍会保留虚拟磁盘曾经达到的最大容量。
3. 刨根
Docker Desktop基于WSL 2运行,而WSL 2使用vhdx格式的虚拟磁盘文件。这种文件支持自动扩容,但不会自动缩容。即使删除容器或镜像,虚拟磁盘文件仍会保留其最大占用空间,导致磁盘空间未被释放
4. 破局
解决办法:
wsl --shutdown
关闭所有WSL,cmd 或 powershell工具都可以diskpart
打开工具,会自动新开一个cmd窗口select vdisk file="<you_path>\docker\disk\docker_data.vhdx"
自己环境下Docker Desktop
的虚拟磁盘的路径。compact vdisk
执行压缩,等待进度跑完
结果惊奇的发现,之前被坑的20G不仅回来了,还多出来了28个G,简直不要太棒了。
本来AI工具是基于网页的内容进行综合回答,结果现在还需要AI回复,然后我再写回到网页(发布到的博客园)。AI知识源泉,网页占大头吧,有点“取之于民、用之于民”的味道了。
于是好奇diskpart的作用,查了下可用命令。需要进入diskpart工具的命令环境,输入/?
DISKPART> /?Microsoft DiskPart 版本 10.0.22621.1ACTIVE - 将选中的分区标记为活动的分区。
ADD - 将镜像添加到一个简单卷。
ASSIGN - 给所选卷分配一个驱动器号或装载点。
ATTRIBUTES - 操纵卷或磁盘属性。
ATTACH - 连接虚拟磁盘文件。
AUTOMOUNT - 启用和禁用基本卷的自动装载。
BREAK - 中断镜像集。
CLEAN - 从磁盘清除配置信息或所有信息。
COMPACT - 尝试减少文件的物理大小。
CONVERT - 在不同的磁盘格式之间转换。
CREATE - 创建卷、分区或虚拟磁盘。
DELETE - 删除对象。
DETAIL - 提供对象详细信息。
DETACH - 分离虚拟磁盘文件。
EXIT - 退出 DiskPart。
EXTEND - 扩展卷。
EXPAND - 扩展虚拟磁盘上可用的最大大小。
FILESYSTEMS - 显示卷上当前和支持的文件系统
FORMAT - 格式化卷或分区
GPT - 给选择的 GPT 分区分配属性。
HELP - 显示命令列表。
IMPORT - 导入磁盘组。
INACTIVE - 将所选分区标为不活动。
LIST - 显示对象列表。
MERGE - 将子磁盘与其父磁盘合并。
ONLINE - 使当前标为脱机的对象联机。
OFFLINE - 使当前标记为联机的对象脱机。
RECOVER - 刷新所选包中所有磁盘的状态。尝试恢复无效包中的磁盘,并重新同步具有过时丛或奇偶校验数据的镜像卷和 RAID5 卷。
REM - 不起任何作用。用来注释脚本。
REMOVE - 删除驱动器号或装载点分配。
REPAIR - 用失败的成员修复一个 RAID-5 卷。
RESCAN - 重新扫描计算机,查找磁盘和卷。
RETAIN - 在一个简单卷下放置一个保留分区。
SAN - 显示或设置当前启动的操作系统的 SAN 策略。
SELECT - 将焦点移动到对象。
SETID - 更改分区类型。
SHRINK - 减小选定卷。
UNIQUEID - 显示或设置磁盘的 GUID 分区表(GPT)标识符或主启动记录(MBR)签名。
5. 总结
- Docker Desktop的虚拟磁盘(如ext4.vhdx、docker_data.vhdx)在Windows系统中不会自动缩减空间占用。即使实际使用空间远低于最大值,系统仍会保留虚拟磁盘曾经达到的最大容量。需要定期手动释放。
- vhdx格式的虚拟磁盘,自动扩容但不会自动缩容,是其自身特性,与Docker Desktop也无关。
- windows下有个磁盘管理命令行工具
dislpart
。