负载均衡器后面的docker容器的滚动部署

时间:2015-08-18 15:07:18

标签: deployment docker docker-compose

我在负载均衡器后面滚动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中提取并重新启动进程来更新代码,但这对我来说似乎是错误的。这样做的正确方法是什么?

1 个答案:

答案 0 :(得分:3)

有一种更简单的方法可以实现此目的,以下面的 docker-compose.yml 文件为例:

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

此docker撰写文件描述了两个服务:

  • lb:使用tutum/haproxy图片
  • 的负载均衡器
  • app:一个示例webapp侦听端口80

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

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

这里的关键角色是tutum/haproxy泊坞窗图片,它能够发现与之链接的不同容器。

类似的解决方案是使用Jason Wilder's 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环境变量设置为解析为泊坞主机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 rule,并解析为泊坞主机的IP地址。

Traefik还提供了不同的load balancing strategiescircuit breakers