我该如何设置具有受限通信的Docker网络?

4

我正在尝试创建类似于这样的东西:

Docker Network Architecture

每个服务器容器都暴露了8080端口,可以接受来自客户端的请求,但是重要的是,它们不允许相互通信。
问题在于服务器容器是在客户端容器之后启动的,所以我不能像以前那样向客户端传递容器链接标志,因为它应该链接到的容器还不存在。
我一直在研究更新的Docker网络相关内容,但是我不能使用桥接,因为我不希望服务器之间进行交叉通信。此外,对于每个服务器使用一个桥接似乎不太可扩展,并且在客户端容器中管理起来会很困难。
是否有一种类似于开关的Docker结构可以实现这一点?

你能否再解释一下为什么不能使用链接? - Héctor Valverde
我无法使用链接,因为服务器在客户端之后启动,所以我无法将客户端链接到尚不存在的服务器,因为链接信息是在启动时传递的,而且不能进行回溯链接(相关:https://dev59.com/4l8e5IYBdhLWcg3w0dJJ)。如果只有一个服务器和多个客户端,我可以将链接信息传递给客户端,但我想要相反的情况。 - Yousef Amar
我正在使用Dockerode通过Docker Remote API与Docker进行接口交互,但是对于通过命令行启动容器并使用标志的操作也是如此。目前我只是使用一个网络,但这并不理想,因为我不希望连接到该网络的服务器之间能够相互通信。我正在研究iptables规则。 - Yousef Amar
我不明白为什么你需要在服务器之前“启动”客户端容器。但是无论如何,你可以先创建容器,一旦服务器可用就启动它们。请注意,docker run命令是docker createdocker start命令的序列。 - Héctor Valverde
实际上,忽略我之前的说法,它也可以在创建时传递,但不幸的是这并没有帮助,因为服务器需要在客户端之后很长时间才能启动。 - Yousef Amar
显示剩余4条评论
2个回答

1

看起来你需要创建多个桥接网络,每个容器一个。为了简化这个过程,你可能想使用 docker-compose 来指定如何提供网络和容器,并让 docker-compose 工具正确地将它们连接起来。

资源:


另外需要注意的一点:我认为暴露的端口对所有网络都是可访问的。如果是这样的话,您可以将所有服务器网络设置为“无”,并依靠暴露的端口来访问服务器。


0

希望这与您的用例相关 - 我试图从图表和注释中获取有关您实际应用程序的上下文。我建议您选择服务发现路线。它可能涉及一些简单的 API,通过一个中央存储(例如 Redis 或 SkyDNS)来实现,但从长远来看会使事情变得简单。

例如,Kubernetes 使用 SkyDNS 来使用 DNS 进行操作。归根结底,您选择的任何编排工具都很可能在开箱即用时执行此类操作:https://github.com/kubernetes/kubernetes/tree/master/cluster/addons/dns

这个想法很简单:

  • 使用一个 DNS 容器来保留新生成服务器的条目
  • 允许客户端容器查询服务器列表。例如,想象一下 DNS 响应,其中包含一堆server-<<ISO 时间戳>>
  • 禁止客户端容器读取此 DNS(如何管理此权限配置而不进行间接处理,即不通过允许写入 DNS 容器但不允许读取的端点进行代理,是非常奇特的)
额外奖励:我刚意识到你可以使用类似Redis的简单设置来完成这个任务,而DNS可能只是过度设计了 :)

这怎么防止服务器彼此通信?我不想你会通过DNS容器代理所有的流量吧?为什么一个服务器不能自己扫描其他服务器呢? - Yousef Amar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接