Docker 为停靠领事计算服务的IP地址

Docker 为停靠领事计算服务的IP地址,docker,kubernetes,consul,Docker,Kubernetes,Consul,我正在构建一个基于microservices的应用程序,并希望使用concur作为服务注册中心。总而言之,我有三种情况: 所有服务都在主机上运行 所有服务都在主机上运行,但concur在Docker中运行 所有服务和领事都在Docker中运行 现在我遇到了如何使用IP地址注册服务的问题,因为我需要计算出他们的IP地址,以便领事可以访问(例如,用于健康检查): 如果所有操作都在同一台主机上运行,那就很容易了:只需使用127.0.0.1,就完成了 如果所有的东西(包括concur)都在Dock

我正在构建一个基于microservices的应用程序,并希望使用concur作为服务注册中心。总而言之,我有三种情况:

  • 所有服务都在主机上运行
  • 所有服务都在主机上运行,但concur在Docker中运行
  • 所有服务和领事都在Docker中运行
现在我遇到了如何使用IP地址注册服务的问题,因为我需要计算出他们的IP地址,以便领事可以访问(例如,用于健康检查):

  • 如果所有操作都在同一台主机上运行,那就很容易了:只需使用
    127.0.0.1
    ,就完成了
  • 如果所有的东西(包括concur)都在Docker中运行,我可以使用Docker容器中的
    hostname-I
    来计算它们的外部IP并将其交给concur。这是可行的,但我想知道是否有更好的方法来解决这个问题?(理想情况下,解决方案也应该以同样的方式在Kubernetes上工作。)
  • 如果服务在主机上运行,而领事在Docker中运行,那么现在我完全不知道。基本上,concur需要主机的IP地址才能与服务通信,但我只能从concur容器中检测到这一点(通过解析
    host.docker.internal
    )。但首先,这不适用于外部,其次,它只适用于Docker for Mac/Windows,而不适用于Kubernetes
我如何解决这些问题


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
在开发者桌面环境中。您需要确保这是可配置的,最直接的方式是通过环境变量