来源:
《Windows Docker Desktop占用C盘空间过大解决办法》
https://zhuanlan.zhihu.com/p/708740826
背景
在Windows系统中安装Docker Desktop时,是无法选择安装的位置的,程序默认将Docker安装到了C盘。在使用Docker的过程中,我们会下载镜像文件,而一个镜像文件动辄10几G,都会被放到C盘里存储Docker数据的磁盘映像文件(.vhdx)中。由于vhdx文件的特性,即使在Docker中删除掉不用的镜像文件,vhdx文件也不会释放存储空间,这样电脑的C盘很快就会被占满。
原因
Windows的Docker Desktop基于WSL2来运行,所有的image、container数据都会被放到WSL2的虚拟磁盘文件(vhdx)中。而WSL2的vhdx具有“动态”特性,即当磁盘文件创建时,初始化一个最大的上限容量(默认是1T),当里面数据增加时,vhdx所占的空间随之增加,直到上限,但当里面的数据被移除时,vhdx所占的空间并不会随之减小。这就是为什么即使在Docker里删除了镜像文件,也无法释放电脑的存储空间。
解决方案
一. 把Docker虚拟磁盘从C盘转移到其他盘
Docker Desktop的数据文件,默认存放在以下目录中:
C:\Users\<Username>\AppData\Local\Docker
把这个目录迁移到其他盘的步骤如下:
- 退出Docker Desktop
- 把上述目录整体移动到另一个空间充足的盘(剪切->粘贴)
- 打开命令行,执行:
mklink /j "C:\Users\<Username>\AppData\Local\Docker" "<移动到的目标位置路径>"
再打开Docker,拉取镜像文件,你会发现C盘的占用空间不再增长。
上述命令实际上是在C盘的原Docker目录处创建了一个链接文件,指向被移动到的新位置。所有对原C盘的Docker目录进行的读写操作都可以照常进行,但是实际的数据存储到了移动到的新位置。
二. 压缩vhdx文件
由于vhdx文件的特性,即使里面的数据被删除了,它也不会主动释放空间。我们可以通过以下步骤来手动压缩vhdx文件中的空洞,来减小所占用空间的大小:
首先退出Docker Desktop,可以在命令行中执行wsl –shutdown来关闭所有正在wsl上运行的服务,并通过wsl -l -v来确认所有的服务已关闭。
然后用管理员模式打开命令行窗口,执行
diskpart
进入diskpart程序,并在diskpart里面输入:
DISKPART> select vdisk file="<vhdx文件路径>"
然后执行:
DISKPART> compact vdisk
等待一会到进度100%,然后输入exit退出diskpart程序。
此时查看对应的vhdx文件大小,应该会比之前小一些。我的情况是从80多G缩小到50多G,缩小的幅度刚好是我在Docker里删掉过的镜像文件的大小。
打赏作者