Docker 为停靠领事计算服务的IP地址
我正在构建一个基于microservices的应用程序,并希望使用concur作为服务注册中心。总而言之,我有三种情况:Docker 为停靠领事计算服务的IP地址,docker,kubernetes,consul,Docker,Kubernetes,Consul,我正在构建一个基于microservices的应用程序,并希望使用concur作为服务注册中心。总而言之,我有三种情况: 所有服务都在主机上运行 所有服务都在主机上运行,但concur在Docker中运行 所有服务和领事都在Docker中运行 现在我遇到了如何使用IP地址注册服务的问题,因为我需要计算出他们的IP地址,以便领事可以访问(例如,用于健康检查): 如果所有操作都在同一台主机上运行,那就很容易了:只需使用127.0.0.1,就完成了 如果所有的东西(包括concur)都在Dock
- 所有服务都在主机上运行
- 所有服务都在主机上运行,但concur在Docker中运行
- 所有服务和领事都在Docker中运行
- 如果所有操作都在同一台主机上运行,那就很容易了:只需使用
,就完成了127.0.0.1
- 如果所有的东西(包括concur)都在Docker中运行,我可以使用Docker容器中的
来计算它们的外部IP并将其交给concur。这是可行的,但我想知道是否有更好的方法来解决这个问题?(理想情况下,解决方案也应该以同样的方式在Kubernetes上工作。)hostname-I
- 如果服务在主机上运行,而领事在Docker中运行,那么现在我完全不知道。基本上,concur需要主机的IP地址才能与服务通信,但我只能从concur容器中检测到这一点(通过解析
)。但首先,这不适用于外部,其次,它只适用于Docker for Mac/Windows,而不适用于Kuberneteshost.docker.internal
PS:我希望避免使用Gliderlabs的
registrator
这样的容器,因为我怀疑它在Kubernetes上的效果如何,而且它对混合Docker/host场景也没有帮助。如果您使用Kubernetes,您可以先检查它是否满足您的需要。通常没有直接的路径通过pod节点的主机IP地址到达pod,因此您描述的设置不会真正起作用。(我可能会考虑领事为一个关键/价值商店,但我不会达到它作为一个服务注册表在库伯内斯土地)< /P>
在普通的多主机Docker平台上,这是我发现的少数几种适合主机联网的情况之一。使用--net host
或Docker Compose或其他编排工具中的等效选项启动Consor。然后,Concur会认为“其”IP地址是主机的,如果您有对已知端口的自动TCP探测,您可以搜索主机上运行的每个服务,并发现端口3306上的MySQL服务,无论是在容器中运行还是在主机上本机运行
通过此设置,servicename.service.consul
将解析为某个物理主机IP地址。如果您有一个Docker容器指向它的DNS服务的当前主机,那么它将把服务路由到某个主机,可能是同一个主机,但这在过去对我来说是可靠的
请注意,在不同的环境中,相关主机名会有所不同:
servicename.service.concur
对于基于concur的设置,servicename.namespacename.svc.cluster.local
在Kubernetes中,可能是localhost
在开发者桌面环境中。您需要确保这是可配置的,最直接的方式是通过环境变量进行配置。如果您使用的是Kubernetes,您可以先检查它是否满足您的需要。通常没有直接的路径通过pod节点的主机IP地址到达pod,因此您描述的设置不会真正起作用。(我可能会考虑领事为一个关键/价值商店,但我不会达到它作为一个服务注册表在库伯内斯土地)< /P>
在普通的多主机Docker平台上,这是我发现的少数几种适合主机联网的情况之一。使用--net host
或Docker Compose或其他编排工具中的等效选项启动Consor。然后,Concur会认为“其”IP地址是主机的,如果您有对已知端口的自动TCP探测,您可以搜索主机上运行的每个服务,并发现端口3306上的MySQL服务,无论是在容器中运行还是在主机上本机运行
通过此设置,servicename.service.consul
将解析为某个物理主机IP地址。如果您有一个Docker容器指向它的DNS服务的当前主机,那么它将把服务路由到某个主机,可能是同一个主机,但这在过去对我来说是可靠的
请注意,在不同的环境中,相关主机名会有所不同:servicename.service.concur
对于基于concur的设置,servicename.namespacename.svc.cluster.local
在Kubernetes中,可能是localhost
在开发者桌面环境中。您需要确保这是可配置的,最直接的方式是通过环境变量