通过docker容器访问主机

Vaa*_*anz 2 docker

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

Sam*_*Toh 5

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

正如 Paul 所说,docker 容器是用于运行应用程序的独立环境,与主机环境隔离。

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

我想这也是出于安全原因而设计的,因为您不希望恶意容器在主机上执行诸如格式化磁盘之类的邪恶命令。

回到问题。

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

  1. Unix 域套接字
  2. 体积
  3. 网络套接字,例如 Restful 或 Web 服务

Unix 域套接字:

这个想法是让一个进程在充当服务器的主机上运行来侦听Unix domain socket. 然后容器将有一个客户端进程向其服务器请求资源。在这种情况下,资源可以是asking about diskspace.

该方法要求socket文件的文件路径*.sock在主机和容器之间可见,这可以通过使用命令来实现docker volume

优点: 解决方案是可扩展的,因为一旦构建了客户端-服务器程序,您就可以添加不同类型的请求。

缺点 构建应用程序可能需要一些时间。如果你问我的话,有点过分了。

体积方式

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

然后在容器中,您将有另一个 cron 作业来不断运行程序/脚本以获得parse结果df,并执行此后您需要执行的任何操作。

优点:
不像前一种解决方案那么昂贵,因为您不必编写小程序来读取和写入输出。

缺点: 可能很混乱或者无法扩展此解决方案以服务不同类型的资源。例如,从主机的外壳运行程序。

RESTFUL / Web服务方式

与该方法也非常相似,unix domain socket但这里讨论的是 HTTP。您仍然以不同的方式编写客户端/服务器程序。然而,它比第一种策略更麻烦,因为你需要额外的步骤来查找docker0网络接口的IP地址。这样您就可以知道容器如何连接到host.

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

缺点:开发成本高。对于你的用例来说可能超级大材小用。

结论

我可能就顺着docker volume路走吧。

有一个 cron 作业来运行一个简单的 shell 脚本来运行df,处理其输出,然后将“TRUE”或“FALSE”关键字写入文件。

然后,只需在cat该文件的容器内放置另一个 shell 脚本,即可确定在需要关键字时是否触发某些其他脚本。