Nginx als reverse Proxy für Docker-Container

Nachdem ich in meinem Docker-Zoo erfolgreich Traefik als reverse Proxy betreibe und neulich dafür auch die TLS-Terminierung aktiviert habe, habe ich aus aktuellem Anlass endlich auch einmal die Variante mit NGinx ais reverse Proxy ausprobieren wollen.

Ich habe zu diesem Thema einige Links gefunden, die ich am Ende des Artikels angehängt habe. Ich bin zur Umsetzung aber im großen und ganzen einem einzigen von ihnen gefolgt, weil die Beschreibung darin aus meiner Sicht hervorragend war und die Art und Weise der Umsetzung mir sehr entgegenkam.

In meinem Docker-Zoo setze ich Traefik ein - dort ist es so, dass zur Erweiterung um einen neuen Dienst Traefik nicht angepasst werden muss - es ist lediglich nötig, einige Labels in dem betreffenden docker-compose file zu setzen. Alles weitere funktioniert automatisch.

Ich hätte gerne eine entsprechende Lösung auch mit Nginx angestrebt - dafür wäre es aber notwendig, ähnlich Traefik einen Container zu bauen, der die Docker-API benutzt, um über Events und Eigenschaften der Container informiert zu werden. Solche Nginx-Lösungen existieren auf dem Docker-Hub - allerdings ging es mir hierbei um das Verständnis von Nginx - ich wollte Traefik keine Konkurrenz machen, oder es gar ersetzen.

Die Variante, für die ich mich entschieden habefunktioniert so, dass alle Konfiguration in Nginx vorzunehmen sind - die Container selbst müssen lediglich in das korrekte Netzwerk zugeordnet werden, so dass Nginx sie "sehen" kann. Für jeden Container wird eine Konfigurationsdatei im Nginx-Cointainer angelegt. Zur TLS-Terminierung benutze ich ein Wildcard-Zertifikat für die jeweilige Domain - erstellt natürlich mittels einer entsprechenden Lösung zur Verwaltung von PKIs.

Das docker-compose File für den reverse Proxy ist sehr einfach:

version: '3'

services: reverse: container_name: reverse hostname: reverse image: nginx ports: - 80:80 - 443:443 volumes: - ./config:/etc/nginx - ./certs:/etc/ssl/private networks: - reverse_nginx

networks: reverse_nginx: external: name: reverse_nginx

Die übergreifenden Konfigurationen sind wie im Artikel beschrieben ungeändert übernommen - lediglich an ssl.conf musste ich einige Änderungen vornehmen - eine, weil der Artikel bereits ein wenig in die Jahre gekommen ist:

ssl_protocols               TLSv1 TLSv1.1 TLSv1.2;

musste ich durch

ssl_protocols               TLSv1.2 TLSv1.3;

ersetzen, weil Firefox mit den alten TLS-Versionen nicht mehr zusamenarbeiten mochte.

Weil ich zu faul war, die Zertifikate umzuformatieren, konnte ich SSL-Stapling nicht benutzen und habe daher die beiden Optionen ssl_stapling und ssl_stapling_verify deaktiviert.

Mit der folgenden Beispielkonfiguration für Keycloak konnte ich dann die Beispielanwendung für OpenID-Authentifizierung erfolgreich testen:

upstream keycloakserver {
  server        keycloakserver:8080;
}

server { listen 443 ssl; server_name keycloakserver;

include common.conf; include ssl.conf;

location / { proxy_pass http://keycloakserver; include common_location.conf; } }

Artikel, die hierher verlinken

Osterprojekt 2023: DNSSEC

23.05.2023

Das Osterprojekt dieses Jahr sollte sich mit EMail-Servern, Nameservern, DNSSEC und ACME (LetsEncrypt) beschäftigen.

Was bedeutet das Vorhängeschloss im Browser?

12.11.2021

Ich habe immer wieder Anlauf genommen, mir das Folgende mal von der Seele zu schreiben und es immer wieder aufgeschoben - jetzt ist es aber soweit!

LuFi im Docker-Zoo

22.08.2021

Nachdem ich mich in den letzten Artikeln hauptsächlich um die Infrastruktur meines Docker-Zoos gekümmert habe ist nun eine weitere Anwendung hinzugekommen...

PiHole-Bug bei Installation

25.07.2021

Ich trage mich aktuell mit dem Gedanken, analog zu meinen Skripts zur Einrichtung von Kartenservern oder Netzwerkinfrastruktur einen kleinen Server komplett unattended einrichten zu können, der PiHole, DNSSEC und einen autonomen root-Resolver integriert.

Alle Artikel rss Wochenübersicht Monatsübersicht Github Repositories Gitlab Repositories Mastodon Über mich home xmpp


Vor 5 Jahren hier im Blog

  • Certstream, InfluxDB, Grafana und Netflix

    16.04.2019

    Nachdem ich vor kurzem über mein erstes Spielen mit dem certstream berichtete, habe ich weitere Experimente gemacht und die Daten zur besseren Auswertung in eine InfluxDB gepackt, um sie mit Grafana untersuchen zu können.

    Weiterlesen...

Neueste Artikel

  • Die sQLshell ist nun cloudnative!

    Die sQLshell hat eine weitere Integration erfahren - obwohl ich eigentlich selber nicht viel dazu tun musste: Es existiert ein Projekt/Produkt namens steampipe, dessen Slogan ist select * from cloud; - Im Prinzip eine Wrapperschicht um diverse (laut Eigenwerbung mehr als 140) (cloud) data sources.

    Weiterlesen...
  • LinkCollections 2024 III

    Nach der letzten losen Zusammenstellung (für mich) interessanter Links aus den Tiefen des Internet von 2024 folgt hier gleich die nächste:

    Weiterlesen...
  • Funktionen mit mehreren Rückgabewerten in Java

    Da ich seit nunmehr einem Jahr bei meinem neeun Arbeitgeber beschäftigt und damit seit ungefähr derselben Zeit für Geld mit Python arbeite, haben sich gewisse Antipathien gegenüber Python vertieft (ich kann mit typlosen Sprachen einfach nicht umgehen) - aber auch einige meiner Gründe, Python zu lieben sind ebenso stärker geworden. Einer davon ist der Fakt, dass eine Methode in Python mehr als einen Wert zurückgeben kann.

    Weiterlesen...

Manche nennen es Blog, manche Web-Seite - ich schreibe hier hin und wieder über meine Erlebnisse, Rückschläge und Erleuchtungen bei meinen Hobbies.

Wer daran teilhaben und eventuell sogar davon profitieren möchte, muß damit leben, daß ich hin und wieder kleine Ausflüge in Bereiche mache, die nichts mit IT, Administration oder Softwareentwicklung zu tun haben.

Ich wünsche allen Lesern viel Spaß und hin und wieder einen kleinen AHA!-Effekt...

PS: Meine öffentlichen GitHub-Repositories findet man hier - meine öffentlichen GitLab-Repositories finden sich dagegen hier.