通过docker容器访问主机
如何通过从docker容器运行命令来访问主机? 我需要访问主机,以便我可以检查我的docker容器和图像的空间使用情况。
这个问题基本上是“如何从Docker容器的主机中获取数据”。
就像Paul所说的那样,docker容器意味着独立运行一个应用程序的环境,与主机环境隔离。
类似于虚拟机,但更轻量级。 因此,容器并不意味着能够直接向主机执行shell命令。
我猜这是为了安全的原因而devise的,因为你不希望恶意容器在主机上执行恶意命令,如格式化磁盘。
回到问题。
从根本上说,这些几乎是容器可以从主机访问数据的标准方式;
- Unix域套接字
- 卷
- 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。 你仍然以不同的方式写你的客户/服务器程序。 但是比第一种策略更麻烦,因为您需要额外的一步来查找docker0
networking接口的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" \