为什么在 Windows 中使用绑定挂载卷时需要 /host_mt/

Why is /host_mt/ required when using bind mount volumes in Windows

我遇到以下情况:我想创建一个绑定安装,它根据 docker 图像的内容进行初始化。

在 MacOS 上,我可以执行以下操作来完成此操作:

  1. 创建卷:docker volume create --opt type=none --opt device=%(pwd)/data_dir --opt o=bind --name data_volume
  2. 使用卷运行容器:docker run -v data_volume:/home

这将创建一个绑定挂载到当前工作目录中目录数据的卷,该卷名为 data_volume。 运行 卷只需要指定卷的名称。

但是,在 Windows 10 上,我可以执行以下操作:docker run -v %cd%/data_dir:/home。这等同于 MacOS 描述但不使用卷(因此它使用空 data_dir 目录初始化)。然而,这表明 Docker 理解当前的绑定安装。

当我使用针对 MacOS 描述的步骤创建卷时,出现以下错误:

Error response from daemon: failed to mount local volume: mount c:/some-path/data_dir:/var/lib/docker/volumes/data_volume/_data, flags: 0x1000: no such file or directory.

检查不使用 docker 卷使用的容器会产生以下设置:

...
"Mounts": [
   {
      "Type": "bind",
      "Source": "/host_mnt/c/some-path/data_dir",
      "Destination": "/home,
      "Mode": "",
      "RW": true,
      "Propagation": "rprivate"
   }
],
...

因此,如果我将音量更改为:docker volume create --driver local -o o=bind -o type=none -o device=/host_mnt/c/some-path/data_dir data_volume

有效。为什么在 Windows 上创建卷时需要 /host_mnt/ 前缀,但在 运行 容器和直接安装绑定时不需要 docker 前缀(没有 docker 卷)。

Docker 仅针对 linux 构建,因为其内核命名空间。因此,当您在 windows 计算机上 运行 一个 docker 容器时,它实际上 运行 是一个 linux 虚拟 machine 运行 是 docker 容器(因此 运行 docker 需要 Hyper-V)。 linux 和 mac 使用的 UNIX 文件路径与 windows 使用的不同。在 linux 和 mac 上,文件路径从 / 开始,而在 windows 上,文件路径从驱动器开始(如 C:/)。两个不同的系统互不兼容,所以docker把C盘放在/host_mnt/c,让系统互相兼容。