Ich habe ein Wildcard-DNS eingerichtet, damit alle Webanforderungen an eine benutzerdefinierte Domäne (* .foo) der IP-Adresse des Docker-Hosts zugeordnet werden. Wenn auf mehreren Containern Apache- (oder Nginx-) Instanzen ausgeführt werden, ordnet jeder Container den Apache-Port (80) einem externen eingehenden Port zu.
Ich möchte eine Anfrage an container-1.foo stellen, die bereits über meinen benutzerdefinierten DNS-Server der richtigen IP-Adresse (des Docker-Hosts) zugeordnet ist, aber die Standard-Port-80-Anfrage an den richtigen externen Docker weiterleiten Port so, dass die richtige Apache-Instanz aus dem angegebenen Container basierend auf der benutzerdefinierten Domäne antworten kann. Ebenso würde container-2.foo den Apache eines zweiten Containers vertreten und so weiter.
Gibt es eine vorgefertigte Lösung dafür, ist es meine beste Wahl, einen Nginx-Proxy auf dem Docker-Host auszuführen, oder sollte ich einen node.js-Proxy mit der Möglichkeit schreiben, Docker-Container zu verwalten (Start / Stopp / Neuaufbau über das Web) ), oder...? Welche Optionen habe ich, die die Verwendung der Docker-Container eher zu einem natürlichen Ereignis machen und nicht zu etwas mit fremden Ports und Container-Jonglieren?
Antworten:
Diese Antwort ist möglicherweise etwas spät, aber Sie benötigen einen automatischen Reverse-Proxy. Ich habe dafür zwei Lösungen verwendet:
Mit der Zeit bevorzuge ich Traefik. Vor allem, weil es gut dokumentiert und gewartet wird und über mehr Funktionen verfügt (Lastausgleich mit verschiedenen Strategien und Prioritäten, Integritätsprüfungen, Leistungsschalter, automatische SSL-Zertifikate mit ACME / Let's Encrypt, ...).
Verwenden von jwilder / nginx-proxy
Wenn Sie das Docker-Image eines Docker-Containers von Jason Wilder ausführen , wird ein Nginx-Server als Reverse-Proxy für Ihre anderen Container eingerichtet, für den keine Konfiguration erforderlich ist.
Führen Sie einfach Ihre anderen Container mit der
VIRTUAL_HOST
Umgebungsvariablen aus, und nginx-proxy erkennt ihren ip: port und aktualisiert die nginx-Konfiguration für Sie.Angenommen, Ihr DNS ist so eingerichtet, dass
*.test.local
es der IP-Adresse Ihres Docker-Hosts zugeordnet ist. Starten Sie dann einfach die folgenden Container, um eine schnelle Demo auszuführen:Traefik verwenden
Wenn Sie einen Traefik- Container ausführen , wird ein Reverse-Proxy-Server eingerichtet, der die Weiterleitungsregeln anhand der Docker-Labels auf Ihren Containern neu konfiguriert .
Angenommen, Ihr DNS ist so eingerichtet, dass
*.test.local
es der IP-Adresse Ihres Docker-Hosts zugeordnet ist. Starten Sie dann einfach die folgenden Container, um eine schnelle Demo auszuführen:quelle
-v /var/run/docker.sock:/tmp/docker.sock
Ist es eine gefährliche Lösung? Container dieser Nginx-Proxy hat Zugriff auf Docker-Host-Daemon? Kann dies eine mögliche Sicherheitslücke sein?/var/run/docker.sock
keine Garantie dafür ist, dass der Docker-Host nicht aus einem Container ausgenutzt werden kann. Docker-Sicherheit ist ein Thema für sich.Hier sind zwei mögliche Antworten: (1) Richten Sie Ports direkt mit Docker ein und verwenden Sie Nginx / Apache, um die vhosts zu vertreten, oder (2) verwenden Sie Dokku , um Ports und vhosts für Sie zu verwalten (so habe ich gelernt, Methode 1 auszuführen).
Methode 1a (Ports direkt mit Docker zuweisen)
Schritt 1: Richten Sie nginx.conf oder Apache auf dem Host mit den gewünschten Portnummernzuweisungen ein. Dieser Webserver, der auf dem Host ausgeführt wird, übernimmt das vhost-Proxy. In Bezug auf Docker ist daran nichts Besonderes - es ist normales vhost-Hosting. Als nächstes kommt in Schritt 2 der spezielle Teil, damit Docker die richtige Host-Portnummer verwendet.
Schritt 2: Erzwingen Sie die Zuweisung von Portnummern in Docker mit "-p", um die Portzuordnungen von Docker festzulegen, und "-e", um benutzerdefinierte Umgebungsvariablen in Docker wie folgt festzulegen:
Methode 1b Fest codierter Anwendungsport
... wenn Ihre Anwendung einen fest codierten Port verwendet, z. B. Port 5000 (dh kann nicht wie in Methode 1a über die PORT-Umgebungsvariable konfiguriert werden), kann er über Docker wie folgt fest codiert werden:
Methode 2 (lassen Sie Dokku die Ports herausfinden)
Im Moment ist Dokku eine ziemlich gute Option für die Verwaltung von Docker- Vhosts . Eine bevorstehende Option könnte die Verwendung von Flynn sein , aber ab sofort fängt Flynn gerade erst an und ist noch nicht ganz fertig. Deshalb entscheiden wir uns jetzt für Dokku: Nachdem Sie die Dokku-Installationsanweisungen für eine einzelne Domain befolgt haben, aktivieren Sie vhosts, indem Sie die Datei "VHOST" erstellen:
Wenn eine App über SSH an Dokku gesendet wird (Informationen hierzu finden Sie in den Dokku-Dokumenten), überprüft Dokku die VHOST-Datei und generiert sie für die jeweilige App (sagen wir, Sie haben "container-1" gedrückt) die folgende Datei:
Und es wird folgenden Inhalt haben:
Beim Neustart des Servers stellt Dokku sicher, dass Docker die Anwendung mit dem Port startet, der dem ursprünglich bereitgestellten Port zugeordnet ist (hier 49162), anstatt zufällig einen anderen Port zuzuweisen. Um diese deterministische Zuweisung zu erreichen, speichert Dokku den ursprünglich zugewiesenen Port in
/home/git/container-1/PORT
und setzt beim nächsten Start diePORT
Umgebung auf diesen Wert und ordnet die Portzuweisungen von Docker sowohl auf der Host- als auch auf der App-Seite diesem Port zu. Dies steht im Gegensatz zum ersten Start, bei dem Dokku denPORT=5000
zufälligen Port Dokku auf der VPS-Seite auf 5000 auf der App-Seite festlegt und dann herausfindet. Es ist rund (und könnte sich in Zukunft sogar ändern), aber es funktioniert!Die Art und Weise, wie VHOST unter der Haube funktioniert, ist: Wenn Dokku einen Git-Push der App über SSH ausführt, führt er Hooks aus, in denen er lebt
/var/lib/dokku/plugins/nginx-vhosts
. Diese Haken sind auch in der Dokku Quellcode befindet sich hier und sind verantwortlich für das Schreiben dernginx.conf
Dateien mit den korrekten Einstellungen vhost. Wenn Sie dieses Verzeichnis nicht haben/var/lib/dokku
, versuchen Sie es auszuführendokku plugins-install
.quelle
Mit Docker möchten Sie, dass die internen IPs normal bleiben (z. B. 80) und herausfinden, wie die zufälligen Ports verkabelt werden.
Eine Möglichkeit, mit ihnen umzugehen, ist ein Reverse-Proxy wie Hipache. Zeigen Sie mit Ihrem DNS darauf, und konfigurieren Sie den Proxy neu, wenn Ihre Container auf und ab gehen. Schauen Sie unter http://txt.fliglio.com/2013/09/protyping-web-stuff-with-docker/ nach, wie dies funktionieren könnte.
Wenn Sie nach etwas Robusterem suchen, sollten Sie sich "Service Discovery" ansehen. (Ein Blick auf die Serviceerkennung mit Docker: http://txt.fliglio.com/2013/12/service-discovery-with-docker-docker-links-and-beyond/ )
quelle