Ich habe vor, meinen monolthischen Server in viele kleine Docker-Container aufzuteilen, habe aber noch keine gute Lösung für die "Kommunikation zwischen Containern" gefunden. Dies ist mein Zielszenario:
Ich weiß, wie man Container miteinander verbindet und wie man Ports freigibt, aber keine dieser Lösungen ist für mich zufriedenstellend.
Gibt es eine Lösung für die Kommunikation über Hostnamen (Containernamen) zwischen den Containern wie in einem herkömmlichen Servernetzwerk?
networking
docker
Patrick Gotthard
quelle
quelle
Antworten:
Bearbeiten: Nach Docker 1.9 wird der
docker network
Befehl (siehe unten https://stackoverflow.com/a/35184695/977939 ) empfohlen, um dies zu erreichen.Meine Lösung besteht darin, auf dem Host ein dnsmasq einzurichten, damit der DNS-Eintrag automatisch aktualisiert wird: "A" -Datensätze haben die Namen von Containern und verweisen automatisch (alle 10 Sekunden) auf die IP-Adressen der Container. Das Skript zur automatischen Aktualisierung wird hier eingefügt:
Stellen Sie sicher, dass Ihr dnsmasq-Dienst auf verfügbar ist
docker0
. Starten Sie dann Ihren Container mit--dns HOST_ADDRESS
, um diesen Mini-DNS-Dienst zu nutzen.Referenz: http://docs.blowb.org/setup-host/dnsmasq.html
quelle
Mit der neuen Netzwerkfunktion können Sie über ihren Namen eine Verbindung zu Containern herstellen. Wenn Sie also ein neues Netzwerk erstellen, kann jeder mit diesem Netzwerk verbundene Container andere Container über ihren Namen erreichen. Beispiel:
1) Erstellen Sie ein neues Netzwerk
2) Verbinden Sie die Container mit dem Netzwerk
oder
3) Ping-Container mit Namen
Siehe diesen Abschnitt der Dokumentation.
Hinweis: Im Gegensatz zu Legacy erstellt
links
das neue Netzwerk weder Umgebungsvariablen noch gibt es Umgebungsvariablen für andere Container frei.Diese Funktion unterstützt derzeit keine Aliase
quelle
docker-compose down,up,restart
?bridge
aus Gründen der Abwärtskompatibilität deaktiviert, aber ja, ich stimme zu, es sollte definitiv standardmäßig aktiviert sein!Das sollte sein , was
--link
für ist , zumindest für den Hostnamen Teil.Mit Docker 1.10 und PR 19242 wäre das:
(siehe letzten Abschnitt unten)
Das ist , was Aktualisierung der
/etc/hosts
Datei DetailsStarten Sie beispielsweise einen LDAP-Server:
Und definieren Sie ein Image, um diesen LDAP-Server zu testen:
Sie können den
openldap
Container als 'internalopenldap
' im Testbild mit --link verfügbar machen:Wenn Sie dann 'lds' eingeben, funktioniert dieser Alias:
Das würde die Leute zurückbringen. Die Bedeutung
internalopenldap
wird vomldaptest
Bild aus korrekt erreicht .Natürlich wird Docker 1.7 hinzugefügt
libnetwork
, das eine native Go-Implementierung zum Verbinden von Containern bietet. Siehe den Blog-Beitrag .Mit dem Container Network Model (CNM) wurde eine vollständigere Architektur eingeführt.
Dadurch wird die Docker-CLI mit neuen "Netzwerk" -Befehlen aktualisiert und dokumentiert, wie das "
-net
" -Flag verwendet wird, um Containern Netzwerke zuzuweisen.Docker 1.10 hat einen neuen Abschnitt Alias mit Netzwerkbereich , der jetzt offiziell dokumentiert ist in
network connect
:quelle
EDIT : Es ist nicht mehr auf dem neuesten Stand : http://blog.docker.com/2016/02/docker-1-10/
Ursprüngliche Antwort
Ich habe die ganze Nacht damit gekämpft. Wenn Sie keine Angst vor dem neuesten Stand haben , implementieren die neueste Version der Docker-Engine und Docker Compose beide libnetwork.
Mit der richtigen Konfigurationsdatei (die in Version 2 eingefügt werden muss) erstellen Sie Dienste, die sich alle sehen. Und als Bonus können Sie sie auch mit Docker-Compose skalieren (Sie können jeden gewünschten Dienst skalieren, der den Port auf dem Host nicht bindet).
Hier ist ein Beispiel - Datei
Und die Referenz für diese neue Version der Compose-Datei: https://github.com/docker/compose/blob/1.6.0-rc1/docs/networking.md
quelle
Soweit ich weiß, ist dies nicht möglich, wenn nur Docker verwendet wird. Sie benötigen DNS, um Container-IP: s Hostnamen zuzuordnen.
Wenn Sie eine sofort einsatzbereite Lösung wünschen. Eine Lösung besteht darin, beispielsweise Kontena zu verwenden . Es wird mit der Netzwerk-Overlay-Technologie von Weave geliefert. Diese Technologie wird verwendet, um virtuelle private LAN-Netzwerke für jeden Dienst zu erstellen, und jeder Dienst kann von erreicht werden
service_name.kontena.local-address
.Hier ist ein einfaches Beispiel für die YAML-Datei der Wordpress-Anwendung, in der der Wordpress-Dienst eine Verbindung zum MySQL-Server mit der Adresse wordpress-mysql.kontena.local herstellt:
quelle