如何在docker中快速故障转移nginx上游容器(蓝/绿部署)

时间:2016-09-01 15:32:02

标签: node.js nginx docker deployment docker-cloud

当其中一个上游容器发生故障时,如何让dockerized nginx快速进行故障转移?故障转移在非docker环境中似乎是即时的,但是当dockerized时,有几个请求超时。

我在同一节点应用程序的两个实例前面的单个节点/ vm上使用nginx作为负载均衡器/代理。我想象新版本的部署如下(通常称为blue-green deployments):

  1. 推送到github的新版节点应用
  2. Docker hub构建新图像
  3. 其中一个上游容器已被拆除,升级和重新部署
  4. 随着其中一个容器被拆除,nginx会自动故障转移到另一个活动容器
  5. 部署升级后的容器后,另一个容器也将脱机升级/重新部署
  6. 然而,在nginx上并没有无缝地做#4。当我取下其中一个上游容器以进行版本修改时,nginx将超时几个请求(以循环方式),因为它会发现其中一个容器已关闭。我没有在非docker环境中发生这种情况。

    这是我的docker云堆文件:

    load-balancer:
      image: 'foo/load-balancer:latest'
      links:
        - node-blue
        - node-green
      ports:
        - '80:80'
    node-blue:
      image: 'foo/node-app:latest'
    node-green:
      image: 'foo/node-app:latest'
    

    nginx.conf看起来像:

    events {
      worker_connections  1024;
    }
    
    http {
      gzip on;
    
      upstream app {
        server node-green;
        server node-blue;
      }
    
      server {
        listen 80;
        server_name app.local;
        location / {
            proxy_pass http://app;
        }
      }
    }
    

1 个答案:

答案 0 :(得分:1)

经过一番摔跤后,我想我出来了一个合理的解决方案。交换了dockercloud/haproxy的自定义nginx容器。显然负载均衡器需要能够收听docker cloud events,并相应地进行调整。

堆栈文件现在看起来像:

load-balancer:
  image: 'dockercloud/haproxy:1.5.3'
  restart: always
  roles:
    - global
  links:
    - node-blue
  ports:
    - '80:80'
node-blue:
  image: 'foo/node-app:latest'
  environment:
    - VIRTUAL_HOST=app.local
node-green:
  image: 'foo/node-app:latest'
  environment:
    - VIRTUAL_HOST=app.local

当我想部署新版本时,我只需运行以下脚本:

docker-cloud service set --link node-green:node-green load-balancer
docker-cloud service redeploy node-blue --sync
docker-cloud service set --link node-blue:node-blue load-balancer
docker-cloud service redeploy node-green --sync