Bei Docker-Containern geht es nicht nur um Isolation – sie werden oft verwendet, um Prozesse zu verwalten, die dennoch direkt miteinander kommunizieren müssen. Aber um zu kommunizieren, müssen Sie oft die IP-Adresse jedes Containers kennen, die Sie mit ein paar Befehlen finden können.
Erwägen Sie die Verwendung einer benutzerdefinierten Bridge
Docker-Netzwerke sind etwas kompliziert. Standardmäßig gestartete Container werden im standardmäßigen „Brückennetzwerk“ platziert und dürfen direkt mit anderen Containern kommunizieren, vorausgesetzt, Sie haben ihre private IP-Adresse. Dies kann für eine echte Isolation deaktiviert werden, ist es aber nicht standardmäßig.
Sie können diese Adresse auch verwenden, um vom Host-Betriebssystem zu kommunizieren, wenn Sie keinen Port binden möchten. Dies ist der primäre Anwendungsfall für den direkten Zugriff auf einen Container über seine IP-Adresse, aber Sie sollten wahrscheinlich trotzdem nur einen Port binden (Sie können ihn in Ihrer Firewall für das Internet geschlossen halten).
IP-Adressen sind jedoch kurzlebig und können leicht beschädigt werden, wenn Container gestoppt und gestartet werden. Für die Kommunikation zwischen Containern bietet Docker eine Lösung über benutzerdefinierte Bridge-Netzwerke, die Sie wahrscheinlich verwenden sollten, wenn Sie mehrere Container haben, die miteinander kommunizieren.
Container, die zu nicht standardmäßigen Netzwerken hinzugefügt werden, können über ihren Alias aufeinander zugreifen, der automatisch in die private IP aufgelöst wird. Sie können neue Netzwerke erstellen, Container in diesen Netzwerken ausführen und vorhandene Container mit dem Netzwerk verbinden. Sie können dann auf die anderen Container zugreifen, indem Sie den Alias als Hostnamen verwenden; Beispielsweise kann der NGINX-Container hier mit der Verbindungszeichenfolge mongodb://mongohost:27017
auf die MongoDB-Instanz zugreifen .
docker network create example docker run --net example --name nginx -d nginx docker network connect example --alias mongohost mongodb
Die Verwendung von Bridges hat viele Vorteile und wird gegenüber dem alten --link
empfohlen Option, die im Standardnetzwerk funktioniert. Das Hauptproblem besteht darin, dass Container in benutzerdefinierten Netzwerken den Ports des anderen ausgesetzt werden, unabhängig davon, ob sie veröffentlicht sind, aber Sie können mehrere Netzwerke einrichten, sodass dies normalerweise kein Problem darstellt.
Der andere Nachteil ist, dass benutzerdefinierte Netzwerke, da sie eine bessere Isolierung bieten, Ihnen auch den Zugriff auf Container über Netzwerke hinweg mit ihrer privaten IP-Adresse verbieten. Alle Container im Standardnetzwerk können miteinander kommunizieren, aber sobald sie entfernt und in einem benutzerdefinierten Netzwerk platziert werden, ist diese Fähigkeit deaktiviert. Sie können den Container jedoch auch einfach sowohl in den Standard- als auch in den benutzerdefinierten Netzwerken starten, sodass es kein Problem darstellt, wenn Sie den Container für andere sichtbar machen möchten.
Beziehen der IP-Adresse von Docker
Wenn Sie jedoch nur die IP-Adresse möchten, ist es ziemlich einfach, sie vom Host-Betriebssystem zu erhalten. Zuerst müssen Sie die ID oder den Namen des Containers finden, für den Sie die Informationen erhalten möchten, was Sie tun können mit:
docker ps
Führen Sie dann docker inspect
aus , die eine riesige JSON-Datei mit allen Informationen über den Container zurückgibt. Wir sind jedoch nur an der IP-Adresse interessiert, sodass Sie ihr eine Formatierungsoption mit -f
übergeben können um es auf die Adresse einzugrenzen.
docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' name_or_id
Dieser Befehl funktioniert gut, gibt aber auch nur Informationen für einen Container zurück, dessen ID Sie benötigen. Wenn Sie eine konkretere Lösung wünschen, können Sie docker network inspect
verwenden die Informationen über alle Container im angegebenen Netzwerk ausgibt, optional als JSON-Lookup-Tabelle formatiert:
docker network inspect bridge -f '{{json .Containers}}'
Netzwerkkonfiguration aus dem Container abrufen
Docker-Container sind wirklich nur ein Isolationsmechanismus, und nichts hindert Sie daran, einfach den Container zu betreten und reguläre Linux-Befehle wie ifconfig
auszuführen und erhält so die IP-Adresse.
Dazu müssen Sie den Containernamen oder die ID mit docker ps
abrufen , und führen Sie dann exec -it
aus , in diesem Fall alle IP-Informationen ausdrucken:
docker exec -it b94ef3169cd4 ip a