Deployment 负载平衡器后面docker容器的滚动部署
我在负载平衡器后面滚动部署docker容器时遇到问题 这是我的docker compose yml文件内容Deployment 负载平衡器后面docker容器的滚动部署,deployment,docker,docker-compose,Deployment,Docker,Docker Compose,我在负载平衡器后面滚动部署docker容器时遇到问题 这是我的docker compose yml文件内容 nginx: image: nginx_image links: - node1:node1 - node2:node2 - node3:node3 ports: - "80:80" node1: image: nodeapi_image ports: - "8001"
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个容器,应用程序将不再提供服务,因为nginx机器/etc/hosts
和环境变量中的所有IP都不再是最新的
我可以用SSH连接到每个容器,通过从git repo中提取代码来更新其代码,然后重新启动该过程,但这对我来说似乎是错误的。正确的方法是什么 有一种更简单的方法可以实现这一点,以下面的docker-compose.yml文件为例:
lb:
图片:tutum/haproxy
链接:
-应用程序
端口:
- "80:80"
应用程序:
图片:图腾/你好世界
此docker compose文件描述了两种服务:
- lb:使用映像的负载平衡器
- 应用程序:在端口80上侦听的示例webapp
docker compose up-d
开始这些服务,那么你最终只会得到两个容器(负载均衡器和web应用程序)
但是如果您运行docker compose scale app=3
,然后再次运行docker compose up-d
,您将得到4个负载平衡的容器
这里的关键角色是tutum/haproxy
docker图像,它能够发现它链接到的不同容器
一个类似的解决方案是使用图像,该图像具有发现新节点的优点;因此,您不必重新启动
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\u HOST
环境变量必须设置为解析为docker主机IP地址的域名
另一个是使用
traefik.frontend.rule
标签必须为解析为docker主机IP地址的域名定义一个集合
Traefik还提供不同的和。我明白了。虽然我喜欢你的答案,但似乎tutum/haproxy容器只有在使用tutum的情况下才能工作。另一种方法看起来不错,我会试一试。与此同时,我编写了一些代码,通过更新loadbalancer上的/etc/hosts来实现这一目的,并在完成后重新加载nginx或haproxy。不同之处在于,只有托管在tutum托管服务上时,它才会实时更新。您只需运行
docker compose up-d lb
,负载平衡器容器将被重新创建,并会注意到新的应用程序容器OK,但这与在不停机的情况下运行部署的目的背道而驰。它基本上等于杀死一切并重新创建它。是的,它确实存在,短暂的停机时间,但仍然是停机时间。如果您将解决方案与jwilder/nginx proxy
一起使用,那么就没有停机时间了。我在这里有一个类似的问题:您知道如何处理这个问题吗?非常感谢。
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