【问题标题】:docker-compose scale with sticky sessions带有粘性会话的 docker-compose 规模
【发布时间】:2017-02-05 22:51:02
【问题描述】:

我有一个在生产中需要 websocket 连接的网络服务器。我使用 docker-compose 和 nginx 作为代理来部署它。 所以我的撰写文件看起来像这样:

version: '2'
services:
   app:
     restart: always

   nginx:
     restart: always
     ports:
       - "80:80"

现在,如果我将“app”服务扩展到多个实例,docker-compose 将在每次调用内部 dns“app”时执行 round robin

有没有办法告诉 docker-compose 负载均衡器应用粘性会话?

另一种解决方案 - 有没有办法使用 nginx 解决它?


我不喜欢的可能解决方案:

应用的多种定义

version: '2'
services:
   app1:
     restart: always

   app2:
     restart: always

   nginx:
     restart: always
     ports:
       - "80:80"

(然后在 nginx 配置文件中,我可以定义 app1 和 app2 之间的粘性会话)。


我从搜索中得到的最佳结果https://github.com/docker/dockercloud-haproxy

但这需要我添加另一个服务(也许替换 nginx?)并且文档对于那里的粘性会话非常差。

我希望 docker 只允许在撰写文件中使用简单的行来配置它。

谢谢!

【问题讨论】:

  • 有办法用 kubernetes 解决这个问题。
  • @Gabbax0r 谢谢!如果我用尽其他选项,我会尝试这样做,因为我的基础设施是基于 Docker Swarm

标签: nginx docker proxy docker-compose sticky-session


【解决方案1】:

看看jwilder/nginx-proxy。此映像提供了一个 nginx 反向代理,它侦听定义 VIRTUAL_HOST 变量的容器,并在容器创建和删除时自动更新其配置。 tpcwang 的 fork 允许您在容器级别使用 IP_HASH 指令来启用粘性会话。

考虑以下 Compose 文件:

nginx:
  image: tpcwang/nginx-proxy
  ports:
    - "80:80"
  volumes:
    - /var/run/docker.sock:/tmp/docker.sock:ro
app:
  image: tutum/hello-world
  environment:
    - VIRTUAL_HOST=<your_ip_or_domain_name>
    - USE_IP_HASH=1

让我们启动并运行它,然后将 app 扩展到三个实例:

docker-compose up -d
docker-compose scale app=3

如果您检查 nginx 配置文件,您会看到如下内容:

docker-compose exec nginx cat /etc/nginx/conf.d/default.conf

...
upstream 172.16.102.132 {
    ip_hash;
            # desktop_app_3
            server 172.17.0.7:80;
            # desktop_app_2
            server 172.17.0.6:80;
            # desktop_app_1
            server 172.17.0.4:80;
}
server {
    server_name 172.16.102.132;
    listen 80 ;
    access_log /var/log/nginx/access.log vhost;
    location / {
        proxy_pass http://172.16.102.132;
    }
}

nginx 容器已自动检测到这三个实例并已更新其配置以使用粘性会话将请求路由到所有实例。

如果我们尝试访问该应用,我们可以看到它在每次刷新时总是报告相同的主机名。如果我们删除 USE_IP_HASH 环境变量,我们会看到主机名实际上发生了变化,也就是说,nginx 代理正在使用循环来平衡我们的请求。

【讨论】:

  • 感谢您的回答!还应该提到 ip_hash 的唯一缺点;粘性会话。在开发环境中,客户端通常只是开发者框,所有请求都将到达同一个服务器节点。一个解决方案可能是在 docker conainers 中有一个客户端,缩放到与服务器缩放数量相同或更大的数量......
  • 如果你有 nginx 本身的副本怎么办?我正在尝试消除单点故障。
  • 在 docker 网络中使用带有 ip_hash 的 ngnix 粘性负载均衡器并不是一个好主意。 nginx 会将主机的内部 docker 网络地址视为传入地址,并且由于 ip_hash 使用传入连接的网络地址(而不是 IP 地址),因此无论有多少任务,每个连接都将重定向到目标服务的同一任务你已经并行运行了。
猜你喜欢
  • 2019-06-21
  • 2018-12-20
  • 2019-01-21
  • 2017-09-09
  • 1970-01-01
  • 1970-01-01
  • 2012-05-16
  • 1970-01-01
相关资源
最近更新 更多