当我在Windows 10 Home上使用Docker Desktop和WSL2时,我该如何更改Docker镜像的位置?

311
我刚刚升级到了Windows 10 Home May 2020版本,已激活WSL2并安装了Docker Desktop
WSL2必须安装在系统盘上,我的系统盘是一个小的SSD。我不想用docker映像来填满它。我该如何更改docker映像路径?我想使用大的Windows文件系统路径。 映像位置有点令人困惑。我认为它在/mnt/wsl/docker-desktop-data/中。
我怎样才能更改WSL2内部docker映像的目录?我可以更改docker配置以选择/mnt/d内部的路径,或者挂载从/mnt/d到docker数据目录的路径吗?
13个回答

749

WSL 2 docker-desktop-data虚拟机磁盘映像通常位于以下位置:%USERPROFILE%\AppData\Local\Docker\wsl\data\ext4.vhdx

按照以下步骤将其迁移到其他驱动器/目录,并保留所有现有的docker数据(已在Docker Desktop 2.3.0.4 (46911)上测试,并在更新到3.1.0 (51484)后继续工作):

首先,通过右键单击Docker Desktop图标并选择退出Docker Desktop来关闭docker desktop。

然后,打开命令提示符:

wsl --list -v

你应该能够看到,确保两者的状态都是停止的。(wsl --shutdown
  NAME                   STATE           VERSION
* docker-desktop         Stopped         2
  docker-desktop-data    Stopped         2

将docker-desktop-data导出到文件中
wsl --export docker-desktop-data "D:\Docker\wsl\data\docker-desktop-data.tar"

从WSL中注销docker-desktop-data,注意,在此之后,您的ext4.vhdx文件将自动删除(如果您有重要的现有映像/容器,请先备份)。
wsl --unregister docker-desktop-data

将docker-desktop-data导入到wsl中,但现在ext4.vhdx将位于不同的驱动器/目录中(请注意,如果尚不存在,您需要创建D:\Docker\wsl\data\):
wsl --import docker-desktop-data "D:\Docker\wsl\data" "D:\Docker\wsl\data\docker-desktop-data.tar" --version 2

重新启动Docker桌面应用程序,它应该可以正常工作。如果Docker桌面应用程序无法正确启动,请重新启动计算机并再次尝试。
如果在验证后一切正常,您可以删除D:\Docker\wsl\data\docker-desktop-data.tar文件(不是ext4.vhdx文件)。

40
太好了!我想使用我的硬盘驱动器来存储 Docker 镜像,这正是我要找的。 - Wajahath
4
好的,我会尽力进行翻译。这是需要翻译的内容:“完美。我能为此线程添加的唯一补充是,我刚清除了缓存,所以在列出文件时没有找到docker-desktop-data,因此我不得不重新启动Docker并退出它,以便再次创建docker-desktop-data WSL发行版。” - Danton Heuer
16
请注意,在导出之前,您还需要关闭WSL(否则在进行导出时可能会出现TimeoutException错误):wsl --shutdown - Julian Didier
8
我曾长期遭受磁盘空间不足的困扰...非常感谢你! - Disappointed
13
我遇到了与“系统找不到指定的路径”相关的问题。通过在操作过程之前创建目录“D:\Docker\wsl\data”,问题得以解决。 - Sergey Dvoreckih
显示剩余18条评论

54
  1. 停止 Docker Desktop
  2. 将 Docker 文件夹从 C:\Users\xxx\AppData\Local\Docker 移动到新路径
  3. 确保 C:\Users\xxx\AppData\Local\Docker 不再存在
  4. 以管理员模式打开命令提示符
  5. 运行以下命令,该命令将在 cmd 窗口中创建一个符号链接,其中包含适当的源和目标路径
    mklink /j "C:\Users\xxx\AppData\Local\Docker" "path to where you relocated your docker folder"
  1. 重新启动 Docker Desktop

3
这很容易,也节省了我的磁盘空间,谢谢 =D - Ramon Veloso
我按照相同的步骤操作,Docker在appdata\local\Docker中显示了快捷图标。但是尽管运行了mklink命令,存储空间仍然不断增加。对我来说没有起作用。 - Ashutosh Soni
3
这比编辑配置文件并通过.tar导入方法将虚拟机放到我的硬盘驱动器上要好得多。谢谢! - Aaronontheweb
您可能还需要运行 wsl --shutdown 命令以移动文件。 - mheinzerling

23

编辑:重新注册docker-desktop现在会将默认的docker-data设置为C驱动器,因此我们只应取消注册docker-data作为接受的答案。

您可以执行以下操作:

 wsl --unregister docker-desktop-data

 wsl --import docker-desktop-data D:\wsl\docker-desktop-data "C:\Program Files\Docker\Docker\resources\wsl\wsl-data.tar" --version=2

tar文件是用于安装的文件,在这之前需要确认目标位置。

对我来说,当move-wsllxrunoffline无法在快速环上工作时,它总是有效的。有时你需要先卸载/安装docker。


对我来说,我不得不重新启动我的电脑,但这确实起作用了! - Michael Xu

13
扩展@Attila Badi的答案,也可以对C:\ProgramData\Docker文件夹进行相同的处理,这似乎是用于WSL/Windows容器。即使移动了Docker数据文件夹,仍会留下一个庞大的启动驱动器ProgramData\Docker文件夹,特别是如果您无法或不愿清理镜像。您不能迁移它,也不能在安装后移动它。使用Docker引擎高级设置可以在Linux容器模式下工作,但在Windows下则不行,反之亦然,并且很难启动。
我遵循的步骤:
1.卸载Docker。我知道……确保你保存了需要的东西。
2.在你有大量空间的位置创建主要的占用空间的Docker文件夹,例如:
D:\Data\Docker\ProgramData_Docker 和 D:\Data\Docker\AppData_Local_Docker 3.通过在管理员模式下的命令窗口中运行以下命令来创建链接文件夹:
mklink /j "C:\Users\xxx\AppData\Local\Docker" "D:\Data\Docker\ProgramData_Docker"
mklink /j "C:\ProgramData\Docker" "D:\Data\Docker\AppData_Local_Docker"
  1. 安装Docker。

您应该能够愉快地拉取Windows Server镜像,但不会占用您的引导驱动器。

更新:

尝试创建C:\ProgramData\Docker文件夹的符号链接可能会导致安全错误,具体取决于运行的版本和最初安装的版本。

4.13.0版本的发布说明提到了此功能,这可能是一个可行的解决方法(感谢@bhagerty和@Oly):

 start /w “” “Docker Desktop Installer.exe” install --installation-dir=G:\Docker

(来源:ungureanuovidiu @ https://forums.docker.com/t/docker-installation-directory/32773/17

更新:

这在4.17.1上有效,但ProgramData_Docker更改为DockerDesktop。出现问题需要重置Windows并重新安装Windows 11上的Docker,并且仍然适用于上述更改。请注意,在某个版本之后记住DocherDesktop的更改。


1
我一直尝试避免这个方法,但看起来在我尝试过的所有方法中,这个方法对我有效。我认为我的问题是我正在使用新的 Docker,但是在 WSL1 设置中,而且 2021 年的答案对我不适用。并且位置略有不同,我只在这里放了一个链接: mklink /j "C:\ProgramData\DockerDesktop" "D:\work\docker"。 - Anton Krug
1
我使用的是WIN10 LTSC,目前只有WSL1,因此Docker将东西放入了略微不同的文件夹中,即使我关闭了Docker/Hyper-V,也无法移动文件夹。但是当我卸载后,准备好C:\ProgramData\DockerDesktop -> D驱动器链接,然后重新安装Docker,它就会按照我想要的方式运行。 - Anton Krug
2
同意。关机对我也没有用 - 它仍然在后台运行WSL机器。很高兴它对你有用。Docker应该修复这个问题,并将其作为设置的属性(甚至是高级设置)的一部分。 - Anthony Horne
4
没有把它作为常规安装的一部分是荒谬的,Docker 不适用于普通用户,但高级用户经常拥有复杂的分区/硬盘设置,因此我认为 Docker 应该长期提供这个选项。实际上,这也是我仍然使用其他框架(如 Vagrant)的原因之一,感觉更加牢固和设计得更好。 - Anton Krug
1
无法在Docker桌面版中工作。安装过程会出现错误:由于安全原因,c:/ProgramData/DockerDesktop无法进行符号链接。 - Oly
显示剩余5条评论

10
对我来说,使用符号链接时Docker无法启动。
然后我只使用了目录符号链接:
Docker stopped

Folder "wsl" moved to other location on disk "B"

RUben@AD-RUBEN C:\Users\RUben\AppData\Local\Docker
$ mklink /D wsl "B:\dev\wsl"
**symbolic link** created for wsl <<===>> B:\dev\wsl

enter image description here

容器和镜像已准备就绪:

enter image description here


2
FreeMove实用程序可以为懒惰的人提供GUI来完成此操作:https://github.com/imDema/FreeMove - djibe
1
这个概念加上建议的FreeMove实用程序使得这个操作变得非常简单 - 一切都在第一次尝试时完美地运行。如果有人想要简单的答案,这就是它。 - bsplosion

5

一个不错的工具:

DDoSolitary/LxRunOffline: 一个完整功能的实用程序,用于管理Windows子系统Linux (WSL)

https://github.com/DDoSolitary/LxRunOffline

LxRunOffline.exe move    Move a distribution to a new directory.
Options:
  -n arg                Name of the distribution
  -d arg                The directory to move the distribution to.


例如:
退出 Docker Desktop,然后:
wsl --shutdown
LxRunOffline.exe move -n docker-desktop-data -d D:\vm\dockerdesktop\wsl\data

5
最佳方法是更新注册表。按以下步骤操作:
  1. 关闭WSL。使用命令wsl --shutdown
  2. 将整个路径为C:\Users\%USERPROFILE%\AppData\Local\Docker的目录移动到另一个驱动器,例如D:\Docker。
  3. 前往注册表编辑器位置 Computer\HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Lxss。
  4. 查找BasePath设置为C:\Users\%USERPROFILE%\AppData\Local\Docker\wsl\data的注册表条目。将其更新为D:\Docker\wsl\data。
  5. 查找另一个BasePath设置为C:\Users\%USERPROFILE%\AppData\Local\Docker\wsl\distro的注册表条目。将其更新为D:\Docker\wsl\distro。
  6. 使用以下命令重新启动WSL:wsl -d Ubuntu

我无法使用当前的Docker版本移动发行版。重启后它只会将其恢复到旧位置。 - Basil Peace
如果您移动整个Docker目录,则应该同时更改Docker配置,而不仅仅是Lxss。可能需要将execRoot添加到C:\Users\%USERPROFILE%.docker\daemon.json中。 - Basil Peace

4
Docker for Windows现在支持在下面的图形界面中更改此设置。我相信它也会处理移动现有文件的操作。

enter image description here


1
这绝对是目前最简单的解决方案!不需要进行其他复杂的步骤。 - undefined

3

我在github上找到了pxlrbt的这个工具。它使用标准的WSL导入/导出方式,非常安全可靠。我将我的docker-desktop-data发行版移动到另一个驱动器,并且它运行得很好。


2
使用上述脚本移动后,我遇到了一个错误 Docker desktop WSL distro stopped。能否分享一下步骤? - otong

2

仅供参考,截至目前(2023年6月):

  1. 导入导出方法在Windows上对于大于8 GB的图像失败。这是底层tar实现中的一个错误。

  2. 幸运的是,wsl有一个--vhd开关可用于导入和导出。而且,还有一个wsl --import-in-place命令,用于处理大容量。

  3. 尽管将wsl的.vhdx文件移动到其他位置从wsl的角度看是可以的,但Docker Desktop仍然存在问题。在对"docker-data"进行更改后,例如(较小的)distro\ext4.vhdx文件,Docker Desktop最终会删除此卷,甚至是旧位置(%APPDATA%\Docker\wsl\distro)上的备份副本,并弹出错误窗口。

总的来说,我赞同在Windows上使用mklink方法,因为:1. 这是最不麻烦的方法,2. 它有效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接