[英]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文件描述了兩項服務:
如果您使用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地址的域名。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.