【问题标题】:When mounting /var/run/docker.sock into a container, which file system is used for volume mounting?将 /var/run/docker.sock 挂载到容器中时,使用哪个文件系统进行卷挂载?
【发布时间】:2019-06-26 15:27:06
【问题描述】:

我有一个容器,其中包含用于协调主机上微服务部署的逻辑 - 我们将此服务称为 deployer。为此,我已将主机中的 /var/run/docker.sock 文件安装到该 deployer 容器中。

因此,当在 deployer 容器中执行 docker run hello-world 时,host 会运行它。 这个系统按预期工作,除了我现在不确定的一件事,因为我看到了一些意想不到的行为。

在执行docker run -v "/path/to/src:/path/to/dest" hello-world 时,Docker 会查看哪个文件夹? 我看到了两个有效的理由:

  • A) 它会将/path/to/src部署器 内挂载到 hello-world 容器,因为它是执行 命令。
  • B) 它将把/path/to/src 挂载到 hello-world 容器,因为 docker.sock 确定上下文 并且命令正在主机上运行。

哪些是正确的?
此外,当使用相对路径时(例如在 docker-compose 中),正在使用的路径是什么?

【问题讨论】:

    标签: docker unix docker-volume


    【解决方案1】:

    它将始终使用主机文件系统。没有办法将一个容器的文件系统直接挂载到另一个容器中。

    例如:

    host$ sudo docker run --rm -it -v /var/run/docker.sock:/var/run/docker.sock docker sh
    0123456789ab# docker run -v /:/host --rm -it busybox sh
    13579bdf0246# cat /host/etc/shadow
    

    最后一个命令将打印出主机的加密密码文件,而不是中间容器中的任何内容。

    如果从示例中看不出来,挂载 Docker 套接字以编程方式运行 Docker 命令会产生巨大的安全隐患,您应该仔细考虑它是否真的适合您。

    我很确定 docker-compose.yml 中的相对路径实际上不适用于此设置(因为您无法从中间容器绑定挂载内容)。您必须将相同的内容安装到两个容器中,一个才能将文件发送到另一个容器。在这里使用命名卷会很有帮助(因为卷名实际上并不依赖于主机路径);根据您的具体操作,docker createdocker cp 的迂回路径可以工作。

    在实现层面,只有一个 Docker 守护进程,它在主机上运行。您可以将其套接字发布到各个地方,但最终该守护进程会收到诸如“创建一个挂载主机目录 /x/y 的容器”之类的请求,并且守护进程会在主机上下文中解释这些请求。它不知道请求来自不同的容器(或者,可能来自不同的主机;但请参阅上文关于安全问题的内容)。

    【讨论】:

      猜你喜欢
      • 2019-08-14
      • 2020-11-22
      • 1970-01-01
      • 2019-08-23
      • 2018-06-28
      • 2019-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多