2016-08-17 141 views
0

我有6个微服务包装在码头集装箱中。在每个swarm节点上,我已经安装了consul代理,绑定到主机ip,并且客户端处于0.0.0.0模式。 所有微服务都在Docker-compose文件中,我从Swarm管理器运行。 微服务是用Java编写的,在bootstrap.yml中我必须指定consul代理端点。可能的选择是:Docker swarm,Consul和Spring Boot

  • 本地主机
  • $ {} HOSTIP环境变量

问题: - 本地主机不是主机的本地主机,但集装箱本地主机,而我没有领事代理人容器localhost但主机。 - 撰写文件中的$ {HOSTIP}我必须提供这个env var。但是,我不知道Swarm MAnager会在哪里安排微服务启动,所以我不知道将使用哪个IP地址。

我试图暴露每个节点上的主机IP地址,但由于我正在运行从管理器撰写,它不会读取此变量。

你有什么建议如何解决这个问题吗?我有领事集群,3个经理和3个节点。在每个经理和节点上,我已经开始领事代理(作为码头集装箱)。无论我使用何种类型的网络,我都无法启动微服务。我开始担任--net = host和--net = bridge,但这不起作用。

有没有人有一些想法? 提前致谢。

+0

[This reading](http://blog.nimbleci.com/2016/08/17/how设置和部署到一个1000节点的码头群/)可能会帮助你。 [这也是](http://stackoverflow.com/questions/34365604/how-to-create-docker-overlay-network-between-multi-hosts/34434948#34434948)。 – Auzias

+0

签出v1.12中的新Docker Engine群集功能。现在内置了服务发现功能,这意味着您可能不再需要使用consul来跟踪容器实例。 https://docs.docker.com/engine/swarm/。我还可以推荐以下详细说明如何将负载平衡器与新群集模式集成:https://technologyconversations.com/2016/08/01/integrating-proxy-with-docker-swarm-tour-around-docker-1 -12-series/ –

回答

0

所以你也在容器中运行领事,对不对?在你的设置中可以链接容器吗?所以你可以在每个主机上启动consul容器作为“consul”,并将你的微服务与它联系起来。链接的容器可以获得主机条目,因此可以从服务中的“consul:8500”处获得领事服务。 编辑:如果您使用的是Hashicorp官方的Consul Docker镜像,则可以将客户端地址配置为0.0.0.0,这可以使Consul API可用于主机上运行的其他容器。

+0

我在码头集装箱运行领事,所有主机上都有官方图片。客户端地址设置为0.0.0.0。另外,我正在运行领事与国旗 - 网络=主机。在撰写文件中,有5个容器。链接不起作用,因为领事在主机网络上,但容器在覆盖网络中启动。我也尝试过桥梁网络,但它不工作。 –

+0

确实,不允许同时链接和--net = host。使用Hashicorp的官方图像,您可以使用一些环境变量。这个变体适用于我:'docker run -d -e CONSUL_CLIENT_INTERFACE = docker0 -e CONSUL_BIND_INTERFACE = lo --net = host consul agent' - 这将客户端接口和API绑定到Docker桥接口(标准为172.17.0.1现在),我可以通过这个IP从另一个容器通过卷发来打电话给代理人 – kgorskowski

+0

简直不能工作。 Consul在本地主机上启动,但由于Java应用程序在容器中,而consul endopoint是localhost,它只是不知道从VM使用localhost,而不是从容器中使用localhost。 –

0

让我回答我自己的问题:这不是我们想要这样做的一种方式,我的意思是,我们不能在Swarm中放置一些东西,并且期望它可以工作。它不会。领事作为服务发现也不能在Swarm之外使用。简单的答案是使用Docker Orchestration和Service discovery,而不涉及Consul。如果有人使用Swarm,一切应该在覆盖网络(兔,redis,麋鹿等)...

+0

当你说“这不是我们想要做到这一点的方式”时,你是在谈论OP要求什么或者在回答中说什么kgorskowski?你可以请[编辑]你的答案并澄清它?谢谢! –