我可以在 WSL 2 中使用 Docker 的 Linux 文件系统来绑定安装目录而不是安装 Linux 发行版吗?

Can I use Docker's Linux filesystem in WSL 2 to bind mount a directory instead of installing a Linux distro?

我在 Windows 10 上通过 WSL2 使用 Docker。我只希望能够创建 Linux 容器并将容器中的目录映射到 WSL 目录。

我很确定 WSL 必须已经可以访问 Linux 文件系统才能创建任何使用的容器卷,所以如果我想绑定挂载一个目录,我可以使用该文件系统而不是必须安装并托管整个单独的 Linux 发行版?

我已经找到文件系统 Docker 在 \wsl$\docker-desktop 上使用并尝试在其中绑定安装目录,但未能成功。

有谁知道如何让它起作用,或者为什么它不起作用?

更新这是我在 WSL 文件系统中创建文件并将其绑定安装到 Docker 容器中的会话。所有命令都没有错误地完成,但它只是不起作用,在容器内没有检测到绑定安装的更改。

:: Verify existing distros and default distro
C:\Users\User>wsl -l
Windows Subsystem for Linux Distributions:
docker-desktop (Default)
docker-desktop-data

:: Start wsl
C:\Users\User>wsl
DESKTOP-SDE0C3N:/tmp/docker-desktop-root/mnt/host/c/Users/User#

:: View filesystem mounts
DESKTOP-SDE0C3N:/tmp/docker-desktop-root/mnt/host/c/Users/User# cd ../../../
DESKTOP-SDE0C3N:/tmp/docker-desktop-root/mnt/host# ls
c    wsl

:: Create a directory in the WSL filesystem to bind mount into a docker image
DESKTOP-SDE0C3N:/tmp/docker-desktop-root/mnt/host# mkdir wsl/test-dir1
DESKTOP-SDE0C3N:/tmp/docker-desktop-root/mnt/host# ls wsl
docker-desktop       docker-desktop-data  test-dir1

:: In a Windows CMD shell spin up a docker container with a bind mount to the created directory
C:\Home>docker run --rm -it --entrypoint bash -v //wsl$/test-dir1:/myapp node
root@3a56694db873:/#

:: In the container verify the bind mount is present - 'myapp' is there
root@3a56694db873:/# ls
bin   dev  home  lib64  mnt    opt   root  sbin  sys  usr
boot  etc  lib   media  myapp  proc  run   srv   tmp  var

:: Back in the WSL Bash prompt (NOT in the container) create a file in the supposedly mounted directory.
DESKTOP-SDE0C3N:/tmp/docker-desktop-root/mnt/host/wsl/test-dir1# echo Hi!! > test1.txt
DESKTOP-SDE0C3N:/tmp/docker-desktop-root/mnt/host/wsl/test-dir1# ls
test1.txt

:: In the interactive shell attached to the container verify that the created file is visible.
root@3a56694db873:/# ls myapp
root@3a56694db873:/#        <-- test1.txt should be here!!!

从容器中看不到创建的文件。绑定安装不工作。

由于多种原因,这行不通。

将 Linux 文件系统中的目录绑定挂载到 Docker 容器的目的是在 Windows 上,这比绑定挂载提供更好的 IO 性能和工作文件更新通知Windows 文件系统上的一个目录。

然而,要使绑定挂载工作,必须从 Linux 发行版中调用 docker run 命令,以便绑定挂载路径是该发行版中的有效 Linux 路径.

docker-桌面发行版不能这样做有两个原因。

  1. 使 Windows 命令在 Linux 发行版的文件系统中成为 运行 的标准 WSL 命令互操作在 docker-桌面发行版,因为它是一个特殊的发行版,仅作为 Docker 实现的一部分。因此,像 cmd.exe /C dir 这样的命令在标准 WSL Linux 发行版中可以正常工作,但在 docker-桌面发行版中将无法正常工作。因此,出于同样的原因,Windows docker.exe 在 docker-桌面发行版中也不能是 运行。

  2. Docker Desktop 有一个集成设置,可以启用它来添加 docker 对指定 WSL Linux 发行版的支持,启用后它会启用 docker 从该发行版中执行的命令。但是 Docker Desktop 在其自己的发行版上不启用此选项,也无法启用它。

这就是为什么您必须安装额外的 Linux 发行版并从中绑定挂载容器目录的原因。