Ahm*_*azy 4 node.js docker docker-compose docker-swarm sticky-session
我有一个使用 socket.io 的 dockerized node.js 应用程序
通过 docker compose,我在同一服务器上的两个不同容器上运行该应用程序的 2 个副本。然而,到达服务器的请求是以循环方式分发的。
有没有一种方法可以用来实现粘性会话?
我的 docker-compose.yml 如下所示
version: '3'
services:
app:
ports:
- "3001:3001"
image: image
deploy:
replicas: 2
Run Code Online (Sandbox Code Playgroud)
我使用 docker stack 部署来运行应用程序的两个副本
据我了解,在 Docker 或 Docker Swarm 上实现会话关联有 3 种可能的变体。
1. 添加标签来建立粘性会话,如果您使用的是 Docker 企业版,这是非常简单且官方的方法。
labels:
- "com.docker.lb.hosts=example.com"
- "com.docker.lb.sticky_session_cookie=session"
- "com.docker.lb.port=3001"
Run Code Online (Sandbox Code Playgroud)
除非您购买了使用 Docker EE 的许可证,否则您需要使用以下两种方法之一。
2.使用Traefik负载均衡器。让我们假设部署一个名为 app 的服务;容器部署在192.168.0.1和192.168.0.2,这是Docker Swarm中连接的节点。
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
Run Code Online (Sandbox Code Playgroud)
3.使用Nginx反向代理。假设容器将部署在 Docker Swarm 中连接的节点 192.168.0.1 和 192.168.0.2 中。
为了绕过路由网格,您需要使用一个副本部署两个服务(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
Run Code Online (Sandbox Code Playgroud)
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/;
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7988 次 |
| 最近记录: |