如何通过从docker容器运行命令来访问主机?我需要访问主机,以便检查我的docker容器和图像的空间使用情况。
答案 0 :(得分:2)
如果您希望有一个运行任务的容器来监控您的Docker主机系统使用情况等等,那么您应该看一下https://prometheus.io/ https://github.com/prometheus/node_exporter。
节点导出器容器从挂载的Docker主机获取procfs和sysfs,因此能够监视主机指标。
-v "/proc:/host/proc:ro" \
-v "/sys:/host/sys:ro" \
答案 1 :(得分:2)
这个问题基本上是一个"如何从docker容器的主机中获取数据"。
与Paul所说的一样,docker容器是用于运行与主机环境隔离的应用程序的独立环境。
与虚拟机类似但更轻量级。因此,容器无意直接向主机执行shell命令。
我想这也是出于安全考虑而设计的,因为你不希望恶意容器在主机上执行恶意命令,比如格式化磁盘。
回到问题。
从根本上说,这些是容器可以从其主机访问数据的标准方式;
Unix域套接字:
这个想法是让主机上的进程充当服务器以监听Unix domain socket
。然后容器将有一个客户端进程从其服务器请求资源。在这种情况下,资源可以是asking about diskspace
。
此方法要求*.sock
套接字文件的文件路径在主机和容器之间可见,这可以通过使用docker volume
命令来实现。
优势: 解决方案是可扩展的,因为您可以在构建客户端 - 服务器程序后添加不同类型的请求。
缺点 可能需要一些时间来构建应用程序。如果你问我,有点矫枉过正。
音量方式
您将filepath
从主机挂载到容器。然后创建一个快速而脏的shell脚本,将df
的结果写入文件并将其放在共享目录区域中。
然后在容器中,您将有另一个cron作业来不断地运行程序/脚本parse
df
结果,然后执行您需要做的任何事情。
优势:
不像以前的解决方案那么昂贵,因为您不必编写小程序来读写输出。
缺点: 可能是凌乱或不可能扩展此解决方案以服务于不同类型的资源。例如。从主机shell运行程序。
RESTFUL / Web服务方式
与unix domain socket
方法非常相似,但你在这里谈论HTTP。您仍然以不同的方式编写客户端/服务器程序。然而,它比第一个策略更麻烦,因为您需要额外的步骤来查找docker0
网络接口的IP地址。这样您就知道容器如何连接到host
。
优势: 扩展。 您可以使用此程序来控制部署REST服务器的任何远程主机。
缺点: 开发费用昂贵。对你的用例来说可能超级矫枉过正。
<强>结论强>
我可能只是采用docker volume
方式。
有一个cron作业来运行一个简单的shell脚本来运行df
,处理它的输出并写下&#34; TRUE&#34;或者&#34; FALSE&#34;该文件的关键字。
然后在容器中有另一个shell脚本到cat
该文件,以确定在预期关键字时是否触发其他脚本。
答案 2 :(得分:1)
如果在容器中安装ssh客户端,并在主机上安装sshd服务器,则可以从容器ssh到主机以执行命令。为避免输入密码,例如要自动运行脚本,请使用ssh密钥。
据我所知,docker没有提供从容器中执行主机上下文命令的方法。 docker的重点是包含容器,而不是让它们在主机上执行命令。
相反更容易。您可以使用docker exec