如何保持与docker群粘性会话(会话持久性)?

我有一个基于Java的web应用程序部署在jboss-10.1.0(wildfly) 。 我使用docker群模式(docker版本1.12.1 )来扩展我的应用程序一切正常,但我唯一面临的问题是会话pipe理。

现在让我们来看看情况。

我有两个实例正在运行我的应用程序(即App1App2 )。我使用默认的负载平衡器提供的docker swarm模式与nginxredirect我的应用程序从chintan.test.com:9080 chintan.test.com:80所以我不需要用我的url写下端口,我可以直接访问这个urlchintan.test.com

现在默认的负载平衡器使用RR( Round-Robin algorithm )来为我的web请求服务。所以我第一次访问chintan.test.com它去App1实例和显示login页面我凭证login,一切都完美后分钟它切换到App2 ,再次login页面来。

有什么办法或工具(应该是开源的)通过我处理会议? 所以至less我login到App1并坚持到App1直到我注销。

谢谢!

Docker swarm目前不支持粘性会话,循环是通过其暴露的端口来访问服务的唯一方法。

要实现粘性会话,您需要在Docker内部实现一个支持粘性会话的反向代理,并通过它们的容器标识直接与容器通信(而不是在服务名称上进行DNS查找,再次进行循环加载平衡器)。 实现负载均衡器还需要您实现自己的服务发现工具,以便知道哪些容器可用。

尝试使用Nginx和HA代理,但没有一个似乎在SWARM模式下工作。 然后,我在Docker Swarm中使用了Traefik,它为我做了个窍门。唯一的限制是Traefik应该在pipe理器节点上运行,因为它需要知道添加或删除的新工作器节点。 即使扩展服务,添加节点等,也不需要重新启动。

我已经testing了Docker组合版本3的configuration,这是最新的,并且使用Docker堆栈部署进行了部署 。 一步一步的指示在这里结束

首先,您需要创build一个docker-compose.yml(版本3)并添加负载平衡器Traefik Image。 这是它的样子

  loadbalancer: image: traefik command: --docker \ --docker.swarmmode \ --docker.watch \ --web \ --loglevel=DEBUG ports: - 80:80 - 9090:8080 volumes: - /var/run/docker.sock:/var/run/docker.sock deploy: restart_policy: condition: any mode: replicated replicas: 1 update_config: delay: 2s placement: constraints: [node.role == manager] 

然后你需要会话粘性的图像

 whoami: image: tutum/hello-world networks: - net ports: - "80" deploy: restart_policy: condition: any mode: replicated replicas: 5 placement: constraints: [node.role == worker] update_config: delay: 2s labels: - "traefik.docker.network=test_net" - "traefik.port=80" - "traefik.frontend.rule=PathPrefix:/hello;" - "traefik.backend.loadbalancer.sticky=true" 

您可以按照此链接进行详细解释。