通过码头集装箱访问主机

问题描述:

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

+1

你的问题是类似于这一个:https://*.com/questions/32163955/how-to-run-shell-script-on-host-from-docker-container但接受的答案似乎是有缺陷的。 – Paul

+0

感谢您的回答。我会检查线程中提供的可能解决方案是否也适用于我的情况。 – Vaanz

这个问题基本上是“我怎样才能从码头集装箱的主机抓取数据”。

就像保罗所说,搬运工集装箱意思是用于运行应用程序的独立环境,从主机环境隔离。

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

我想这是专为安全起见,以及因为你不希望恶意的集装箱像格式化磁盘的主机上执行命令的邪恶。

回到问题。

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

  1. Unix域套接字
  2. 网络插座例如宁静或Web服务

Unix域套接字:

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

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

优势: 解决方案是可扩展的,你可以,一旦你已经建立了客户端 - 服务器程序的请求增添别样。

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

音量开到

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

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

优势:
还不如你不必写的小程序来读取和写入输出前一种方案一样昂贵。

缺点: 可能是肮脏的或不可能的扩展这个解决方案,服务于不同类型的资源。例如。从主机的shell运行程序。

RESTFUL/Web服务的方式

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

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

缺点: 昂贵的发展。可能对你的用例超级过度。

结论

我可能只是去docker volume方式。

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

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

+0

非常感谢你的详细解释。我会检查每种可能的解决方案,以提供更适合我的情况。 – Vaanz

+0

这是我们得到的更简单的解决方案。创建一个cron作业,监视磁盘使用情况并每隔几分钟将其存储在一个文件中,然后将该文件挂载到docker容器中。 – Vaanz

如果安装在容器中的ssh客户端和主机上的sshd服务器,您可以从容器ssh来执行命令的主机。为了避免输入密码,例如自动运行脚本,使用ssh键。

据我所知,搬运工不提供从容器主机上下文中执行的命令的装置。 docker的要点是包含容器,而不是让它们在主机上执行命令。

相反更容易。您可以通过使用docker exec

+0

我会检查我们是否也可以获得凭据,或者他们可以向我们提供用于SSH到主机的密钥。谢谢! – Vaanz

+0

也许如果你有一个想法,是否有一种方法来检查我的容器和码头容器中的图像的空间使用情况?尝试在码头集装箱内运行df -vha,但它只显示整个码头的总空间使用情况,包括我们不关心的图像。 – Vaanz

+0

@Vaanz您可以在每分钟运行df命令的主机上设置一个cron作业,然后使用'docker cp'将容器复制到容器中的文件中。 – Paul

输入来自主机的容器上下文如果你想有它运行的任务来监控您的码头工人主机系统的使用,更多的容器,你应该看看https://prometheus.io/https://github.com/prometheus/node_exporter

节点出口容器从安装在主机多克尔得到的procfs和sysfs中,并因此能够向监控主机的指标。

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

是的,我同意这个解决方案。它与访问主机通过安装主机路径相似。这是更直接的方式。 – Jared