我有一个Web服务器,需要生产中的websocket连接。 我使用docker-compose和nginx作为代理部署它。 所以我的撰写文件看起来像这样:
version: '2' services: app: restart: always nginx: restart: always ports: - "80:80"
现在,如果我将“app”服务扩展到多个实例,docker-compose将在每次调用内部dns“app”时执行循环 。
有没有办法告诉docker组成负载均衡器应用粘滞会话?
另一个解决scheme – 有没有办法使用nginx来解决它?
可能的解决scheme,我不喜欢:
应用的多重定义
version: '2' services: app1: restart: always app2: restart: always nginx: restart: always ports: - "80:80"
(然后在nginxconfiguration文件中,我可以定义app1和app2之间的粘性会话)。
我从search中得到最好的结果 : https : //github.com/docker/dockercloud-haproxy
但是这需要我添加另一个服务(也许replacenginx?),那里的粘性会话的文档是相当差的。
我希望docker工人可以在撰写文件中用简单的行来configuration它。
谢谢!
看看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代理正在使用循环法来平衡我们的请求。