Wie wird die Verknüpfung zwischen Andockcontainern eingerichtet, sodass beim Neustart kein Fehler auftritt?
Habe ich paar dockers Container läuft wie
- Nginx
- Web-app-1
- Web app 2
- PostgreSQL
Da Nginx müssen, verbindet web-application-server in die web-app 1 und 2, und web-apps need to talk to postgresql, so habe ich verbindungen wie diese
- Nginx --- link ---> Web-app-1
- Nginx --- link ---> Web-app-2
- Web-app-1 --- link ---> PostgreSQL
- Web-app-2 --- link ---> PostgreSQL
Das funktioniert ziemlich gut am Anfang, jedoch, wenn ich Sie entwickeln neue version der web-app-1 und web-app 2, die ich brauche, um Sie zu ersetzen. Was ich Tue, ist, zu entfernen web app-Containern, Einrichtung neuer Behälter und starten Sie Sie.
Für web-app-Container, die Ihre IP-Adresse bei der ersten würde etwas wie
- 172.17.0.2
- 172.17.0.3
Und nachdem ich diese zu ersetzen, haben Sie eine neue IP-Adressen jetzt
- 172.17.0.5
- 172.17.0.6
In diesem moment, diejenigen ausgesetzt Umgebungsvariablen in der Nginx-container sind immer noch spitz auf die alten IP-Adressen. Hier kommt das problem, gewusst wie: ersetzen ein container, ohne zu brechen Verknüpfung zu anderen Containern? Das gleiche Problem wird auch passieren, PostgreSQL, wenn ich aktualisieren möchten, auf die PostgreSQL-image-version, die ich sicherlich brauchen, um es zu entfernen, und führen Sie das neue, aber dann muss ich neu erstellen die gesamte container-graph ist dies nicht eine gute Idee für ein real life server-Betrieb.
InformationsquelleAutor der Frage Fang-Pen Lin | 2014-06-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Wirkung von
--link
ist statisch, wird also nicht für das Szenario (es gibt derzeit kein re-linking, obwohl Sie entfernen von Verknüpfungen).Wir wurden mit zwei unterschiedlichen Ansätzen an dockerize.es um dies zu lösen, ohne links oder Botschafter (obwohl man könnte hinzufügen, Botschafter zu).
1) Verwenden Sie die dynamische DNS -
Die Allgemeine Idee ist, dass Sie angeben, einen einzigen Namen für Ihre Datenbank (oder jede andere Dienstleistung) und aktualisieren Sie ein kurzes DNS-server mit der aktuellen IP, wie Sie starten und stoppen Behälter.
Begannen wir mit SkyDock. Es arbeitet mit zwei docker-Container, der DNS-server und ein monitor hält, dass es automatisch aktualisiert. Später zogen wir nach etwas mehr custom mit Konsul (auch mit einem dockerized version: docker-Konsul).
Einer Entwicklung von diesem (was wir noch nicht versucht), wäre das setup etcd oder ähnlich und verwenden Sie die benutzerdefinierte API zu lernen, die IP-Adressen und ports. Sollte die software unterstützt dynamische Rekonfiguration zu.
2) Verwenden Sie die docker bridge-ip -
Beim öffnen der container-Häfen, können Sie einfach binden Sie die
docker0
Brücke, die hat (oder haben kann) eine bekannte Adresse.Beim Auswechseln der Behälter mit einer neuen version, so stellen Sie den container veröffentlichen, den gleichen port auf der gleichen IP.
Dies ist einfacher, aber auch mehr beschränkt. Müssen Sie möglicherweise port-Konflikte, wenn Sie Sie ausführen ähnliche software (zum Beispiel zwei Container können nicht hören auf dem port 3306 auf die
docker0
Brücke), usw... so ist unser Derzeitiger Favorit ist option 1.InformationsquelleAutor der Antwort Abel Muiño
Links sind für einen bestimmten container, nicht auf den Namen eines Containers. Also der moment, den Sie entfernen ein container ist, wird die Verbindung getrennt und die neue container (sogar mit dem gleichen Namen) wird nicht automatisch seinen Platz einnehmen.
Die neue Netzwerkfunktion können Sie eine Verbindung zu Containern
Ihre Namen, so wenn Sie ein neues Netzwerk erstellen, jeden container angeschlossen
das Netzwerk erreichen kann andere Container, die von Ihrem Namen. Beispiel:
1) Erstellen Sie neue network
2) Schließen Sie den Behälter zum Netzwerk
oder
3) Ping-container-name
Sehen diese Abschnitt der Dokumentation;
Hinweis: im Gegensatz zu den alten
links
die neue Vernetzung nicht erstellen von environment-Variablen, noch die Umgebungsvariablen mit anderen Containern.Diese Funktion derzeit nicht unterstützt Aliase
InformationsquelleAutor der Antwort Hemerson Varela
Können Sie eine Botschafter container. Aber keine Verknüpfung der Botschafter container an Ihren Kunden, denn dies erzeugt das gleiche problem wie oben. Verwenden Sie stattdessen den freiliegenden Anschluss der Botschafter container auf dem docker host (in der Regel 172.17.42.1). Beispiel:
postgres-Volumen:
postgres-container:
Botschafter-container für postgres:
Nun können Sie eine postgresql-client-container, ohne die Verknüpfung der Botschafter-Containers und Zugriff auf postgresql auf dem gateway-host (in der Regel 172.17.42.1):
Nun können Sie starten Sie den Botschafter container, ohne dass ein Neustart der client.
InformationsquelleAutor der Antwort Swen Thümmler
Wenn jemand noch neugierig sind, müssen Sie die host-Einträge in der Datei /etc/hosts jedes docker-container und sollte nicht davon abhängen, ENV-Variablen, da Sie nicht automatisch aktualisiert.
Wird es eine host-Datei-Eintrag für jedes der verknüpften container im format LINKEDCONTAINERNAME_PORT_PORTNUMBER_TCP etc..
Im folgenden wird von docker docs
InformationsquelleAutor der Antwort frameworksnow
Dies ist in der experimentellen build von docker vor 3 Wochen, mit der Einführung von Dienstleistungen: https://github.com/docker/docker/blob/master/experimental/networking.md
Sollten Sie in der Lage sein, eine dynamische Verknüpfung vorhanden, durch ausführen eines docker-container mit der
--publish-service <name>
Argumente. Dieser name wird der Zugang über den DNS. Dies ist persistent auf container neu gestartet (solange Sie starten Sie den Behälter mit der gleichen service-Namen, natürlich)InformationsquelleAutor der Antwort Laurens Rietveld
Können Sie verwenden dockerlinks mit Namen um dieses Problem zu lösen.
Meisten basic-setup wäre, um zunächst eine namens Datenbank-container :
dann erstellen Sie ein web-container Verbindung zu db :
Mit dabei, die Sie nicht brauchen, um manuell die Verbindung Behälter mit Ihren IP-Adressen.
InformationsquelleAutor der Antwort Pak
mit OpenSVC Ansatz, können Sie Abhilfe durch :
jedes mal, wenn Sie ersetzen einen container, Sie sind sicher, dass es eine Verbindung zu der richtigen ip-Adresse.
Tutorial hier => Docker Multi-Container mit OpenSVC
verpassen Sie nicht die "komplexe Orchestrierung" - Teil am Ende des tuto, die Ihnen helfen können, start/Stopp-Behälter in der richtigen Reihenfolge (1 postgresql Teilmenge + 1 webapp Teilmenge + 1 nginx Teilmenge)
der größte Nachteil ist, dass Sie setzen webapp-und PostgreSQL-ports, um die öffentliche Adresse, und eigentlich nur die nginx tcp-port müssen in der öffentlichkeit ausgesetzt.
InformationsquelleAutor der Antwort user3757286
Könnte man auch versuchen, den Botschafter Methode, mit einem zwischengeschalteten Behälter für die Aufbewahrung der link intakt... (siehe https://docs.docker.com/articles/ambassador_pattern_linking/ ) für mehr info
InformationsquelleAutor der Antwort Gekkie
Können Sie binden Sie die ports, die von Ihren Bildern auf Feste ports auf dem host und die Dienste zu konfigurieren, verwenden Sie stattdessen.
Diese hat auch Nachteile, aber es kann Arbeit in Ihrem Fall.
InformationsquelleAutor der Antwort ivant
Andere alternative ist die Verwendung der
--net container:$CONTAINER_ID
option.Schritt 1: Erstellen Sie eine "Netzwerk" - Container
Schritt 2: Injizieren services in die "Netzwerk" - Container
Solange Sie nicht berühren Sie die "Netzwerk" - Container, der die IP-Adressen der links nicht ändern.
InformationsquelleAutor der Antwort user1202136
Netzwerk-Bereich alias ist, was Sie brauchen, ist in diesem Fall. Es ist eine relativ neue Funktion, die verwendet werden können, zu "veröffentlichen", einen container, eine Dienstleistung für das gesamte Netzwerk, im Gegensatz zu link-Aliase nur zugänglich von einem container.
Es nicht jede Art von Abhängigkeit zwischen den Behältern — Sie können kommunizieren, solange beide aktiv sind, unabhängig von Neustarts und Ersatz, und starten Bestellung. Es verwendet DNS, intern, glaube ich, anstelle von /etc/hosts
Verwenden Sie es wie diese:
docker run --net=some_user_definied_nw --net-alias postgres ...
und Sie eine Verbindung herstellen können, indem Sie einen alias aus alle container, die auf dem gleichen Netzwerk.Funktioniert nicht auf die Standard-Netzwerk, leider, haben Sie, um eine zu erstellen mit
docker network create <network>
und dann verwenden Sie es mit--net=<network>
für jeden container (verfassen Sie ebenfalls unterstützt).Neben-container als down und somit nicht erreichbar von alias-mehrere Container können auch ein alias in dem Fall ist es nicht garantiert, dass Sie gelöst werden, auf der rechten Seite ein. Aber in einigen Fällen, die helfen können, mit nahtloser upgrade, wahrscheinlich.
Es ist alles nicht sehr gut dokumentiert, wie der noch, schwer herauszufinden, nur durch das Lesen der man-page.
InformationsquelleAutor der Antwort Ivan Anishchuk