Docker Nginx-Proxy: Proxy zwischen Containern

ch führe zurzeit einen Entwicklungsstack mit Docker-Compose in meinem Unternehmen aus, um Entwicklern alles zur Verfügung zu stellen, was sie zum Codieren unserer Anwendungen benötige

s umfasst insbesonder

a Gitlab-Container sameersbn / gitlab) um private GIT-Repositories zu verwalten,a Jenkins Behälter library / jenkins) für den Aufbau und die kontinuierliche Integration,an Archiva container ninjaben / archiva-docker) zum Verwalten von Maven-Repositorys.

Um die Dienste über HTTPS abzusichern und der Außenwelt zugänglich zu machen, habe ich den ausgezeichneten Nginx-Proxy-Container (@) installier jwilder / nginx-proxy) Ermöglicht die automatisierte Konfiguration von Nginx-Proxys mithilfe von Umgebungsvariablen in Containern und die automatisierte Umleitung von HTTP zu HTTPS.

DNS sind so konfiguriert, dass jede öffentliche URL von Docker-Diensten der IP des Hosts zugeordnet wird.

Schließlich sieht meine Datei docker-compose.yml mit Docker-Compose folgendermaßen aus:

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

Für eine Entwickler-Workstation funktioniert alles wie erwartet. Auf die Differenzdienste kann man zugreifen überhttps://gitlab.my-domain.com, https://repo.my-domain.com undhttps://jenkins.my-domain.com.

Das Problem tritt auf, wenn einer der Docker-Dienste auf einen anderen Docker-Dienst zugreift. Zum Beispiel, wenn ich versuche, auf @ zuzugreifhttps://archiva.my-domain.com Von Jenkins Docker erhalte ich einen Timeout-Fehler vom Proxy.

Es scheint, dass auch wennarchiva.my-domain.com wird als öffentliche Host-IP aus dem Docker-Container aufgelöst,Anfragen von Docker-Diensten werden nicht von Nginx-Proxy weitergeleitet.

Soweit ich verstanden habe, verarbeitet docker-nginx Anforderungen, die vom Host-Netzwerk stammen, kümmert sich jedoch nicht um die Anforderungen, die vom internen Containernetzwerk (_dockerconfig_default_ für einen Docker-Compose-Stack) stammen.

Sie könnten sagen, warum ich den Proxy aus einem Container verwenden muss? Natürlich könnte ich URL @ verwendhttp://archiva:8080 von Jenkins Container, und es würde funktionieren. Diese Art der Konfiguration ist jedoch nicht skalierbar.

Wenn Sie beispielsweise einen Gradle-Build zum Kompilieren einer Anwendung verwenden, muss der build.gradle mein privates Repository über @ deklarierehttps://archiva.my-domain.com. Es funktioniert, wenn build von einer Entwickler-Workstation aus gestartet wird, aber nicht über den Jenkins-Container ...

Ein weiteres Beispiel ist eine Authentifizierung in Jenkins durch den OAuth GitLab-Dienst, bei der die gleiche URL für die GitLab-Authentifizierung @ sein musbeid von außen und im Jenkins-Container erhältlich.

Meine Frage hier ist dann:Wie konfiguriere ich nginx-proxy, um eine Anfrage von einem Container an einen anderen Container zu senden?

Ich habe kein Thema gesehen, das dieses Problem behandelt, und ich verstehe das Problem nicht genug, um eine Lösung für die Nginx-Konfiguration zu finden.

Jede Hilfe wäre sehr dankbar.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage