Deployment 负载平衡器后面docker容器的滚动部署

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"

我在负载平衡器后面滚动部署docker容器时遇到问题

这是我的docker compose 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个容器,应用程序将不再提供服务,因为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