[英]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.