使用Docker Desktop在WSL2上的Docker卷

19

我正在尝试使用Docker for Windows的WSL 2版本,但是在挂载卷方面遇到了问题:

version: "3.7"

services:
    node:
        build: .
        container_name: node
        hostname: node
        volumes: 
            - ./app:/app
        stdin_open: true
容器建立和启动都很顺利,我可以通过docker exec进行访问,但容器内的/app文件夹没有和我的电脑上的app文件夹绑定。不过正确的路径确实已经正确地挂载到了运行中的容器上: (在此处,我在主机上执行pwd命令以确保其与容器上挂载的内容完全匹配)。
(在此处,我在主机上执行pwd命令以确保其与容器上挂载的内容完全匹配)。
➜  app pwd   
/mnt/c/Users/willi/devspace/these/app

这是Portainer的屏幕截图,告诉我容器中挂载了哪些路径,一切都匹配。

docker volume from portainer

我在主机的app文件夹中创建的文件在容器的app文件夹中不可见,反之亦然。这很奇怪,我不知道如何调试它。

补充信息:

  • Windows 10 Pro 10.0.19041
  • Docker for Windows版本:2.3.0.4
  • 在WSL中的docker version输出:19.03.12
  • docker-compose version:1.26.2

谢谢


1
根据设置WSL2后端的Docker指南的建议,理想情况是您将源代码或卷存储在WSL文件系统中。看起来您甚至也从主机启动了docker服务。我建议将整个应用程序文件夹移动到WSL文件系统中,并从那里启动服务。 - Pablo
2个回答

24

正如 @Pablo 提到的那样,最佳实践似乎是使用 WSL 文件系统来映射卷。

请查看 关于 WSL2 的 Docker 文档

最佳实践

  1. 当绑定挂载文件时,请遵循以下最佳实践以获得最佳文件系统性能:
    • 将源代码和其他绑定到 Linux 容器(例如使用 docker run -v <host-path>:<container-path>)的数据存储在 Linux 文件系统中,而不是 Windows 文件系统中。
    • 只有将原始文件存储在 Linux 文件系统中,Linux 容器才会收到文件更改事件(“inotify 事件”)。
    • 从 Linux 文件系统中绑定挂载文件要比从 Windows 主机进行远程操作快得多。因此,请避免使用 docker run -v /mnt/c/users:/users(其中 /mnt/c 是从 Windows 挂载的)。
    • 相反,从 Linux shell 使用类似 docker run -v ~/my-project:/sources <my-image> 的命令,其中 ~ 被 Linux shell 展开为 $HOME
  2. 如果您对 docker-desktop-data VHDX 的大小有顾虑,或者需要更改它,请查看内置于 Windows 的 WSL 工具。
  3. 如果您对 CPU 或内存使用量有顾虑,可以配置在分配给 WSL 2 实用程序 VM 的内存、CPU 和 Swap 大小上设置限制。
为避免在使用 Docker Desktop 上的 WSL 2 时出现任何潜在冲突,您必须在安装 Docker Desktop 之前卸载通过 Linux 发行版直接安装的任何先前版本的 Docker Engine 和 CLI。

3
按照建议,我将一个文件从Windows文件系统复制到了WSL中的主目录(~/)下,但该目录中的文件仍未在我的容器中显示 - 我只看到了一个空目录。我尝试对这些文件运行chmod 777命令,但仍然没有成功。 - Andy
我想要在Linux文件系统中进行绑定挂载,但是挂载不起作用。例如,我可以绑定~/某个地方,它有内容,但是在容器内部,却没有内容。 - undefined
@skydivin4ng3l我正在尝试将Docker设置为本地开发环境。如果我将我的文件托管在WSL2 Ubuntu环境中,我该如何在vscode中修改这些文件(即更改->保存->在测试环境中看到更改,反复进行)。最初我没有使用WSL2卷,每个WordPress页面加载需要90-250秒,所以无法用于开发。我不得不将文件放在WSL2 Ubuntu中(我想我使用了mv {source_dir} {target_dir}),现在每个页面加载时间缩短到0.5秒,但我不知道如何设置可用的开发流程。 - undefined

5

现在一切工作都很完美,看来我的问题是我的 WSL 发行版仍然是版本 1。您可以使用命令 wsl -l -v 进行验证。

  NAME                   STATE           VERSION
* docker-desktop-data    Stopped         2
  docker-desktop         Stopped         2
  Ubuntu-20.04           Running         2 <- This was at 1

升级到WSL2


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