Ich habe ein paar Docker-Container, die wie folgt laufen:
- Nginx
- Web App 1
- Web App 2
- PostgreSQL
Da Nginx eine Verbindung zu den Webanwendungsservern in Webanwendung 1 und 2 herstellen muss und die Webanwendungen mit PostgreSQL kommunizieren müssen, habe ich folgende Verknüpfungen:
- Nginx --- Link ---> Web App 1
- Nginx --- Link ---> Web App 2
- Web App 1 --- Link ---> PostgreSQL
- Web App 2 --- Link ---> PostgreSQL
Das funktioniert zunächst ziemlich gut. Wenn ich jedoch eine neue Version von Web App 1 und Web App 2 entwickle, muss ich sie ersetzen. Ich entferne die Web-App-Container, richte neue Container ein und starte sie.
Für die Web-App-Container wären ihre IP-Adressen zunächst ungefähr so:
- 172.17.0.2
- 172.17.0.3
Und nachdem ich sie ersetzt habe, haben sie neue IP-Adressen:
- 172.17.0.5
- 172.17.0.6
Diese exponierten Umgebungsvariablen im Nginx-Container verweisen weiterhin auf die alten IP-Adressen. Hier kommt das Problem. Wie ersetze ich einen Container, ohne die Verbindung zwischen Containern zu unterbrechen? Das gleiche Problem tritt auch bei PostgreSQL auf. Wenn ich die PostgreSQL-Image-Version aktualisieren möchte, muss ich sie auf jeden Fall entfernen und die neue ausführen, aber dann muss ich das gesamte Container-Diagramm neu erstellen, sodass dies nicht ideal für den realen Serverbetrieb ist.
quelle
Sie können einen Botschaftercontainer verwenden . Verknüpfen Sie den Ambassador-Container jedoch nicht mit Ihrem Client, da dies das gleiche Problem wie oben verursacht. Verwenden Sie stattdessen den exponierten Port des Ambassador-Containers auf dem Docker-Host (normalerweise 172.17.42.1). Beispiel:
Postgres-Band:
Postgres-Container:
Botschafter-Container für Postgres:
Jetzt können Sie einen Postgresql-Client-Container starten, ohne den Ambassador-Container zu verknüpfen, und auf Postgresql auf dem Gateway-Host zugreifen (normalerweise 172.17.42.1):
Jetzt können Sie den Ambassador-Container neu starten, ohne den Client neu starten zu müssen.
quelle
Wenn noch jemand neugierig ist, müssen Sie die Hosteinträge in der Datei / etc / hosts jedes Docker-Containers verwenden und sollten nicht von ENV-Variablen abhängen, da diese nicht automatisch aktualisiert werden.
Für jeden verknüpften Container wird ein Hostdateieintrag im Format LINKEDCONTAINERNAME_PORT_PORTNUMBER_TCP usw. erstellt.
Das Folgende stammt aus Docker- Dokumenten
quelle
Dies ist im experimentellen Build von Docker vor 3 Wochen mit der Einführung von Diensten enthalten: https://github.com/docker/docker/blob/master/experimental/networking.md
Sie sollten in der Lage sein, eine dynamische Verknüpfung herzustellen, indem Sie einen Docker-Container mit den
--publish-service <name>
Argumenten ausführen . Auf diesen Namen kann über das DNS zugegriffen werden. Dies bleibt beim Neustart des Containers bestehen (solange Sie den Container mit demselben Servicenamen wie natürlich neu starten).quelle
wget -qO- https://experimental.docker.com/ | sh
, um die experimentelle Version zu installierenpublish-service
Option entfernt hat. Jetzt haben sie stattdessen Aliase mit Netzwerkbereich. Im Wesentlichen das Gleiche.Sie können Dockerlinks mit Namen verwenden, um dies zu lösen.
Die grundlegendste Einrichtung besteht darin, zuerst einen benannten Datenbankcontainer zu erstellen :
Erstellen Sie dann einen Webcontainer, der eine Verbindung zu db herstellt:
Damit müssen Sie Container nicht manuell mit ihren IP-Adressen verbinden.
quelle
db
in diesem Fall), erhält er eine neue IP-Adresse. Ihr anderer Container (neu gestartet oder nicht) behält die ENV-Werte ab dem Moment bei, zu dem Sie ihn gestartet haben, und er ist unbrauchbar.net-alias
oder den Containernamen).Mit dem OpenSVC-Ansatz können Sie Folgendes umgehen:
Jedes Mal, wenn Sie einen Container ersetzen, stellen Sie sicher, dass er eine Verbindung zur richtigen IP-Adresse herstellt.
Tutorial hier => Docker Multi Containers mit OpenSVC
Verpassen Sie nicht den Teil "Komplexe Orchestrierung" am Ende des Tutorials, mit dem Sie Container in der richtigen Reihenfolge starten / stoppen können (1 Postgresql-Teilmenge + 1 Webapp-Teilmenge + 1 Nginx-Teilmenge).
Der Hauptnachteil besteht darin, dass Sie Webapp- und PostgreSQL-Ports einer öffentlichen Adresse aussetzen und tatsächlich nur der Nginx-TCP-Port öffentlich zugänglich gemacht werden muss.
quelle
Sie können auch die Ambassador-Methode ausprobieren, einen Zwischencontainer zu haben, um den Link intakt zu halten ... (siehe https://docs.docker.com/articles/ambassador_pattern_linking/ ) für weitere Informationen
quelle
Sie können die Verbindungsports Ihrer Images an feste Ports auf dem Host binden und die Dienste so konfigurieren, dass sie stattdessen verwendet werden.
Dies hat auch seine Nachteile, könnte aber in Ihrem Fall funktionieren.
quelle
Eine andere Alternative ist die Verwendung der
--net container:$CONTAINER_ID
Option.Schritt 1: Erstellen Sie "Netzwerk" -Container
Schritt 2: Injizieren von Diensten in "Netzwerk" -Container
Solange Sie die "Netzwerk" -Container nicht berühren, sollten sich die IP-Adressen Ihrer Links nicht ändern.
quelle
In diesem Fall benötigen Sie einen Alias mit Netzwerkbereich . Es ist eine ziemlich neue Funktion, mit der ein Container "veröffentlicht" werden kann, der einen Dienst für das gesamte Netzwerk bereitstellt, im Gegensatz zu Link-Aliasen, auf die nur von einem Container aus zugegriffen werden kann.
Es wird keine Abhängigkeit zwischen Containern hinzugefügt - sie können kommunizieren, solange beide ausgeführt werden, unabhängig von Neustarts und Austausch- und Startreihenfolge. Ich glaube, es verwendet intern DNS anstelle von / etc / hosts
Verwenden Sie es folgendermaßen:
docker run --net=some_user_definied_nw --net-alias postgres ...
Sie können mit diesem Alias von jedem Container im selben Netzwerk aus eine Verbindung herstellen.Funktioniert nicht im Standardnetzwerk, leider müssen Sie eines mit erstellen
docker network create <network>
und es dann--net=<network>
für jeden Container verwenden ( compose unterstützt es ebenfalls ).Zusätzlich zum Ausfall des Containers und damit für Alias nicht erreichbar, können mehrere Container auch einen Alias gemeinsam nutzen. In diesem Fall kann nicht garantiert werden, dass der richtige Alias aufgelöst wird. Aber in einigen Fällen kann dies wahrscheinlich bei einem nahtlosen Upgrade helfen.
Es ist noch nicht alles sehr gut dokumentiert, schwer herauszufinden, nur durch Lesen der Manpage.
quelle