将/var/run/docker.sock挂载到容器中时,使用哪个文件系统进行卷挂载?
When mounting /var/run/docker.sock into a container, which file system is used for volume mounting?
我有一个容器,其中包含用于协调主机上微服务部署的逻辑 - 我们将此服务称为 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) 它将从 deployer 中挂载
/path/to/src
到
hello-world 容器,因为那是 shell 执行
命令。
- B) 它将
/path/to/src
从 source 挂载到
hello-world 容器,因为 docker.sock
决定上下文
命令正在主机上 运行。
哪一个是正确的?
此外,当使用相对路径时(例如在 docker-compose 中),使用的路径是什么?
它将始终使用主机文件系统。没有办法直接将一个容器的文件系统挂载到另一个容器。
例如:
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
中的相对路径实际上不适用于此设置(因为你不能 bind-mount 从中间容器中取出东西)。您必须将相同的内容装载到两个容器中,一个容器才能将文件发送到另一个容器。在这里使用命名卷会很有帮助(因为卷名实际上并不依赖于主机路径);根据您的具体操作,docker create
然后 docker cp
的迂回路径可以工作。
在实现层面上只有一个 Docker 守护进程,它 运行 在主机上。您可以将其套接字发布到不同的地方,但最终该守护进程会收到诸如“创建一个装载主机目录的容器 /x/y”之类的请求,并且该守护进程会在主机的上下文中解释这些请求。它不知道请求来自不同的容器(或者可能来自不同的主机;但请参阅上面关于安全问题的内容)。
我有一个容器,其中包含用于协调主机上微服务部署的逻辑 - 我们将此服务称为 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) 它将从 deployer 中挂载
/path/to/src
到 hello-world 容器,因为那是 shell 执行 命令。 - B) 它将
/path/to/src
从 source 挂载到 hello-world 容器,因为docker.sock
决定上下文 命令正在主机上 运行。
哪一个是正确的?
此外,当使用相对路径时(例如在 docker-compose 中),使用的路径是什么?
它将始终使用主机文件系统。没有办法直接将一个容器的文件系统挂载到另一个容器。
例如:
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
中的相对路径实际上不适用于此设置(因为你不能 bind-mount 从中间容器中取出东西)。您必须将相同的内容装载到两个容器中,一个容器才能将文件发送到另一个容器。在这里使用命名卷会很有帮助(因为卷名实际上并不依赖于主机路径);根据您的具体操作,docker create
然后 docker cp
的迂回路径可以工作。
在实现层面上只有一个 Docker 守护进程,它 运行 在主机上。您可以将其套接字发布到不同的地方,但最终该守护进程会收到诸如“创建一个装载主机目录的容器 /x/y”之类的请求,并且该守护进程会在主机的上下文中解释这些请求。它不知道请求来自不同的容器(或者可能来自不同的主机;但请参阅上面关于安全问题的内容)。