proxy reverso nginx para o cluster do Docker 1.13 “Swarm Mode”

3

Eu tenho um cluster de enxame docker existente em execução em dois nós e quero adicionar nginx para proxy reverso. Estou fazendo esta pergunta porque estou enfrentando alguns problemas que não sei como resolver.

Minha primeira pergunta é sobre a execução do nginx dentro do Swarm e a capacidade de acessar meus contêineres de aplicativos usando seus nomes próprios. Firsly, aqui está a saída de docker network ls

6897486e798b        bridge              bridge              local
3c5b72414821        docker_gwbridge     bridge              local
6f762b23ff12        host                host                local
uwy3qfuu4oos        ingress             overlay             swarm
0e867cd5a3bf        none                null                local

Preciso criar outra rede de sobreposição e configurar o Nginx para estar nessa rede de sobreposição. Estou criando o serviço nginx da seguinte maneira:

docker service create rproxy -p 80:80 --mount type=volume,source=rproxy,target=/etc/nginx --mode=global nginx:alpine

Com este comando, o nginx está sendo criado em todos os meus nós e eu posso acessar a tela padrão do nginx "hello world" usando o navegador.

Desde que montei um volume para a configuração do nginx, consigo acessar a configuração do nginx em /var/lib/docker/volumes/rproxy/_data . Então, entrei em /etc/nginx/conf.d , removi default e criei um vhost simples:

server {
    listen 80;
    location / {
        proxy_pass http://myapp:80;
    }
}

Quando reiniciei o nginx, meu servidor não iniciou devido ao erro nginx que Host "myapp" does not exist . Eu sei que se eu expor qualquer porta do myapp service, poderei usar proxy como:

proxy_pass http://0.0.0.0:SOME_PORT;

Eu não exponho nenhuma porta, mas quero acessar meus contêineres usando seus respectivos nomes de serviço. Isso é possível? Se sim, como devo fazer isso?

Minha segunda pergunta é sobre o armazenamento de arquivos de configuração. Existe uma maneira de criar um único volume no swarm e acessar esse volume de todos os nós? Eu nem me importaria se o volume fosse armazenado no servidor do gerenciador de enxame, já que o nginx carrega a configuração na memória, o que não afetaria o desempenho.

EDIT: Eu não verifiquei a versão do Docker ao instalar, pensando que o 1.13 é o mais recente. Versão do Docker 17.06.1-ce, compilação 874a737

    
por Gasim 02.09.2017 / 01:50

1 resposta

1

Do I need to create another overlay network and set up Nginx to be in that overlay network.

O contêiner nginx e seus aplicativos de destino precisam estar na mesma rede de encaixe para se comunicar de um contêiner para outro. Você pode adicionar o contêiner nginx a várias redes específicas de aplicativos ou criar uma rede proxy e anexar todos os aplicativos a essa rede. A partir do comando docker run , você pode se conectar a uma única rede. Para várias redes, da maneira mais difícil, você pode fazer um docker create e, em seguida, docker network connect antes de executar um docker start . A maneira mais fácil seria usar um arquivo docker-compose.yml que automatiza essas etapas para conectar seu contêiner a várias redes.

Is there a way to create a single volume in the swarm and access that volume from all nodes? I wouldn't even mind if the volume is stored in the swarm manager server as nginx loads config into memory, which would not affect the performance.

Você pode criar um volume que se conecte a um servidor nfs remoto. Aqui estão alguns exemplos dos comandos do docker para usar um compartilhamento remoto do nfs:

# create a reusable volume
$ docker volume create --driver local \
    --opt type=nfs \
    --opt o=addr=192.168.1.1,rw \
    --opt device=:/path/to/dir \
    foo

# or from the docker run command
$ docker run -it --rm \
  --mount type=volume,dst=/container/path,volume-driver=local,volume-opt=type=nfs,volume-opt=o=addr=192.168.1.1,volume-opt=device=:/host/path \
  foo

# or to create a service
$ docker service create \
  --mount type=volume,dst=/container/path,volume-driver=local,volume-opt=type=nfs,volume-opt=o=addr=192.168.1.1,volume-opt=device=:/host/path \
  foo
    
por 02.09.2017 / 02:50