繁体   English   中英

在负载均衡器后面滚动部署Docker容器

[英]rolling deployment for docker containers behind load balancer

我在负载均衡器后面滚动部署Docker容器时遇到问题。

这是我的docker撰写yml文件的内容。

nginx:
    image: nginx_image
    links:
        - node1:node1
        - node2:node2
        - node3:node3
    ports:
        - "80:80"
node1:
    image: nodeapi_image
    ports:
        - "8001"
node2:
    image: nodeapi_image
    ports:
        - "8001"
node3:
    image: nodeapi_image
    ports:
        - "8001"

这是我的nginx.conf

worker_processes 4;

events { worker_connections 1024; }

http {

  upstream node-app {
        least_conn;
        server node1:8001 weight=10 max_fails=3 fail_timeout=30s;
        server node2:8001 weight=10 max_fails=3 fail_timeout=30s;
        server node3:8001 weight=10 max_fails=3 fail_timeout=30s;
  }

  server {
        listen 80;
        listen 443 ssl;

        # ssl    on;
        ssl_certificate     /etc/nginx/ssl/imago.io.chain.crt;
        ssl_certificate_key /etc/nginx/ssl/imago.io.key;

        location / {
          proxy_pass http://node-app;
          proxy_http_version 1.1;
          proxy_set_header Upgrade $http_upgrade;
          proxy_set_header Connection 'upgrade';
          proxy_set_header Host $host;
          proxy_cache_bypass $http_upgrade;
        }
  }
}

如果我要部署一个新的构建映像,则必须停止节点容器,将其删除并使用新映像重新创建它。 这里的问题是,新容器将获得一个新IP,而nginx容器不知道该新IP,因此,如果我在最后一个容器中重新创建负载平衡器后重新创建了3个容器,则该应用将不再提供服务,因为所有IP在nginx机器中, /etc/hosts和环境变量不再是最新的。

我可以SSH进入每个容器,通过从git repo中提取更新其代码,然后重新启动该过程,但这对我来说似乎是错误的。 什么是正确的方法?

有一个更简单的方法可以做到这一点,以以下docker-compose.yml文件为例:

lb:
    image: tutum/haproxy
    links:
        - app
    ports:
        - "80:80"
app:
    image: tutum/hello-world

该docker compose文件描述了两项服务:

  • lb:使用tutum / haproxy图像的负载均衡器
  • 应用程序:在端口80上侦听的示例Webapp

如果您使用docker-compose up -d天真地启动这些服务,最终将只有2个容器(负载均衡器和Web应用程序)。

但是,如果您运行docker-compose scale app=3然后再次运行docker-compose up -d ,最终将得到4个负载平衡的容器。

这里的关键角色是tutum/haproxy映像,它能够发现链接到的不同容器。


一种类似的解决方案是使用Jason Wilder的nginx-proxy图像,该图像具有实时发现新节点的优势。 因此您不必重新启动lb服务。

lb:
    image: jwilder/nginx-proxy
    volumes:
        - /var/run/docker.sock:/tmp/docker.sock:ro
    ports:
        - "80:80"
app:
    image: tutum/hello-world
    environment:
        VIRTUAL_HOST: www.mysite.com

必须将VIRTUAL_HOST环境变量设置为可解析为Docker主机IP地址的域名。


另一个是使用Traefik

lb:
  image: traefik
  command: --docker
  ports:
    - "80:80"
  volumes:
    - /var/run/docker.sock:/var/run/docker.sock

app:
  image: tutum/hello-world
  labels:
    traefik.frontend.rule: Host:www.mysite.com

traefik.frontend.rule标签必须将Traefik规则集定义为解析为您的Docker主机IP地址的域名。

Traefik还提供不同的负载平衡策略断路器

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM