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.

questionAnswers(1)

yourAnswerToTheQuestion