通过码头集装箱访问主机
这个问题基本上是“我怎样才能从码头集装箱的主机抓取数据”。
就像保罗所说,搬运工集装箱意思是用于运行应用程序的独立环境,从主机环境隔离。
与虚拟机类似,但更轻量。因此,容器并不意味着有能力直接向主机执行shell命令。
我想这是专为安全起见,以及因为你不希望恶意的集装箱像格式化磁盘的主机上执行命令的邪恶。
回到问题。
从根本上说,这些都是非常标准的方式的容器可以访问它的主机的数据;
- Unix域套接字
- 卷
- 网络插座例如宁静或Web服务
Unix域套接字:
这个想法是有充当服务器侦听一个Unix domain socket
在主机上运行的进程。然后容器将有一个客户端进程来请求服务器的资源。在这种情况下,资源可以是asking about diskspace
。
该方法要求*.sock
插座文件的文件路径是在主机和容器,这可以通过使用docker volume
命令来实现之间可见。
优势: 解决方案是可扩展的,你可以,一旦你已经建立了客户端 - 服务器程序的请求增添别样。
缺点 可能需要一点时间来构建应用程序。如果你问我,有点矫枉过正。
音量开到
您从主机到容器装入filepath
。然后,您创建一个快速且脏的shell脚本,将df
的结果写入文件并将其放置在共享目录区域中。
然后在容器中,您将有另一个cron作业来运行一个程序/脚本不断地parse
df
结果,并做任何你需要做的事情之后。
优势:
还不如你不必写的小程序来读取和写入输出前一种方案一样昂贵。
缺点: 可能是肮脏的或不可能的扩展这个解决方案,服务于不同类型的资源。例如。从主机的shell运行程序。
RESTFUL/Web服务的方式
非常非常相似unix domain socket
方法太多,但你跟HTTP这里。您仍然以不同的方式编写客户端/服务器程序。然而,它比第一种策略更麻烦,因为您需要额外的步骤来查找网络接口的IP地址docker0
。这是为了让您知道容器如何连接到host
。
优点: 可扩展的。 您可以使用此程序来控制部署REST服务器的任何远程主机。
缺点: 昂贵的发展。可能对你的用例超级过度。
结论
我可能只是去docker volume
方式。
有一个cron作业来运行一个简单的shell脚本来运行df
,处理它的输出,并且只需在文件中写入“TRUE”或“FALSE”关键字。
然后,只需在容器中有另一个shell脚本,即cat
该文件,以确定是否在预期关键字时触发某些其他脚本。
如果安装在容器中的ssh客户端和主机上的sshd服务器,您可以从容器ssh来执行命令的主机。为了避免输入密码,例如自动运行脚本,使用ssh键。
据我所知,搬运工不提供从容器主机上下文中执行的命令的装置。 docker的要点是包含容器,而不是让它们在主机上执行命令。
相反更容易。您可以通过使用docker exec
输入来自主机的容器上下文如果你想有它运行的任务来监控您的码头工人主机系统的使用,更多的容器,你应该看看https://prometheus.io/与https://github.com/prometheus/node_exporter。
节点出口容器从安装在主机多克尔得到的procfs和sysfs中,并因此能够向监控主机的指标。
-v "/proc:/host/proc:ro" \
-v "/sys:/host/sys:ro" \
是的,我同意这个解决方案。它与访问主机通过安装主机路径相似。这是更直接的方式。 – Jared
你的问题是类似于这一个:https://stackoverflow.com/questions/32163955/how-to-run-shell-script-on-host-from-docker-container但接受的答案似乎是有缺陷的。 – Paul
感谢您的回答。我会检查线程中提供的可能解决方案是否也适用于我的情况。 – Vaanz