Docker nginx-proxy: proxy entre contêineres
Atualmente, estou executando uma pilha de desenvolvimento usando o Docker-Compose em minha empresa, para fornecer aos desenvolvedores tudo o que eles precisam para codificar nossos aplicativos.
Inclui, em especial:
um contêiner Gitlab (sameersbn / gitlab) para gerenciar repositórios GIT privados,um contêiner Jenkins (library / jenkins) para construção e integração contínua,um contêiner Archiva (ninjaben / docker archiva) para gerenciar repositórios Maven.Para proteger os serviços por HTTPS e expô-los ao mundo exterior, instalei o excelente contêiner nginx-proxy (jwilder / nginx-proxy), que permite a configuração automatizada do proxy nginx usando variáveis de ambiente em contêineres e redirecionamento automatizado de HTTP para HTTPS.
O DNS está configurado para mapear cada URL público de serviços dockerized para o IP do host.
Por fim, usando o Docker-Compose, meu arquivo docker-compose.yml fica assim:
version: '2'
services:
nginx-proxy:
image: jwilder/nginx-proxy
ports:
- "80:80"
- "443:443"
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro
- /var/config/nginx-proxy/certs:/etc/nginx/certs:ro
postgresql:
# Configuration of postgresql container ...
gitlab:
image: sameersbn/gitlab
ports:
- "10022:22"
volumes:
- /var/data/gitlab:/home/git/data
environment:
# Bunch of environment variables ...
- VIRTUAL_HOST=gitlab.my-domain.com
- VIRTUAL_PORT=80
- CERT_NAME=star.my-domain.com
archiva:
image: ninjaben/archiva-docker
volumes:
- /var/data/archiva:/var/archiva
environment:
- VIRTUAL_HOST=archiva.my-domain.com
- VIRTUAL_PORT=8080
- CERT_NAME=star.my-domain.com
jenkins:
image: jenkins
volumes:
- /var/data/jenkins:/var/jenkins_home
environment:
- VIRTUAL_HOST=jenkins.my-domain.com
- VIRTUAL_PORT=8080
- CERT_NAME=star.my-domain.com
Para uma estação de trabalho de desenvolvedor, tudo funciona como esperado. Pode-se acessar os serviços diferenciados através dehttps://gitlab.my-domain.com
, https://repo.my-domain.com
ehttps://jenkins.my-domain.com
.
O problema ocorre quando um dos serviços dockerized acessa outro serviço dockerized. Por exemplo, se eu tentar acessarhttps://archiva.my-domain.com
do jenkins docker, receberei um erro de tempo limite do proxy.
Parece que mesmo quearchiva.my-domain.com
é resolvido como o IP do host público do contêiner do docker,solicitações provenientes de serviços dockerized não são proxy pelo nginx-proxy.
Até onde eu entendi, o docker-nginx está lidando com solicitações provenientes da rede host, mas não se importa com as provenientes da rede de contêiner interno (_dockerconfig_default_ para uma pilha Docker-Compose).
Você poderia dizer, por que eu precisaria usar o proxy de um contêiner? Claro, eu poderia usar URLhttp://archiva:8080
do contêiner Jenkins, e funcionaria. Mas esse tipo de configuração não é escalável.
Por exemplo, usando uma compilação Gradle para compilar um aplicativo, o build.gradle precisa declarar meu repositório privado por meio dehttps://archiva.my-domain.com
. Funcionará se a compilação for iniciada a partir de uma estação de trabalho de desenvolvedor, mas não através do contêiner jenkins ...
Outro exemplo é uma autenticação no serviço Jenkins by OAuth GitLab, em que a mesma autenticação de URL GitLab precisa serambos disponível do lado de fora e dentro do contêiner Jenkins.
Minha pergunta aqui é então:Como configurar o nginx-proxy para proxy de uma solicitação de um contêiner para outro contêiner?
Não vi nenhum tópico discutindo esse problema e não entendi o suficiente para criar uma solução na configuração do nginx.
Qualquer ajuda seria muito apreciada.