在不使用Consul的情况下,在Docker中进行服务发现

6
我是docker和微服务的新手。我已经开始将我的Web应用程序分解为微服务,并且目前正在进行手动配置。
经过一些研究,我发现了Docker Swarm模式,它允许服务发现。此外,我还发现了其他用于服务发现的工具,如Eureka和Consul。
我的主要目标是将curl调用中的IP地址替换为服务名称,并在同一服务的多个实例之间进行负载平衡。
例如,从curl http://192.168.0.11:8080/ 到 curl http://my-service 我必须保持我的服务语言无关。
请建议,我是否需要使用Consul与Docker Swarm进行服务发现,或者我可以在没有Consul的情况下完成它?有什么优势?

你也可以使用 Etcd 或 Zookeeper。 - Matt Schuchard
3个回答

6

使用新的“swarm mode”,你可以使用docker 服务 在多个群集节点上创建集群服务。然后,您可以通过在请求中使用服务名称而不是节点名称来访问这些相同的负载均衡服务。

这仅适用于swarm覆盖网络内的节点。如果您的客户端系统是同一swarm的一部分,则发现应该可以直接使用,无需任何外部解决方案。

另一方面,如果您想要能够从swarm之外的系统中发现服务,则有几个选择:

  • 对于无状态服务,您可以使用docker的路由网格,它将使服务端口在所有swarm节点上都可用。这样,您只需要指向swarm中的任何节点,docker就会将您的请求定向到正在运行服务的节点(无论您访问的节点是否具有该服务)。
  • 如果您需要控制路由或处理不同状态,请在swarm服务前使用实际负载均衡器。这可以是另一个使用--mode global选项启动的docker服务(即haproxy、nginx),以确保它在所有节点上运行,也可以是单独的负载均衡器,如citrix netscaler。您需要让服务容器通过其启动脚本或通过配置工具重新配置LB,或手动添加它们。
  • 使用诸如consul之类的外部服务发现工具。可能还要与registrator一起自动添加服务。在此场景中,您只需配置外部客户端使用consul服务器/集群进行DNS解析(或使用API)。
你当然可以将服务消费者也移入到Swarm中。但是,如果你将客户端和服务分别放在不同的物理VLAN(或VPC等)中,那么你需要在不同的覆盖网络中启动客户端容器,以确保你不会有效地破坏已经存在的物理网络隔离。

谢谢@Jon。我将尝试“Swarm Mode”服务发现。 - prranay

1
自Docker 1.12版本起,服务发现(通过DNS)已经内置。当您创建自定义网络(如桥接或覆盖网络,如果您有多个主机),只要它们属于同一网络,您就可以让容器通过名称相互通信。您还可以为每个容器设置别名,这将轮询具有相同别名的容器列表。请参见简单示例:

https://linuxctl.com/docker-networking-options-bridge


0
只要您在docker网络中使用桥接模式并在该网络内创建容器,服务发现就可以直接使用。
一旦您的基础设施开始跨越多个服务器和分布在它们上面的微服务,您将需要从其他工具获得帮助。
Swarm是一个很好的起点,但是,如果涉及到任何IaaS提供商(如Amazon)的生产负载,我更愿意坚持使用consul。

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