惊!Docker Desktop竟然不会自动释放磁盘空间,C盘告急!

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 -af
# 清理停止的容器 慎用,容器我还是要保留的
docker container prune -f
# 清理未使用的卷
docker volume prune -f
# 清理未使用的网络
docker network prune -f
# 清理构建缓存
docker builder prune -f
# 打印清理结果
docker system df
# 清理所有未使用的容器、镜像、网络和数据卷,以上清理过程的合并操作。 慎用(幸好没用,不然之前下的image要重新下)
docker system prune -a --volumes

但问题依旧,容器没装成,还百搭了20G SSD空间。想想都不爽。

2. 寻因

直接问的Deepseek(联网模式),提示词问题烂的一笔:windows wls docker pull 非官方镜像没有成功,清理后磁盘没有恢复原来大小。怎么回事

好在AI给出了正确答案,

alt text

原来是因为:👉 Docker Desktop的虚拟磁盘(如ext4.vhdx、docker_data.vhdx)在Windows系统中不会自动缩减空间占用。即使实际使用空间远低于最大值,系统仍会保留虚拟磁盘曾经达到的最大容量

3. 刨根

Docker Desktop基于WSL 2运行,而WSL 2使用vhdx格式的虚拟磁盘文件。这种文件支持自动扩容,但不会自动缩容。即使删除容器或镜像,虚拟磁盘文件仍会保留其最大占用空间,导致磁盘空间未被释放‌

4. 破局

解决办法:

  1. wsl --shutdown 关闭所有WSL,cmd 或 powershell工具都可以
  2. diskpart 打开工具,会自动新开一个cmd窗口
  3. select vdisk file="<you_path>\docker\disk\docker_data.vhdx" 自己环境下Docker Desktop的虚拟磁盘的路径。
  4. compact vdisk 执行压缩,等待进度跑完

结果惊奇的发现,之前被坑的20G不仅回来了,还多出来了28个G,简直不要太棒了。

本来AI工具是基于网页的内容进行综合回答,结果现在还需要AI回复,然后我再写回到网页(发布到的博客园)。AI知识源泉,网页占大头吧,有点“取之于民、用之于民”的味道了。

于是好奇diskpart的作用,查了下可用命令。需要进入diskpart工具的命令环境,输入/?

DISKPART> /?

Microsoft DiskPart 版本 10.0.22621.1

ACTIVE      - 将选中的分区标记为活动的分区。
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. 总结

  1. Docker Desktop的虚拟磁盘(如ext4.vhdx、docker_data.vhdx)在Windows系统中不会自动缩减空间占用。即使实际使用空间远低于最大值,系统仍会保留虚拟磁盘曾经达到的最大容量。需要定期手动释放。
  2. vhdx格式的虚拟磁盘,自动扩容但不会自动缩容,是其自身特性,与Docker Desktop也无关。
  3. windows下有个磁盘管理命令行工具dislpart
posted @ 2025-03-30 02:34  菜越香  阅读(2838)  评论(1)    收藏  举报