2014-12-19 49 views
8

Ich habe ein paar Docker Containers und einen speziellen Fall, dass zwei von ihnen miteinander reden müssen, so dass sie einander am besten über Link kennen müssen. Ich kann einen Container mit dem anderen verbinden, aber das Problem ist, dass ich ihnen nicht sagen kann, dass der Zweite zum Ersten sprechen kann.Lassen Sie zwei Container miteinander verknüpft werden

Ich habe versucht, den ersten Container zu erstellen und auszuführen und gestoppt, dann habe ich den zweiten Container gestartet und gestoppt. Als nächstes startete ich den ersten Container mit der Verbindung zur zweiten und startete die zweite mit der ersten. Danach meine Maschine verrückt wurde der Docker-Prozess nahm alle CPU-und Arbeitsspeicher und keiner der Container war zugänglich. Als du den Prozess beendet hast, kam ein neuer mit dem gleichen heraus. Auch wenn ich Docker wieder deinstallierte den Computer neu gestartet und den Docker erneut installiert habe, geht es zurück in den verrückten Zustand, ohne auch nur einen der Container zu starten.

Hat jemand eine Lösung wie man zwei Container miteinander verbindet oder sie in beiden Richtungen miteinander reden lässt?

Antwort

15

Ein möglicher Ansatz, dass nicht Verwendung Verknüpfung ist, die Behälter zur Karte durch einen Port an jedem Behälter und die Bindung, die Behälter an den Host Schnittstelle freigelegt wird. 5555: 6666 und container2 kann container1 über localhost Zugriff:

docker run --net=host -p 127.0.0.1:5555:5555 --name container1 my/dockerimage1 
docker run --net=host -p 127.0.0.1:6666:6666 --name container2 my/dockerimage2 

Auf diese Weise container1container2 über localhost zugreifen können.

Dies ist nicht Verknüpfung, aber es gibt no way to do bidirectional linking.

Die documentation for docker networking erklärt dies weiter.

9

Ein anderer Ansatz besteht darin, die Container durch Verbinden der Ports mit der Schnittstelle docker0 zu verbinden. Alle Docker-Container sind standardmäßig mit dieser Bridge verbunden (die normalerweise die IP-Adresse 172.17.42.1 hat).

docker run -p 172.17.42.1:8001:8080 --name container1 [image] 
docker run -p 172.17.42.1:8002:8080 --name container2 [image] 

Die Behälter können miteinander über 172.17.42.1 zugreifen und den bestimmten Port.

Eine ähnliche Lösung wie @wassgreen bereitgestellt, hat aber den Vorteil, dass die Container keinen Zugriff auf die Hostschnittstellen haben.

Siehe Advanced networking Abschnitt --net=host:

[...] aber es ließ Containerprozesse offen Ports mit niedrigeren Nummern wie jeder andere Wurzel Prozess. Außerdem kann der Container auf lokale Netzwerkdienste wie D-Bus zugreifen. Dies kann dazu führen, dass Prozesse im Container unerwartete Dinge wie einen Neustart des Computers ausführen können. Sie sollten diese Option mit Vorsicht verwenden.

Weitere Informationen zu dieser Verbindung über die Schnittstelle docker0 finden Sie unter Unorthodox docker connection without links.

1

Überprüfen Sie die Option --link in Docker-Dokumenten. Sie können 2 Container mit folgendem Befehl verknüpfen:

$ docker run -i -t --name container_web --link container_db image_name 
+0

Dies löst das Problem nicht; es ermöglicht eine einseitige Kommunikation, während das OP eine wechselseitige Kommunikation wünscht. –

11

Container im selben Netzwerk sind miteinander verbunden.

Sie müssen ein Netzwerk für diese Container erstellen.

docker network create --driver bridge isolated_network 

Beim Ausführen der Container müssen Sie das Netzwerk angeben.

docker run -it --net=isolated_network --name container1 container1-image bash 
docker run -it --net=isolated_network --name container2 container2-image bash 

, nachdem Sie die Container erstellt wurden, können Sie andere Behälter im gleichen Netzwerk ping nur den Namen der Behälter mit

[email protected] ping container2 
[email protected] ping container1 
+1

kleiner Tippfehler: "- Treiberbrücke" – udo

+0

Danke @udo, ich habe es nicht gesehen –

+0

Dies ist die richtige Antwort. Der akzeptierte ist eine schlechte Übung. –

1

Die Brücke oder Host-Netzwerk funktioniert, wenn zwei Behälter auf demselben Host ausgeführt werden. Wenn zwei Container auf verschiedenen Hosts ausgeführt werden, können sie nicht miteinander kommunizieren.

Wenn zwei Container auf verschiedenen Hosts miteinander kommunizieren sollen, sollte der docker overlay network verwendet werden.

Das Andockfenster --link ist eine veraltete Funktion, wie unter docker links doc erwähnt.

Verwandte Themen