如果零停机时间容器更新有多个实例,docker-compose 网络别名如何工作?

Aug*_*ger 8 nginx docker docker-compose docker-networking

所以我有:

version: "3.6"

services:
  nginx:
    image: nginx
  app:
    image: node:latest
Run Code Online (Sandbox Code Playgroud)

我的 nginx 配置是:

upstream project_app {
  server app:4000;
}

server {
  listen 80;
  server_name example.com;

  location / {
    proxy_pass http://project_app;
  }

Run Code Online (Sandbox Code Playgroud)

为了在不停机的情况下更新容器(滚动更新),我首先将app服务升级到 2:

docker-compose up -d --no-deps --scale app=2 --no-recreate app
Run Code Online (Sandbox Code Playgroud)

它将project_app_1沿着project_app.

但是在这一步,即使新project_app_1容器准备好了,所有的流量也会流向project_app,前一个容器。

要同时使用它们,我需要运行docker-compose restart nginx.

现在,流量是到project_app和 的路由器project_app_1,这真的很酷。

我现在准备杀死现在已经project_app过时的。

我的问题是:

  • nginx 被杀死后是否需要再次重新启动,以确保所有流量都路由到project_app_1或者它有点自动?
  • 有效的事实http://app:4000是因为 DNS 主机名配置,对吗?在哪里可以了解更多信息?
  • 如果关闭发现在 nginx 中自动工作,是否有办法使启动发现也自动进行以避免重新启动 nginx,这会导致 2 秒的停机时间?

谢谢

PS:如果你对我使用的整个脚本感到好奇,我在相关的github问题上报告了它。

Aug*_*ger 2

所以我终于找到了更多这方面的信息。

  1. 当写入 时server app:4000;app 一个 DNS 条目,解析为多个实例。

  2. 无需重新启动 nginx 即可更新这些 DNS 条目。详细信息在这里:https://serverfault.com/a/916786/182596

这篇reddit 帖子nnginx 这篇文章也有帮助。

基本上,必须将 nginx 配置设置为

  1. 使用dockerDNS 服务器127.0.0.11
  2. 将代理放入变量中。这是会议:
resolver 127.0.0.11 valid=10s;

server {
  set $app app:4000;
  location / {
    proxy_pass http://$app;
  }
}
Run Code Online (Sandbox Code Playgroud)

一旦docker-compose up -d --no-deps --scale app=2 --no-recreate app被调用,它就会开始路由到两个实例。

问题是,当缩小规模时,需要 DNS 条目 TTL 来更新它不再有效,因此,对于 ,10s我确实有 50% 的流量下降[0-10s],这还不错,但并不完美。

我目前正在调查:

  • 什么是合适的 TTL 持续时间
  • 是否有办法手动触发 DNS 条目刷新