簡體   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