nginx na frente dos serviços de enxame do docker

6

Estou pensando em como isso deve ser feito de forma séria por semanas e não chegou a uma conclusão ainda. Talvez eu pense na direção errada.

Digamos que você tenha cem aplicativos da web que vêm e vão. Você quer uma configuração nginx assim com o exemplo do gitlab:

location / {
  proxy_pass http://gitlab;
}

Como o gitlab foi criado com docker service create , o nginx poderá resolver o gitlab pelo seu nome swarm-vip dns falso dentro da sua rede de ingresso.

MAS: somente se o contêiner de serviço estiver em execução. Além disso, o nginx não será iniciado devido a [emerg] 1#1: host not found in upstream "gitlab"

Agora, isso é um fator decisivo quando você precisa executar um nginx de alta disponibilidade e não é da sua conta garantir que os aplicativos proxy_pass'ed estejam em execução.

Toda vez que você atualizar o serviço nginx, ele não será exibido se apenas um dos outros cem serviços de swarm não estiver sendo executado, mesmo durante o mesmo segundo .. wtf?

Se isso não está funcionando, por que no mundo precisamos de resolução de nomes no enxame? Como você resolve esse problema?

Eu pensei sobre o cônsul e a geração dinâmica de modelos de host virtual nginx (nem pense em docker-nginx-proxy!), mas os aplicativos são muito diferentes e você pode dizer que cada aplicativo tem sua própria configuração individual. E todo esse trabalho não por uma razão especial, apenas para resolver o problema de resolução do nginx?

    
por roothahn 15.08.2017 / 21:57

1 resposta

5

Eu recomendo trocar o proxy reverso nginx estaticamente definido para trafik que está ciente do swarm e pode se reconfigurar dinamicamente conforme os serviços são implementados e destruídos.

Veja uma amostra de implementação:

  1. crie uma rede para o traefik falar com contêineres: docker network create proxy

  2. Faça um traefik.toml, aqui está um exemplo:

traefik.toml

accessLogsFile = "/proc/1/fd/1"
defaultEntryPoints = ["http"]
[entryPoints]
  [entryPoints.http]
  address = ":80"
[web]
address = ":8080"
[docker]
endpoint = "unix:///var/run/docker.sock"
domain = "localhost"
watch = true
swarmmode = true
constraints = ["tag==frontend"]
  1. Exemplo de composição de arquivo para trafik:

docker-compose.traefik.yml

version: '3'

networks:
  proxy:
    external:
      name: proxy

services:
  traefik:
    image: traefik:latest
    volumes:
    - ./traefik.toml:/etc/traefik/traefik.toml:ro
    - /var/run/docker.sock:/var/run/docker.sock
    ports:
    - 80:80
    - 8080:8080
    networks:
    - proxy
    restart: unless-stopped
  1. Configure seu aplicativo com marcadores e na mesma rede.

docker-compose.app.yml

version: '3'

networks:
  proxy:
    external: true

services:
  webtest:
    image: nginx:latest
    networks:
    - default
    - proxy
    labels:
    - traefik.frontend.rule=PathPrefixStrip:/webtest
    - traefik.port=80
    - traefik.docker.network=proxy
    - traefik.tags=frontend
    restart: unless-stopped

A regra acima usa os prefixos de caminho do contêiner para simplificar, mas você pode usar qualquer regra que preferir para o proxy do seu aplicativo.

    
por 20.08.2017 / 02:25