来源:
《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

把这个目录迁移到其他盘的步骤如下:

  1. 退出Docker Desktop
  2. 把上述目录整体移动到另一个空间充足的盘(剪切->粘贴)
  3. 打开命令行,执行:
    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里删掉过的镜像文件的大小。

打赏作者

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

CAPTCHA