docker - 是否可以从 Docker 容器启动 Docker 容器?
问题描述
...这样两个容器都在同一主机上运行,但不是容器内的容器?
长版
我制作了两个名为scheduler
and的 python 程序worker
。调度程序定期询问服务器是否有任何task
事情要做。如果有一些即将到来task
的scheduler
将下载输入数据并从worker
下载的数据开始。我现在正在考虑将这两个程序容器化。我在这里需要的包括:
- 为两个容器制作
Dockerfile
s。 - 两个容器应该共享一个公共卷(当然属于主机),输入数据在其中下载/使用。
- 调度程序容器应该能够启动工作容器,以便工作容器将在主机环境中运行,但不在调度程序容器内。
有没有简单的方法可以做到这一点?
解决方案
你可以,但你信任一个对主机具有不受限制的 root 访问权限的容器。
启动容器时要启动其他容器,需要绑定挂载主机的 Docker 套接字,通常使用
docker run -v /var/run/docker.sock:/var/run/docker.sock ...
Dockerfile 应该安装标准的 Docker CLI(或任何其他特定于语言的 Docker API),然后当它进行docker
调用时,它将完全像您从主机运行相同的 Docker 命令一样工作。特别是这意味着docker run -v
容器中的任何选项都使用主机的文件系统路径。这也意味着容器可以启动一个子容器来访问主机上的任何文件,甚至在系统目录中,例如/etc
,并且可以自由地检查任何其他正在运行的 Docker 容器的详细信息。
在您描述的架构中,更安全的路径是将“调度程序”和“工作人员”部分组合到一个容器中。它定期轮询服务器,如果有工作要做,就去做。如果你想一次做更多的工作,你可以启动这个容器的多个副本。这也让您可以轻松地限制您一次执行的并行工作量,因此您不会尝试在 4 核系统上同时执行不可能同时运行的一千个作业。
推荐阅读
- google-maps - 在颤动中区分谷歌地图上的用户拖动和animateCamera
- ansible - 我使用 sed 命令添加了多行,但它显示了一些错误
- windows - 有没有办法知道 Windows 屏幕显示是否更新/更改
- python - 为什么 subprocess.run 不会执行一个简单的命令?
- xamarin - 无法在 Xamarin 中使用 WifiNetworkSpecifier
- python - 使用 Python 从网站上抓取数据的麻烦
- html - 锚点在 Safari 和 Chrome 中不再起作用,但在 Firefox 中起作用
- json - 如何计算特定键在任意键大小的 json 列中出现在整个表中的次数
- c++ - 嵌套函数从外部范围继承值而不传递
- java - 在eclipse中读取ND2文件