docker-compose --scale X Nginx.conf配置

Vic*_*res 6 load-balancing nginx docker

我的nginx.conf文件当前具有直接定义的路由:

worker_processes auto;

events { worker_connections 1024; }

http {
    upstream wordSearcherApi {
          least_conn;

          server api1:61370 max_fails=3 fail_timeout=30s;
          server api2:61370 max_fails=3 fail_timeout=30s;
          server api3:61370 max_fails=3 fail_timeout=30s;
    }

    server {
          listen 80; 
          server_name server_name 0.0.0.0;

          location / {
              proxy_pass http://wordSearcherApi;
          }
    }
}
Run Code Online (Sandbox Code Playgroud)

有什么方法可以在docker-compose.yml中仅创建一个服务,当时docker-compose up --scale api=3,nginx是否会自动进行负载平衡?

saa*_*aaj 5

nginx

动态上游在 Nginx(正常,sans Plus)中是可能的,但有技巧和限制。

  1. 您放弃upstream指令并使用 plain proxy_pass

    它提供循环负载平衡和故障转移,但没有指令的额外功能,如权重、故障模式、超时等。

  2. 您的上游主机名必须proxy_pass通过一个变量传递给您,并且您必须提供一个resolver.

    它强制 Nginx 重新解析主机名(针对 Docker 网络的 DNS)。

  3. 您丢失location/proxy_pass与尾随斜杠相关的行为。

    在反向代理到问题中的裸露的情况下/,这无关紧要。否则,您必须手动rewrite设置路径(请参阅下面的参考资料)。

让我们看看它是如何工作的。

docker-compose.yml

version: '2.2'
services:
  reverse-proxy:
    image: nginx:1.15-alpine
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
    ports:
      - 8080:8080
  app:
    # A container that exposes an API to show its IP address
    image: containous/whoami
    scale: 4
Run Code Online (Sandbox Code Playgroud)

配置文件

worker_processes  1;

events {
  worker_connections  1024;
}

http {
  access_log /dev/stdout;
  error_log /dev/stderr;

  server {
    listen 8080;
    server_name localhost;

    resolver 127.0.0.11 valid=5s;
    set $upstream app;

    location / {
      proxy_pass http://$upstream:80;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

然后...

docker-compose up -d
seq 10 | xargs -I -- curl -s localhost:8080 | grep "IP: 172"
Run Code Online (Sandbox Code Playgroud)

...产生类似以下内容的内容,表明请求分布在 4 个app容器中:

IP: 172.30.0.2
IP: 172.30.0.2
IP: 172.30.0.3
IP: 172.30.0.3
IP: 172.30.0.6
IP: 172.30.0.5
IP: 172.30.0.3
IP: 172.30.0.6
IP: 172.30.0.5
IP: 172.30.0.5
Run Code Online (Sandbox Code Playgroud)

参考:

  1. 具有动态上游的 Nginx
  2. 使用容器学习 Nginx 反向代理
  3. 使用 Python 的 Docker 动态 Nginx 配置

特拉菲克

Traefik 直接依赖于 Docker API,可能是一个更简单、更可配置的选项。让我们看看它的实际效果。

docker-compose.yml

version: '2.2'
services:
  reverse-proxy:
    image: traefik  
    # Enables the web UI and tells Traefik to listen to docker
    command: --api --docker  
    ports:
      - 8080:80      
      - 8081:8080  # Traefik's web UI, enabled by --api
    volumes:
      # So that Traefik can listen to the Docker events
      - /var/run/docker.sock:/var/run/docker.sock  
  app:
    image: containous/whoami
    scale: 4
    labels:
      - "traefik.frontend.rule=Host:localhost"
Run Code Online (Sandbox Code Playgroud)

然后...

docker-compose up -d
seq 10 | xargs -I -- curl -s localhost:8080 | grep "IP: 172"
Run Code Online (Sandbox Code Playgroud)

...还会产生一些输出,表明请求分布在 4 个app容器中:

IP: 172.31.0.2
IP: 172.31.0.5
IP: 172.31.0.6
IP: 172.31.0.4
IP: 172.31.0.2
IP: 172.31.0.5
IP: 172.31.0.6
IP: 172.31.0.4
IP: 172.31.0.2
IP: 172.31.0.5
Run Code Online (Sandbox Code Playgroud)

在 Traefik UI(http://localhost:8081/dashboard/在示例中)中,您可以看到它识别了 4 个app容器:

后端

参考:

  1. Traefik 快速入门(使用 Docker)


viv*_*d4v 4

您当前的配置是不可能的,因为它是静态的。你有两个选择——

1. 使用 docker 引擎 swarm 模式- 您可以定义副本,swarm 内部 DNS 将自动平衡这些副本之间的负载。
参考 - https://docs.docker.com/engine/swarm/

2. 使用著名的 Jwilder nginx 代理- 该图像侦听 docker 套接字,使用 GO 中的模板在扩展或缩小容器时动态更改 nginx 配置。
参考 - https://github.com/jwilder/nginx-proxy