在 Windows 10 Home 上使用 WSL2 上的 Docker 桌面时,如何更改 Docker 图像的位置?

nev*_*ves 129 docker windows-10 docker-desktop wsl-2

我刚刚升级到 Windows 10 Home May 2020,激活 WSL2并安装Docker Desktop

WSL2必须安装在我的系统盘中,这是一个小型SSD。我不想用 docker 图像填充它。如何更改 docker 图像路径?我想在我的大 Windows 文件系统中使用一个路径。

图像位置有点混乱。我相信它在/mnt/wsl/docker-desktop-data/.

如何更改 WSL2 中 docker 镜像的目录?我可以更改 docker 配置以/mnt/d在 docker 数据目录上选择一个路径,或者从 /mnt/d 挂载一个路径吗?

小智 334

WSL 2 docker-desktop-data vm 磁盘映像通常位于: %USERPROFILE%\AppData\Local\Docker\wsl\data\ext4.vhdx

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

首先,通过右键单击 Docker 桌面图标并选择退出 Docker 桌面来关闭 Docker 桌面

然后,打开您的命令提示符:

wsl --list -v
Run Code Online (Sandbox Code Playgroud)

您应该能够看到,确保两者的状态都已停止。( wsl --shutdown)

  NAME                   STATE           VERSION
* docker-desktop         Stopped         2
  docker-desktop-data    Stopped         2
Run Code Online (Sandbox Code Playgroud)

将 docker-desktop-data 导出到文件中

wsl --export docker-desktop-data "D:\Docker\wsl\data\docker-desktop-data.tar"
Run Code Online (Sandbox Code Playgroud)

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

wsl --unregister docker-desktop-data
Run Code Online (Sandbox Code Playgroud)

将 docker-desktop-data 导入回 wsl,但现在 ext4.vhdx 将驻留在不同的驱动器/目录中:

wsl --import docker-desktop-data "D:\Docker\wsl\data" "D:\Docker\wsl\data\docker-desktop-data.tar" --version 2
Run Code Online (Sandbox Code Playgroud)

再次启动 Docker 桌面,它应该可以工作

如果在验证后一切看起来都不错,您可以删除D:\Docker\wsl\data\docker-desktop-data.tar文件(不是ext4.vhdx文件)

  • 我遇到了与“系统找不到指定的路径”相关的问题,通过在程序之前创建目录“D:\Docker\wsl\data”目录来解决。 (14认同)
  • 完美的!我想使用 HDD 而不是 SSD 来存储 docker 镜像。这就是我一直在寻找的东西。 (12认同)
  • 清晰简洁 (4认同)
  • 完美的。我可以添加到这个线程的唯一附加组件是我刚刚清除了缓存,并且列表中没有这个 docker-desktop-data,所以我必须再次启动 Docker 并退出它才能再次创建 docker-desktop-data WSL 发行版。 (4认同)
  • 请注意,您还需要在导出之前关闭 wsl(如果没有它,我会遇到 TimeoutException):`wsl --shutdown`。 (4认同)
  • 我长期以来一直遭受磁盘空间不足的困扰......非常感谢! (2认同)
  • 就我而言,在过程结束时 - 运行将 docker-desktop-data.tar 导入到新位置的命令后 - WSL 没有自动重新打开(`wsl --list -v` 仍然显示结果“停止”状态),显然没有办法让 WSL 重新启动。结果 Docker Desktop 找不到它的镜像,所以我尝试重新启动它的服务,但这也没有帮助,因为它不足以触发 WSL 重新打开......最后,我重新启动了我的系统,当我重新启动 Docker Desktop 它终于与 WSL 一起正常运行,并找到了它的镜像... (2认同)
  • 也适用于 Windows 11 (2认同)
  • 就我而言,它有效......但是当我使用 docker 桌面客户端(在故障排除中)中的“清理/清除数据”选项时,vdhx 会重置到旧位置。我有什么想法如何防止这种情况?它应该清理并清除并在新位置重新创建 vdhx... (2认同)
  • 注意:您现在可以复制 vhdx 并使用“--import-in-place”导入它,而不必导出和导入。只是更加精简一点。 (2认同)

Yim*_* Lu 13

编辑:重新注册 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
Run Code Online (Sandbox Code Playgroud)

tar 文件是用于安装的文件,在它之前是您的新目的地。

这总是有效,而move-wsllxrunoffline在快速环上对我不起作用。有时您必须先卸载/安装 docker


小智 10

  1. 停止 Docker 桌面
  2. 将 Docker 文件夹C:\Users\xxx\AppData\Local\Docker从新路径重新定位
  3. 确保C:\Users\xxx\AppData\Local\Docker不再存在
  4. 在管理员模式下打开一个cmd
  5. 运行以下命令,该命令将在 cmd 窗口中创建一个具有适当起始和终止路径的符号链接
    mklink /j "C:\Users\xxx\AppData\Local\Docker" "path to where you relocated your docker folder"
Run Code Online (Sandbox Code Playgroud)
  1. 重启 Docker 桌面

  • 这很简单,节省了我的磁盘,谢谢=D (3认同)
  • 这比编辑配置并通过“.tar”导入方法将虚拟机粘贴到我的硬盘上要好得多。谢谢你! (3认同)

小智 10

对我来说,docker 不会从 junction 开始。

然后我只使用了目录符号链接

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
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

容器和镜像可供使用:

在此输入图像描述

  • FreeMove 实用程序可以通过 GUI 为懒人完成此操作:https://github.com/imDema/FreeMove (2认同)

Tom*_*Tom 10

Docker for Windows 现在支持在 UI 中更改此设置,如下图所示。我相信它也可以处理现有文件的移动。

在此输入图像描述

  • 这是目前为止最简单的解决方案!无需所有其他复杂的程序。 (2认同)

Ant*_*rne 5

扩展@Attila Badi 的答案是也对 C:\ProgramData\Docker 文件夹进行相同的处理,该文件夹似乎用于 WSL/Windows Containers。即使移动 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"
Run Code Online (Sandbox Code Playgroud)
  1. 安装 Docker。

您应该能够愉快地拉取 Windows 服务器映像,但不会堵塞您的启动驱动器。

  • 同意。关闭对我也没有任何作用 - 它仍然在后台某处运行 WSL 机器。很高兴它对你有效。Docker 应该修复这个问题并使其成为设置的属性部分(甚至高级)。 (2认同)
  • 可笑的是,它已经不是常规安装的一部分,docker 不适合普通消费者,但高级用户通常有复杂的分区/硬盘设置,所以我想说 Docker 应该长期将其作为一个选项。实际上,我仍然使用其他框架(例如 vagrant)的原因之一,它的构建和设计感觉更扎实。 (2认同)

小智 5

一个不错的工具:

DDoSolitary/LxRunOffline:用于管理 Windows Subsystem for 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.

Run Code Online (Sandbox Code Playgroud)

例如:

退出 docker 桌面,然后:

wsl --shutdown
LxRunOffline.exe move -n docker-desktop-data -d D:\vm\dockerdesktop\wsl\data
Run Code Online (Sandbox Code Playgroud)


小智 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