docker-compose scale with sticky sessions

时间:2016-09-28 06:15:34

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

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

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

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

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

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

另一个解决方案 - 是否有办法使用nginx解决它?

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

app的多个定义

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只允许在compose文件中使用简单的行进行配置。

谢谢!

1 个答案:

答案 0 :(得分:7)

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

考虑以下撰写文件:

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代理使用循环来平衡我们的请求。