使用 Docker 桌面的 WSL2 上的 Docker 个卷
Docker volumes on WSL2 using Docker Desktop
我只是在 Docker 上试用 WSL 2 Windows,我遇到了挂载卷的问题:
version: "3.7"
services:
node:
build: .
container_name: node
hostname: node
volumes:
- ./app:/app
stdin_open: true
容器构建并启动良好,我可以很好地使用 docker exec 访问它,但容器内的 /app
文件夹未绑定到我的笔记本电脑 app
文件夹。但是正确的路径实际上正确地安装在 运行 容器上:
(这里我在主机上输入密码,看它是否与容器上安装的完全匹配)
➜ app pwd
/mnt/c/Users/willi/devspace/these/app
这是 portainer 的屏幕,告诉我在容器中的什么位置安装了什么路径,一切都匹配。
我在主机上的应用程序文件夹中创建的文件在容器的应用程序文件夹中不可见,反之亦然。这很奇怪,我不知道如何调试它。
补充信息:
- Windows 10 专业版 10.0.19041
- Docker 对于 Windows 版本:2.3.0.4
docker version
WSL 输出:19.03.12
docker-compose version
: 1.26.2
谢谢
正如@Pablo 提到的,Best-Practice 似乎正在使用 WSL 文件系统来映射卷。
看看Docker Documentation concerning WSL2:
最佳实践
- 要在 bind-mounting 个文件时充分利用文件系统性能:
- 将 bind-mounted 的源代码和其他数据存储到 Linux 文件系统中的 Linux 容器(即
docker run -v <host-path>:<container-path>
),而不是 [=48] =] 文件系统。
如果原始文件存储在 Linux 文件系统中,- Linux 容器仅接收文件更改事件(“inotify 事件”)。
- 当文件 bind-mounted 来自 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
.
- 如果您担心 docker-desktop-data VHDX 的大小,或者需要更改它,请查看 Windows 中内置的 WSL 工具。
- 如果您担心 CPU 或内存使用,您可以配置内存限制,CPU,分配给 WSL 2 实用程序 VM 的交换大小。
- 为避免在 Docker 桌面上使用 WSL 2 的任何潜在冲突,您必须在安装 Docker桌面。
现在一切正常,看来我的问题是我的 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
我只是在 Docker 上试用 WSL 2 Windows,我遇到了挂载卷的问题:
version: "3.7"
services:
node:
build: .
container_name: node
hostname: node
volumes:
- ./app:/app
stdin_open: true
容器构建并启动良好,我可以很好地使用 docker exec 访问它,但容器内的 /app
文件夹未绑定到我的笔记本电脑 app
文件夹。但是正确的路径实际上正确地安装在 运行 容器上:
(这里我在主机上输入密码,看它是否与容器上安装的完全匹配)
➜ app pwd
/mnt/c/Users/willi/devspace/these/app
这是 portainer 的屏幕,告诉我在容器中的什么位置安装了什么路径,一切都匹配。
我在主机上的应用程序文件夹中创建的文件在容器的应用程序文件夹中不可见,反之亦然。这很奇怪,我不知道如何调试它。
补充信息:
- Windows 10 专业版 10.0.19041
- Docker 对于 Windows 版本:2.3.0.4
docker version
WSL 输出:19.03.12docker-compose version
: 1.26.2
谢谢
正如@Pablo 提到的,Best-Practice 似乎正在使用 WSL 文件系统来映射卷。
看看Docker Documentation concerning WSL2:
最佳实践
- 要在 bind-mounting 个文件时充分利用文件系统性能:
- 将 bind-mounted 的源代码和其他数据存储到 Linux 文件系统中的 Linux 容器(即
docker run -v <host-path>:<container-path>
),而不是 [=48] =] 文件系统。
如果原始文件存储在 Linux 文件系统中, - Linux 容器仅接收文件更改事件(“inotify 事件”)。
- 当文件 bind-mounted 来自 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
.
- 将 bind-mounted 的源代码和其他数据存储到 Linux 文件系统中的 Linux 容器(即
- 如果您担心 docker-desktop-data VHDX 的大小,或者需要更改它,请查看 Windows 中内置的 WSL 工具。
- 如果您担心 CPU 或内存使用,您可以配置内存限制,CPU,分配给 WSL 2 实用程序 VM 的交换大小。
- 为避免在 Docker 桌面上使用 WSL 2 的任何潜在冲突,您必须在安装 Docker桌面。
现在一切正常,看来我的问题是我的 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