我开发分布式系统,并考虑以下情况:
我的应用程序正在主机A上运行的docker中工作,我想从物理主机B上运行的其他服务(无docker)调用api。我可以调用IP或DNS地址吗?
与上述问题有关的其他情况:
我使用docker-compose在本地开发分布式系统,并定义了以下服务:ServiceA,ServiceB等。如果ServiceA必须在端口8080上调用ServiceB,则可以调用http://ServiceB:8080/
,它可以正常工作。在生产中,每个服务应在具有不同IP的不同主机上工作。那么,我将在不同的主机上运行每个服务并通过http://<IP_of_ServiceB>:8080
而不是使用服务名从ServiceA调用到ServiceB的好方法吗?
最佳答案
您可能会发现有用的一个基础架构部分是服务注册表,它知道哪些主机正在运行哪些服务。它们通常提供DNS服务,因此您可以通过服务的“主机名”引用服务,并将其路由到运行该服务的实际主机。这里的想法是通过(可能是人为的)主机名引用Docker服务和非Docker服务,并且基础结构层将其路由到正确的主机。除了Kubernetes选项之外,除了指向正确的DNS服务器之外,这些不需要特殊的网络设置。
我之前使用过的三个具体示例:
servicename.service.consul
之类的主机名将解析为运行该服务的主机的IP地址,然后您可以使用该服务的端口引用诸如http://servicename.service.consul:9123/
之类的URL。 (我相信您可以在definition中覆盖服务的地址,以将其指向外部服务器。)servicename.default.svc.cluster.local
之类的主机名,但是大多数主机名也会出现在默认的DNS搜索路径中,因此http://servicename/
通常是一个很好的URL。 (您可以配置ExternalName
服务,该服务只是指向集群外部的DNS记录。)关于docker - 从在主机B上运行的Docker连接到主机A,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53144666/