我可以在 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-桌面发行版不能这样做有两个原因。
使 Windows 命令在 Linux 发行版的文件系统中成为 运行 的标准 WSL 命令互操作在 docker-桌面发行版,因为它是一个特殊的发行版,仅作为 Docker 实现的一部分。因此,像 cmd.exe /C dir
这样的命令在标准 WSL Linux 发行版中可以正常工作,但在 docker-桌面发行版中将无法正常工作。因此,出于同样的原因,Windows docker.exe 在 docker-桌面发行版中也不能是 运行。
Docker Desktop 有一个集成设置,可以启用它来添加 docker 对指定 WSL Linux 发行版的支持,启用后它会启用 docker
从该发行版中执行的命令。但是 Docker Desktop 在其自己的发行版上不启用此选项,也无法启用它。
这就是为什么您必须安装额外的 Linux 发行版并从中绑定挂载容器目录的原因。
我在 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-桌面发行版不能这样做有两个原因。
使 Windows 命令在 Linux 发行版的文件系统中成为 运行 的标准 WSL 命令互操作在 docker-桌面发行版,因为它是一个特殊的发行版,仅作为 Docker 实现的一部分。因此,像
cmd.exe /C dir
这样的命令在标准 WSL Linux 发行版中可以正常工作,但在 docker-桌面发行版中将无法正常工作。因此,出于同样的原因,Windows docker.exe 在 docker-桌面发行版中也不能是 运行。Docker Desktop 有一个集成设置,可以启用它来添加 docker 对指定 WSL Linux 发行版的支持,启用后它会启用
docker
从该发行版中执行的命令。但是 Docker Desktop 在其自己的发行版上不启用此选项,也无法启用它。
这就是为什么您必须安装额外的 Linux 发行版并从中绑定挂载容器目录的原因。