【问题标题】:Deploy Spring Cloud App into docker cluster using swarm使用 swarm 将 Spring Cloud App 部署到 docker 集群中
【发布时间】:2017-06-08 22:01:05
【问题描述】:

我知道这个问题听起来很含糊,但我会尝试解释我的问题陈述。

我有一个带有多个服务的 Spring 云应用程序(使用 Netflix Eureka 作为服务发现),它们部署在 docker 容器中,使用 docker compose 链接和旋转容器,在单个容器部署中一切正常,但问题是自动扩展单个服务/容器,即拥有单个服务的多个容器,因为我的容器与端口绑定,因此 docker-compose scale 将不起作用。

我在谷歌上搜索,发现我可以使用负载均衡器和旋转具有不同端口的容器来提供服务,但我不希望这样,因为事实上我正在使用客户端负载均衡。

有人可以建议我如何自动为服务旋转多个容器,同时记住容器可以使用它们的服务名称相互通信。

【问题讨论】:

  • 如果您使用的是 Eureka,为什么容器使用的端口甚至主机很重要?它将在 Eureka 注册并使用相同的服务名称,然后其他服务可以使用 Eureka 发现该服务的所有地址。
  • @RyanBaxter,你说得对,我们可以做到这一点,但我一直在寻找一种使用 docker-compose 和 swarm 实现这一目标的方法
  • 我知道如果你将容器链接在一起,链接容器的主机名将放在 hosts 文件中,但这不是 eureka 提供的服务发现。

标签: docker docker-compose spring-cloud


【解决方案1】:

回答我的问题可能对某人有帮助。

由于我使用的是 Spring Cloud,因此服务通过提供服务名称向 Eureka 注册自己,因此将公共端口绑定到容器没有意义,我在下面使用 docker-compose 文件来实现缩放,但是可能有更好的方法可以做到这一点,但现在它对我有用。

version: '2'
services:
 eureka:
  image: eureka
  container_name: eureka
  ports: 
  - "8761:8761"

zuul:
image: zuul
container_name: zuul
ports:
  - "8080"
depends_on:
  - eureka

webapp:
image: web-app
ports:
  - "6001"
depends_on:
  - eureka

writer:
image: writer
ports:
  - "7001"
depends_on:
  - eureka

recorder:
image: recorder
ports:
  - "9001"
depends_on:
  - eureka
  - mongodb

mongodb:
image: mongo:latest
command: mongod --noprealloc --smallfiles --dbpath /data/db --nojournal --oplogSize 16 --noauth
ports:
  - "27017:27017"
environment:
  TERM: xterm
volumes:
  - /home/user/data/mongo:/data/db

PS:上面的yaml没有格式化。

【讨论】:

  • 嗨@Apollo,有了这个更改,您可以使用web-app:6001 来从zuul 路由到网络应用程序吗?
  • @Tatha,上面的配置是链接docker容器,并支持在同一台机器上旋转多个容器,路由配置请参考github.com/akhil6095/Spring-cloud-app