Wie in einem der Kommentare angegeben, funktioniert dies für Mac (wahrscheinlich auch für Windows/Linux):
ICH MÖCHTE VON EINEM CONTAINER ZU EINEM DIENST AUF DEM HOST VERBINDEN
Der Host hat eine sich ändernde IP-Adresse (oder keine, wenn Sie keinen Netzwerkzugriff haben). Wir empfehlen Ihnen, sich mit dem speziellen DNS-Namen host.docker.internal
zu verbinden die in die vom Host verwendete interne IP-Adresse aufgelöst wird. Dies dient Entwicklungszwecken und funktioniert nicht in einer Produktionsumgebung außerhalb von Docker Desktop für Mac.
Sie können das Gateway auch mit gateway.docker.internal
erreichen .
Zitiert von https://docs.docker.com/docker-for-mac/networking/
Das hat bei mir funktioniert, ohne --net=host
zu verwenden .
Ein einfacher, aber relativ unsicherer Weg wäre die Verwendung von --net=host
Option auf docker run
.
Diese Option bewirkt, dass der Container den Netzwerkstapel des Hosts verwendet. Dann können Sie sich mit Diensten verbinden, die auf dem Host ausgeführt werden, indem Sie einfach "localhost" als Hostnamen verwenden.
Dies ist einfacher zu konfigurieren, da Sie den Dienst nicht so konfigurieren müssen, dass er Verbindungen von der IP-Adresse Ihres Docker-Containers akzeptiert, und Sie müssen dem Docker-Container nicht nur eine bestimmte IP-Adresse oder einen bestimmten Hostnamen mitteilen, zu dem eine Verbindung hergestellt werden soll ein Port.
Sie können es zum Beispiel testen, indem Sie den folgenden Befehl ausführen, der davon ausgeht, dass Ihr Bild my_image
heißt , enthält Ihr Bild den telnet
und der Dienst, zu dem Sie sich verbinden möchten, befindet sich auf Port 25:
docker run --rm -i -t --net=host my_image telnet localhost 25
Wenn Sie erwägen, dies auf diese Weise zu tun, lesen Sie bitte den Sicherheitshinweis auf dieser Seite:
https://docs.docker.com/articles/networking/
Es heißt:
--net=host – Weist Docker an, das Platzieren des Containers in einem separaten Netzwerkstapel zu überspringen. Im Wesentlichen weist diese Auswahl Docker an, das Netzwerk des Containers nicht zu containerisieren! Während Container-Prozesse immer noch auf ihr eigenes Dateisystem und ihre eigenen Prozesslisten- und Ressourcengrenzen beschränkt sind, zeigt Ihnen ein schneller ip addr-Befehl, dass sie netzwerkmäßig „außerhalb“ im Haupt-Docker-Host leben und vollen Zugriff auf seine Netzwerkschnittstellen haben . Beachten Sie, dass der Container dadurch den Host-Netzwerkstapel nicht neu konfigurieren kann – das würde --privileged=true erfordern – aber Container-Prozesse lassen Ports mit niedrigen Nummern wie jeden anderen Root-Prozess öffnen. Es ermöglicht dem Container auch den Zugriff auf lokale Netzwerkdienste wie D-Bus. Dies kann dazu führen, dass Prozesse im Container unerwartete Dinge tun können, z. B. den Computer neu starten. Sie sollten diese Option mit Vorsicht verwenden.
Ihr Docker-Host stellt allen Containern einen Adapter zur Verfügung. Angenommen, Sie verwenden ein aktuelles Ubuntu, können Sie
ausführenip addr
Dadurch erhalten Sie eine Liste von Netzwerkadaptern, von denen einer in etwa so aussieht
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
link/ether 22:23:6b:28:6b:e0 brd ff:ff:ff:ff:ff:ff
inet 172.17.42.1/16 scope global docker0
inet6 fe80::a402:65ff:fe86:bba6/64 scope link
valid_lft forever preferred_lft forever
Sie müssen Rabbit/Mongo mitteilen, dass es sich an diese IP (172.17.42.1) binden soll. Danach sollten Sie in Ihren Containern Verbindungen zu 172.17.42.1 öffnen können.