docker - 将 /var/run/docker.sock 挂载到容器中时,使用哪个文件系统进行卷挂载?
问题描述
我有一个容器,其中包含用于协调主机上微服务部署的逻辑 - 我们将此服务称为deployer。为此,我已将/var/run/docker.sock
主机中的文件挂载到该部署容器中。
因此,当docker run hello-world
从部署容器内执行时,主机 会运行它。这个系统按预期工作,除了我现在不确定的一件事,因为我看到了一些意想不到的行为。
执行时docker run -v "/path/to/src:/path/to/dest" hello-world
,Docker 会查看哪个文件夹?我看到两个有效的理由:
- A) 它将
/path/to/src
从部署程序内挂载到 hello-world 容器,因为它是执行命令的 shell。 - B)它将
/path/to/src
从源安装到 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 命令会产生巨大的安全隐患,您应该仔细考虑它是否真的适合您。
我很确定 in 中的相对路径docker-compose.yml
实际上不适用于此设置(因为您无法将内容绑定到中间容器之外)。您必须将相同的内容安装到两个容器中,一个容器才能将文件发送到另一个容器。在这里使用命名卷会很有帮助(因为卷名实际上并不依赖于主机路径);取决于你到底在做什么,一个迂回的路径docker create
然后docker cp
可以工作。
在实现层面,只有一个 Docker 守护进程,它在主机上运行。您可以将其套接字发布到各个地方,但最终该守护进程会收到诸如“创建一个挂载主机目录 /x/y 的容器”之类的请求,并且守护进程会在主机上下文中解释这些请求。它不知道请求来自不同的容器(或者,可能来自不同的主机;但请参阅上文关于安全问题的内容)。
推荐阅读
- python - 如何从 Github 运行这个 Python 项目?
- javascript - javascript intl 和缺少的乌尔都语巴基斯坦语言环境 ur-PK [Chrome]
- c++ - 如何用C++ QT获取鼠标坐标?
- django - 如何将我在 Pycharm 中创建的 django 应用程序切换到 Visual Studio Django Web 项目
- python - xarray.Dataset.to_zarr:“附加到现有 Zarr 商店”的文档?
- jquery - 如何在点击事件上立即显示 jquery css 效果?
- reactjs - Import React 语句语法错误创建问题
- javascript - 如何根据对象的值获取 id 并设置到另一个对象中 - javascript
- python - 在 Python 中使用 Jacobi 迭代计算马尔可夫链的平衡概率
- python - 如何获得第 3 列的长度?Python