gpt4 book ai didi

node.js - 与 docker swarm 的粘性 session

转载 作者:行者123 更新时间:2023-12-04 15:49:38 24 4
gpt4 key购买 nike

我有一个使用 socket.io 的 dockerized node.js 应用

通过 docker compose,我在同一台服务器上的两个不同容器上为应用程序运行 2 个副本。然而,到达服务器的请求以循环方式分发。

有没有一种方法可以用来实现粘性 session ?

我的 docker-compose.yml 如下所示

version: '3'

services:
app:
ports:
- "3001:3001"
image: image
deploy:
replicas: 2

我使用 docker stack deploy 运行应用程序的两个副本

最佳答案

据我所知,有 3 种可能的变体可以在 Docker 或 Docker Swarm 上实现 session 亲和性。

<强>1。添加标签以建立粘性 session ,如果您使用的是 Docker 企业版,这是非常简单且正式的方法。

labels:
- "com.docker.lb.hosts=example.com"
- "com.docker.lb.sticky_session_cookie=session"
- "com.docker.lb.port=3001"

除非您购买了使用 Docker EE 的许可证,否则您需要使用以下两种方法之一。

<强>2。使用 Traefik 负载均衡器。让我们假设部署一个名为 app 的服务;容器部署在 192.168.0.1 和 192.168.0.2,它们是 Docker Swarm 中连接的 Node 。

version: "3.8"

services:
traefik:
image: traefik:v2.3
deploy:
mode: global
networks:
- traefik-net
command:
- "--log.level=DEBUG"
- "--api.insecure=true"
- "--providers.docker=true"
- "--providers.docker.exposedbydefault=false"
- "--entrypoints.app.address=:80"
ports:
- 3001:80
- 8080:8080
volumes:
- "/var/run/docker.sock:/var/run/docker.sock:ro"
app:
image: nginx
deploy:
replicas: 2
networks:
- traefik-net
labels:
- "traefik.enable=true"
- "traefik.http.routers.app.entrypoints=app"
- "traefik.http.routers.app.rule=Host(`192.168.0.1`) || Host(`192.168.0.2`)"
- "traefik.http.services.app-service.loadBalancer.sticky.cookie=true"
- "traefik.http.services.app-service.loadBalancer.sticky.cookie.name=app_cookie_name"
- "traefik.http.services.app-service.loadbalancer.server.port=80"

networks:
traefik-net:
external: true
name: traefik-net

<强>3。使用 Nginx 反向代理。假设容器将部署在 192.168.0.1 和 192.168.0.2 中,它们是 Docker Swarm 中连接的 Node 。

为了绕过路由网格,您需要使用一个副本部署两个服务(app1、app2),因为 Docker Swarm 的默认负载平衡方法是循环法。

version: "3.8"

services:
app1:
ports:
- "3001:3001"
image: image
deploy:
replicas: 1
app2:
ports:
- "3002:3001"
image: image
deploy:
replicas: 1

Nginx 配置:由于 Docker Swarm 使用路由网格(循环负载均衡器),因此您需要注册每一种方式来访问容器。

http {
upstream example {
ip_hash;
server 192.168.0.1:3001;
server 192.168.0.1:3002;
server 192.168.0.2:3001;
server 192.168.0.2:3002;
}

server {
listen 80;
server_name example.com;

location / {
proxy_pass http://example/;
}
}
}

关于node.js - 与 docker swarm 的粘性 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54403235/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com