通过docker容器访问主机

如何通过从docker容器运行命令来访问主机? 我需要访问主机,以便我可以检查我的docker容器和图像的空间使用情况。

这个问题基本上是“如何从Docker容器的主机中获取数据”。

就像Paul所说的那样,docker容器意味着独立运行一个应用程序的环境,与主机环境隔离。

类似于虚拟机,但更轻量级。 因此,容器并不意味着能够直接向主机执行shell命令。

我猜这是为了安全的原因而devise的,因为你不希望恶意容器在主机上执行恶意命令,如格式化磁盘。

回到问题。

从根本上说,这些几乎是容器可以从主机访问数据的标准方式;

  1. Unix域套接字
  2. networking套接字,例如Restful或Web服务

Unix域套接字:

这个想法是在作为服务器的主机上运行一个进程,在Unix domain socket上侦听。 然后,容器将有一个客户端进程从服务器请求资源。 在这种情况下,资源可能会asking about diskspace

此方法要求*.sock套接字文件的文件path在主机和容器之间可见,可以通过使用docker volume命令来实现。

优点:解决scheme是可扩展的,因为您可以在构build客户端 – 服务器程序后添加不同types的请求。

缺点可能需要一些时间来构build应用程序。 如果你问我,有点矫枉过正

卷的方式

您从主机安装文件filepath到容器。 然后,您创build一个快速而脏的shell脚本,将df的结果写入文件,并将其放在共享目录区域中。

然后在容器中,你将有另一个cron作业来运行一个程序/脚本不断地parse df结果,并做任何你需要做的事情之后。

优点:
不像以前的解决scheme那样昂贵,因为您不必编写小型程序来读取和写入输出。

缺点:可能混乱或不可能扩展这个解决scheme来服务不同types的资源。 例如,从主机的shell运行一个程序。

RESTFUL / Web服务方式

非常类似于unix domain socket方法,但是你在这里说HTTP。 你仍然以不同的方式写你的客户/服务器程序。 但是比第一种策略更麻烦,因为您需要额外的一步来查找docker0networking接口的IP地址。 这样可以知道容器如何连接到host

优点 :可扩展。 您可以使用此程序来控制部署REST服务器的任何远程主机。

缺点 :开发成本高。 可能对你的用例超级杀伤力。

结论

我可能只是去docker volume方式。

有一个cron作业来运行一个简单的shell脚本来运行df ,处理它的输出,并只是写“TRUE”或“FALSE”关键字的文件。

然后,只需在容器中有另一个shell脚本来cat该文件,以确定是否在预期关键字时触发其他脚本。

如果在容器中安装ssh客户端,并在主机上安装sshd服务器,则可以从容器ssh到主机执行命令。 为了避免input密码,例如要自动运行脚本,请使用ssh密钥。

据我所知,docker并没有提供从容器中执行主机上下文中的命令的方法。 docker的要点是包含容器,而不是让它们在主机上执行命令。

相反更容易。 您可以使用docker exec从主机input容器上下文

如果你想有一个运行任务的容器来监视你的Docker主机系统的使用情况,你应该看看https://prometheus.io/和https://github.com/prometheus/node_exporter

节点导出器容器从安装的Docker主机获取procfs和sysfs,因此能够监视主机度量标准。

  -v "/proc:/host/proc:ro" \ -v "/sys:/host/sys:ro" \