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

3
我有以下情况:我想创建一个基于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"目录的卷,卷名为"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 volume直接挂载绑定时运行容器却不需要呢?
1个回答

3
Docker由于内核命名空间的原因,只适用于Linux系统。因此,当您在Windows计算机上运行Docker容器时,实际上会运行一个Linux虚拟机来运行该Docker容器(这也是为什么需要Hyper-V来运行Docker的原因)。Linux和Mac使用的UNIX文件路径与Windows使用的文件路径不同。在Linux和Mac上,文件路径从/开始,而在Windows上,文件路径从驱动器(例如C:/)开始。这两个不同的系统彼此不兼容,因此Docker把C盘放在/host_mnt/c中,以使系统达成一致。

感谢您的深入评论。我发现很奇怪,这方面没有任何文档(或者关于它所创建的问题的文档)。 - Emptyless
@Emptyless 很高兴我能帮到你! - Aplet123

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