我在负载均衡器后面滚动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中提取并重新启动进程来更新代码,但这对我来说似乎是错误的。这样做的正确方法是什么?
答案 0 :(得分:3)
有一种更简单的方法可以实现此目的,以下面的 docker-compose.yml 文件为例:
lb:
image: tutum/haproxy
links:
- app
ports:
- "80:80"
app:
image: tutum/hello-world
此docker撰写文件描述了两个服务:
如果您使用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 strategies和circuit breakers。