Moby: Dokumentieren Sie, wie Sie vom Container aus eine Verbindung zum Docker-Host herstellen

Erstellt am 5. Juli 2013  ·  263Kommentare  ·  Quelle: moby/moby

Ich hatte einige Probleme herauszufinden, wie ich den Docker-Host vom Container aus verbinden kann. Konnte keine Dokumentation finden, fand aber IRC-Protokolle, die etwas über die Verwendung 172.16.42.1 sagten, was funktioniert.

Es wäre schön, wenn dieses Verhalten und seine Beziehung zu docker0 dokumentiert würden.

Hilfreichster Kommentar

Ich denke, die Anforderung geht aus dem Titel des Problems hervor. Es muss eine einfache und gut dokumentierte Möglichkeit geben, vom Container aus mit dem Host zu kommunizieren, wie auch immer sie implementiert ist.

Alle 263 Kommentare

Wenn Sie in network.go nachsehen, finden Sie, dass Docker nach internen Netzwerken sucht, die nicht geroutet werden.

zuerst wird 172.16.42.1 als Bridge-Adresse erraten, dann andere.

Das Dokumentieren wird also nicht viel helfen. Es ist ein dynamisches Schema, auf das Sie sich nicht verlassen können.

Ich denke, was Sie benötigen, ist eher eine Möglichkeit, die für Bridge und Client verwendeten Adressen zu definieren.
könnte das sein?

Ich denke, die Anforderung geht aus dem Titel des Problems hervor. Es muss eine einfache und gut dokumentierte Möglichkeit geben, vom Container aus mit dem Host zu kommunizieren, wie auch immer sie implementiert ist.

+1 Es wäre wirklich schön, eine gute Möglichkeit zu haben, eine Verbindung zum Hostsystem herzustellen

+1 wird der 1.0-Zweig eine Introspektion-API definieren, sodass jeder Container auf begrenzte und kontrollierte Weise mit dem Host interagieren kann.

Dies ist derzeit für 0.8 geplant.


@solomonstr
@getdocker

Am Do, 8. August 2013 um 13:10 Uhr, EJ Bensing [email protected]
schrieb:

+1 Es wäre wirklich schön, eine gute Möglichkeit zu haben, eine Verbindung zum Hostsystem herzustellen

Antworten Sie direkt auf diese E-Mail oder sehen Sie sie auf GitHub an:
https://github.com/dotcloud/docker/issues/1143#issuecomment -22351792

Wie kann ich also von einem Container aus eine Verbindung zum Docker-Host herstellen? Ich versuche, über den Host-Port und nicht über die private IP des Containers eine Verbindung zu einem Docker-Container herzustellen.

@gerhard : eine Introspection API ist für 0.8 geplant. Wenn Sie in der Zwischenzeit von den Containern aus auf die Docker-API zugreifen möchten, können Sie Docker so einrichten, dass es die IP-Adresse der Docker-Bridge abhört.

Dazu würden Sie:

  • eine Brücke bauen

ip link add docker0 type bridge

  • ihm eine IP-Adresse zuweisen

ip link set docker0 up
ip addr add 172.17.0.1/16 dev docker0

  • Docker starten und die API an die Bridge binden

docker -d -H 172.17.0.1:4242

Jetzt können Sie von Ihren Containern aus auf die Docker-API zugreifen.

Derzeit (Version 0.7) unterstützt Docker nicht zuverlässig das Gewähren von unbegrenztem Zugriff auf seinen eigenen Steuer-Socket für einen seiner Container. Die in diesem Thread erklärten Problemumgehungen sind Hacks, die nicht garantiert funktionieren, und wenn sie funktionieren, könnten sie jederzeit kaputt gehen - bitte verwenden Sie sie nicht in der Produktion oder erwarten Sie, dass wir sie unterstützen. Da es keine offizielle Funktion zum Dokumentieren gibt, kann dieses Dokumentproblem nicht behoben werden.

Um Hacks und Problemumgehungen für fehlende Funktionen zu diskutieren, empfehle ich entweder die Mailingliste _docker-user_ oder den _#docker_ IRC-Kanal auf Freenode.

Fröhliches Hacken

@shykes Gibt es in diesem Fall ein anderes Problem, das die Erstellung einer solchen Funktion verfolgt?

Übrigens, um eine Motivation für ein solches Feature zu geben: Dies ist nützlich, wenn ich lokal einen Server teste (wo ich in der Vergangenheit vagrant verwendet hätte) und ich einen Server im Container mit einer Datenbank oder einem anderen Server verbinden möchte, auf dem ausgeführt wird meine Entwicklungsmaschine (der Docker-Host).

Ich bin bereits vom Wert dieser Funktion überzeugt :)

Am Montag, 2. Dezember 2013 um 9:09 Uhr, Caleb Spare [email protected]
schrieb:

Übrigens, um eine Motivation für ein solches Feature zu geben: Dies ist nützlich, wenn ich lokal einen Server teste (wo ich in der Vergangenheit vagrant verwendet hätte) und ich einen Server im Container mit einer Datenbank oder einem anderen Server verbinden möchte, auf dem ausgeführt wird meine Entwicklungsmaschine (der Docker-Host).

Antworten Sie direkt auf diese E-Mail oder sehen Sie sie auf GitHub an:
https://github.com/dotcloud/docker/issues/1143#issuecomment -29636528

Ich bin auf Fedora 20 mit Docker 0.7.2 und richte Docker UI ein. Ich musste den Port öffnen, auf dem der Docker-Daemon lauscht, damit die Firewall ihn nicht blockiert:

  • firewall-cmd --permanent --zone=trusted --add-interface=docker0
  • firewall-cmd --permanent --zone=trusted --add-port=4243/tcp

Danach konnte _docker-ui_ eine Verbindung zum Docker-Daemon-Steuer-Socket herstellen.

HTH
Dies ist ein klarer und legitimer Bedarf für eine solche Funktion.

Tut mir leid, wenn ich einen eingefleischten Thread am Leben halte.

Der Titel dieser Ausgabe lautet: "How to connect to host from docker container".
Ich sehe nicht, wie dies mit der Funktion docker inspect zusammenhängt. Die Inspect-Funktion wird auf der Hostseite verwendet, um die IP des Containers zu finden, wenn ich mich nicht irre.

Ich denke, das Problem von bkad besteht darin, die Host-IP aus dem Container heraus zu finden. Zugegeben, ich bin kein Netzwerkassistent, aber es ist nicht ziemlich sicher anzunehmen, dass das IP-Gateway (aus dem Container) dem Host zugeordnet ist.
(Vorausgesetzt, man konfiguriert kein Bridge-Setup oder so).

Mit dem Gateway für 0.0.0.0 von netstat -nr hatte ich sicherlich keine Probleme, einen Server zu erreichen, der auf meinem Host-Rechner läuft. Ich vermute, dass die Gateway-IP statisch ist (sobald Docker gestartet ist), kann das jemand bestätigen?

Eine Alternative wäre, die öffentliche IP-Adresse meines Hosts mithilfe von Umgebungsvariablen an den Container zu übergeben, aber die öffentliche IP-Adresse ist möglicherweise nicht statisch. Und obwohl Hostnamen in der Produktion besser funktionieren, sind sie lokal schwer zu verwenden.

Ich würde immer noch eine Möglichkeit bevorzugen, vom Docker-Container den Host über den Loopback anzurufen und auf dem Host als 127.0.0.1 zu erscheinen. Oder wenn die Sicherheit ein Problem darstellt, ein anderes Loopback-Gerät, das immer dieselbe IP hat.
Oder macht das Ding, das ich gefunden habe, meine Kommunikation nicht öffentlich? Wie gesagt ich bin kein Netzwerkmagier :)
Beachten Sie, wenn die Verwendung von ip-gateway zum Aufrufen des Docker-Hosts der "richtige Weg" ist, können wir das nicht dokumentieren?

Für diejenigen, die die Gateway-IP von Container /proc/net/route finden möchten, ist dies wahrscheinlich der richtige Ort, um sie zu lesen.

Die Motivation für dieses Feature umfasst verschiedene Metadatendienste. Das Offenlegen von Dingen aus dem ec2-Metadatendienst wäre schön. Verteilung von Anmeldeinformationen und komplexer strukturierten Daten, die nicht in Umgebungsvariablen passen.

@jonasfj : Es gibt tatsächlich einen einfacheren Weg, jetzt, da Docker Bind-Mounting-Dateien von Host zu Container unterstützt. Sie können den Docker-Steuerungs-Socket per Bind-Mount bereitstellen, dh: docker run -v /var/run/docker.sock:/var/run/docker.sock … ; das ist einfacher, als mit Netzwerkregeln herumzuspielen.

Ich bin mir nicht sicher, wie die Docker-Buchse hilft. Ich denke immer noch, dass das Problem erneut geöffnet werden sollte, es gibt keine Dokumentation für das folgende Szenario:

1) Auf dem 'Host' läuft ein Dienst auf Port 8080 (z. B. 'etcd')
2) Von diesem Host aus wird ein Docker-Container gestartet
3) Wie kann der Dienst auf Port 8080 auf dem Host vom Docker-Container aus erreicht werden? Wie wäre die URL/IP?

@jpetazzo Wie kommt das Setzen von docker.sock ins Spiel, um das obige Problem zu lösen?

@vrvolle , das Freilegen docker.sock löst nicht das ursprüngliche Problem, das von @bkad beschrieben wurde.
Aber man würde einen anderen Unix-Domain-Socket für die Kommunikation zwischen Host und Docker-Container verfügbar machen.

Wenn Sie beispielsweise mysql vom Host verfügbar machen möchten, würden Sie den mysql-Socket verfügbar machen: /tmp/mysql.sock .

Oder wenn Sie wie ich eine Metadaten-API haben, über die Container den Host nach verschiedenen nützlichen Dingen abfragen können, erstellen Sie Ihren eigenen Unix-Domain-Socket und stellen ihn dem Container zur Verfügung. HTTP über Unix-Domain-Sockets sollte sehr gut funktionieren. Außerdem haben Sie nicht alle Netzwerkkonfigurationsprobleme und Sicherheitsprobleme.

musste nur nach 'unix domain sockets' lesen.
aber:

http://stackoverflow.com/questions/14771172/http-over-af-unix-http-connection-to-unix-socket

behauptet, dass es keine URL gibt und daher kein normaler Client diesen Mechanismus sofort verwenden kann.

Andererseits:

http://stackoverflow.com/questions/14771172/http-over-af-unix-http-connection-to-unix-socket

zeigt, dass es irgendwie möglich ist, eine solche Buchse zu verwenden.

Trotzdem möchte ich einfach eine IP-Adresse und einen Port haben, die ein Programm in einem Docker einfach verwenden könnte. Ich werde – vorerst – verwenden

 netstat -nr | grep '^0\.0\.0\.0' | awk '{print $2}'

Soll ich ein neues Problem erstellen oder kann jemand dieses wieder öffnen?

@vrvolle
Ich bin kein Netzwerktyp, aber ich stelle mir vor , dass es einige Tricks gibt, die man anwenden kann, um localhost über einen Unix-Socket in den Container zu leiten und dann innerhalb des Container-Proxy-Unix-Sockets zum Container-localhost (Loopback-Gerät) ...

Es wäre schön zu dokumentieren, wie man das macht. Aber es scheint, dass es nicht unbedingt ein Feature ist, das Docker aktiv unterstützen muss.

Es gibt mehrere Möglichkeiten, dies anzugehen, je nachdem, was genau Sie erreichen möchten.

Wenn Sie eine Verbindung zu einem Dienst herstellen möchten, der auf dem Host ausgeführt wird (jede Art von Dienst, z. B. eine API oder Datenbank, die direkt auf dem Host ausgeführt wird), müssen Sie die IP-Adresse des Hosts herausfinden.

Eine Möglichkeit besteht darin, sich darauf zu verlassen, dass der Docker-Host über die Adresse der Docker-Bridge erreichbar ist, die zufällig das Standard-Gateway für den Container ist. Mit anderen Worten, ein cleveres Parsen von ip route ls | grep ^default könnte in diesem Fall alles sein, was Sie brauchen. Natürlich hängt es von einem Implementierungsdetail ab (das Standard-Gateway ist zufällig eine IP-Adresse des Docker-Hosts), das sich in Zukunft ändern könnte.

Eine andere Möglichkeit besteht darin, die Docker-API zum Abrufen dieser Informationen zu verwenden. Dann wird das Problem zu „Wie verbinde ich mich von einem Container aus mit der /var/run/docker.sock -API? der Kontainer. Dies hat einen großen Nachteil: Die API wird vollständig für den Container verfügbar, der möglicherweise schlechte Dinge damit anstellt.

Langfristig wird Docker eine bessere Introspektion-API bereitstellen, die es ermöglicht, auf diese Informationen zuzugreifen, ohne zu viele Privilegien an die Container abzugeben.

TL,DR: Kurzfristig die Standardroute des Containers prüfen. Langfristig wird es eine großartige Selbstbeobachtungs-API geben.

Ich habe auch ein Problem wegen Emporkömmling. Ich kann nichts in /var/run/docker.sock finden. und den Befehl "-v /etc/run/docker.sock:/etc/run/docker.sock" verwendet, aber nichts ist passiert.
Ich denke, das Problem ist auf einige neue Updates zu den Fähigkeiten des Kernels zurückzuführen. Bitte geben Sie mir eine kurze Anmerkung zu diesem Thema. und vollständigen Befehl, um dies zu lösen. Danke

Verwenden Sie -v /var/run/docker.sock - nicht /etc (das normalerweise für conf-Dateien reserviert ist).

Gibt es dazu in der neuen Version 1.0.0 ein Update?

Es gibt nsenter - aber ich denke, der empfohlene Weg ist, sshd dazu auszuführen
Bühne.

Am Freitag, den 13. Juni 2014, schrieb Camilo Aguilar [email protected] :

irgendwelche Neuigkeiten dazu in der neuen Version 1.0.0?


Antworten Sie direkt auf diese E-Mail oder zeigen Sie sie auf GitHub an
https://github.com/dotcloud/docker/issues/1143#issuecomment -45958769.

Michael D. Neale
Startseite: www.michaelneale.net
blog: michaelneale.blogspot.com

vrvolle, danke dafür. Viele Leute wie wir suchen nach einem kleinen Leckerbissen wie diesem

netstat -nr | grep '^0\.0\.0\.0' | awk '{print $2}'

Docker aktualisiert automatisch /etc/hosts auf jedem Container mit der Host-IP, z. B. 172.17.42.1 und nennt es beispielsweise dockerhost , wäre eine praktische Lösung.
Ich schätze, im Moment stecken wir bei netstat -nr | grep '^0\.0\.0\.0' | awk '{print $2}' fest

+1 für dockerhost in /etc/hosts

+1 für dockerhost in /etc/hosts, klingt nach einer guten Idee

Das Bearbeiten einer Datei in einem Bild sollte niemals durchgeführt werden, es sei denn, Sie geben ausdrücklich ein Argument oder eine Markierung dafür an. Außerdem ist es nicht zwingend erforderlich, dass 100 % der Bilder dem LSB folgen, sodass möglicherweise nicht einmal ein /etc -Verzeichnis vorhanden ist. Der Dateiname, der verwendet werden soll, um die Host-IP zu enthalten, sollte auch durch das Befehlsargument angegeben werden.

docker --host /etc/hosts

+1 für dockerhost in /etc/hosts

+1 für einen /ec/hosts-Eintrag

@Sepero Docker füllt /etc/hosts bereits mit den verknüpften Containern, sodass Ihre Argumente nicht wirklich gelten.

@matleh Das stimmt, aber ich denke, der richtige Weg ist, /etc/hosts nicht direkt zu füllen oder uns zumindest den Speicherort anzugeben, falls wir ihn nicht haben.

Wie auch immer, dockerhost-Eintrag in hosts.

Ich möchte auch die Docker-Host-IP in /etc/hosts haben.

+1 auf Docker-Host-IP in /etc/hosts

Vielleicht wäre ein besserer Weg, den Zugriff auf Netzwerkdienste auf dem Host zu erleichtern, es einfach zu machen, iptables-Einträge einzurichten, die Ports in umgekehrter Richtung weiterleiten, dh vom Container zum Host. Ich denke, die Option -p oder --publish würde gut durch eine Option -s oder --subscribe ergänzt, die den umgekehrten Effekt hat. Ich denke, ich hätte sie aber --forward und --reverse genannt. Wie auch immer Sie es nennen, dies scheint mir ein viel konsequenterer Ansatz zu sein als die anderen Vorschläge hier.

Dies mag offensichtlich sein, aber eine einfache Möglichkeit, dies zu tun, die derzeit funktioniert und möglicherweise weniger implementierungsabhängig ist, besteht darin, die IP-Adresse auf dem Host zu ermitteln, bevor der Container gestartet wird, und eine Umgebungsvariable im Container entsprechend festzulegen. Entlang dieser Linien:

#!/bin/bash
HOSTNAME=$(hostname)
HOST_IP=$(ip route | awk '/docker/ { print $NF }')
docker run -e HOST=$HOSTNAME -e HOST_PORT=tcp://$HOST_IP:8000 mycontainer

Dies wäre im Wesentlichen parallel zu der Funktionsweise --link . Es hängt immer noch davon ab, dass die Bridge einen Namen hat, der mit /docker/ übereinstimmt, und dass es nur eine solche Bridge gibt, aber die Bridge wird gesetzt, wenn der Docker-Daemon gestartet wird. Es wäre schön, wenn docker info uns den Namen der verwendeten Bridge und/oder die Host-IP-Adresse geben würde. Ein anderer Gedanke wäre, eine --link-host PORT -Option zu docker run hinzuzufügen, was im Wesentlichen das Obige tun würde.

IMO ist dies die beste Option. Mit --link-host müsste der Container nicht wissen, ob sich der Dienst, auf den er zugreift, auf dem Host oder in einem anderen Container befindet.

Ich bin mir nicht sicher, wie andere ihre Container aufrufen, aber wenn ich sie mit --net=host ausführe, kann ich das gleiche Netzwerk-Setup wie mein Docker-Host sehen. Ohne diesen Schalter erhalte ich einen eigenständigen Netzwerk-Stack, wie in den docker-run Manpages beschrieben.

$ docker run -i --net=host fedora ip route ls
default via 10.0.2.2 dev eth0  metric 1
10.0.2.0/24 dev eth0  proto kernel  scope link  src 10.0.2.15
127.0.0.1 dev lo  scope link
172.17.0.0/16 dev docker0  proto kernel  scope link  src 172.17.42.1
192.168.59.0/24 dev eth1  proto kernel  scope link  src 192.168.59.103

Das Ausführen ohne den Schalter ergibt Folgendes:

$ docker run -i fedora ip route ls
default via 172.17.42.1 dev eth0
172.17.0.0/16 dev eth0  proto kernel  scope link  src 172.17.0.4

Was wir suchen, ist eine Methode, um die IP-Adresse von entweder 10.0.2.15 (die IP der eth0-i/f meines Docker-Hosts) oder 172.17.42.1 (die IP der docker0-Bridge-i/f meines Dockers) abzurufen.

Ich interessiere mich nicht besonders für den Ansatz, meiner Containerdatei /etc/hosts einen Host hinzuzufügen, das scheint mir ein bisschen abgehackt zu sein. Es scheint mir der klügere Weg zu sein, diese Informationen intern verfügbar zu machen, damit ich sie bei Bedarf abrufen kann.

+1 für --link-host oder auf andere intuitive Weise

+1 für einen /etc/hosts-Eintrag
Scheint ziemlich bequem zu sein und folgt den aktuellen Kommunikationskonventionen.

Nur um meine früheren Kommentare zu verdeutlichen: Das Tolle an --link <container>:<alias> ist, dass es einen _Dienst_ durch einen _Alias_ verfügbar macht. Ebenso sollte ein Mechanismus, um den Host dem Container zugänglich zu machen, Zugriff auf einen bestimmten Dienst bieten, nicht nur auf eine IP-Adresse. Der Container würde über einen Alias ​​auf diesen Dienst zugreifen; es sollte nicht wissen müssen, wo sich der Dienst wirklich befindet. Die Option sollte die umgekehrte Semantik von -p haben und sich wie --link verhalten. Mit anderen Worten, --link-host <ip address>:<port>:<alias> würde env-Variablen und einen /etc/hosts -Eintrag einrichten und iptables-Einträge nach Bedarf einrichten, dh wenn der Dienst auf dem Host eine IP-Adresse abhört, auf die ansonsten nicht zugegriffen werden kann zum Behälter.

@altaurog Wie wäre es mit so etwas?

docker run --name someservice -d host-exposing-image --expose 8000

someservice wäre nur ein beliebiger Name, auf den Sie dann --link zuordnen können, und host-exposing-image wäre ein spezielles Bild, das Host-Ports auf exponierten Ports weiterleitet. Wahrscheinlich wäre die Idee umsetzbar, indem man die /var/run/docker.sock des Hosts mit dem Bild teilt.

Vielleicht gibt es sowas schon, keine Ahnung.

Bearbeiten:

docker run --name someservice -d --expose 8000 host-exposing-image

Vergiss das Obige, habe nicht alle Kommentare hier gelesen (immer noch nicht). Folgendes funktioniert für mich auf docker-osx (und es tut mir leid, dass ich nicht stattdessen auf der Mailingliste gepostet habe):

docker run --rm -ti -e HOST_IP="$(docker-osx ssh -c 'route -n' 2> /dev/null |
  awk '/^0.0/ { print $2 }')" debian:jessie

+1. --link-host ist eine gute Idee, ebenso wie nur einen dockerhost Eintrag in /etc/hosts zu haben

Ich habe ein neues Problem erstellt, da dieses Problem geschlossen (aber nicht gelöst) wurde: #8395

+1 für dockerhost oder auf andere bequeme Weise.

+1 für jeden bequemen Weg

Da der dockerhost -Ansatz hier einige Stimmen erhielt, ist der einfachste Weg, den ich gefunden habe (aus den Kommentaren zu den 3 verwandten Problemen #8395 #10023), einen solchen Hosts-Eintrag zu haben, das Argument --add-host=dockerhost:$(ip route | awk '/docker0/ { print $NF }') hinzuzufügen beim Ausführen des Bildes, zB:

run --add-host=dockerhost:$(ip route | awk '/docker0/ { print $NF }')  ubuntu ping -c2 dockerhost

Während dies den erforderlichen /etc/hosts-Eintrag hinzufügt, ist es immer noch eine Schande, dass dockerhost nicht standardmäßig vorhanden ist. Beim Verteilen eines Bildes habe ich die Wahl zwischen beiden

  • Weisen Sie die Benutzer an, den obigen Parameter hinzuzufügen
  • Lassen Sie einige Skripte im Container laufen, die die Konfigurationsdateien basierend auf der Routing-Tabelle anpassen

Ich persönlich verstehe nicht, warum dockerhost nicht standardmäßig vorhanden ist, es würde die Erstellung und Verteilung von Bildern, die auf Dienste zugreifen, die normalerweise auf dem Host (XServer, CUPS, Puleaudio) stattfinden, so viel bequemer machen.

+1 für dockerhost. Ich würde dies tatsächlich sowohl als env var, /etc/hosts-Eintrag als auch als cli-Flag verfügbar machen. Es ist bestimmt vielseitig einsetzbar.

:+1: für dockerhost

in deinem Container:

cat << EOF > /etc/profile.d/dockerhost.sh
 grep dockerhost /etc/hosts || echo $(ip r ls | grep ^default | cut -d" " -f3) dockerhost >> /etc/hosts
EOF

funktioniert für mich, wenn ich mich anmelde (mit root-Konto)

+1 für dockerhost

+1 für dockerhost

+1 für dockerhost

+1 für dockerhost

+1 für dockerhost :yum:

+1 für dockerhost

+1 für dockerhost :+1:

Am Ende schrieb ich dieses Skript, jemand könnte es nützlich finden:

#!/bin/bash

SED="$(which sed)"
NETSTAT="$(which netstat)"
GREP="$(which grep)"
AWK="$(which awk)"
CAT="$(which cat)"


$SED '/dockerhost$/d' /etc/hosts > /etc/hosts.tmp
DOCKERHOST="$($NETSTAT -nr | $GREP '^0\.0\.0\.0' | $AWK '{print $2}')"

echo "$DOCKERHOST dockerhost" >> /etc/hosts.tmp

$CAT /etc/hosts.tmp > /etc/hosts

rm -rf /etc/hosts.tmp

+1 Dockerhost

Da es ein großes Interesse an diesem Thema gibt, denke ich, dass es sinnvoll wäre, anstatt ein geschlossenes Ticket zu diskutieren, eine neue Feature-Anfrage zu eröffnen.

Ich habe vor einiger Zeit https://github.com/docker/docker/issues/8395 geöffnet – ebenfalls geschlossen. Immer noch keine dokumentierte Lösung

ok, obwohl es Workarounds gibt, denke ich, dass der Hauptgrund wahrscheinlich darin besteht, dass der Zugriff auf den Host ein teilweise isolierter Anwendungsfall ist.

Da es eine Docker-Links-Funktion gibt, würde ich vermuten, dass es sinnvoll ist, einen Link zum Host bereitzustellen.

Hallo!

FYI dies ist jetzt dokumentiert :

Hinweis: Manchmal müssen Sie eine Verbindung zum Docker-Host herstellen, was bedeutet, dass Sie die IP-Adresse des Hosts abrufen müssen. Sie können die folgenden Shell-Befehle verwenden, um diesen Vorgang zu vereinfachen:

$ alias hostip="ip route show 0.0.0.0/0 | grep -Eo 'via \S+' | awk '{ print \$2 }'"
$ docker run --add-host=docker:$(hostip) --rm -it debian

Danke, @icecrime.

Kann eine Docker-Person dieses Problem bitte sperren, damit die Leute es nicht mehr aktualisieren?

+1 für dockerhost

+1 für dockerhost - das Ausführen eines lokalen Befehlsalias hostip ist nicht kompatibel mit z. B. Docker-Compose, Docker-Swarm usw. usw.

+1 für dockerhost

@icecrime , das gibt das Host-Gateway und nicht die Host-IP auf meinem Ubuntu an. Sollte es nicht nur der folgende Befehl sein?

$ ip address show

+1, etwas Brauchbares, ohne Befehle ausführen zu müssen, wäre ideal

Wie ist das immer noch ungelöst? Das Ausführen von Befehlen in einem Container, um das Container-to-Host-Networking funktionsfähig zu machen, ist völlig inakzeptabel.

+1 für alles Einfache
Übrigens funktioniert die Problemumgehung mit ip auf meinem Ubuntu, aber nicht auf OS X, oder?

+1 Dies ist eine 2 Jahre alte Ausgabe und eine nützliche Funktion. Ich möchte eine einfache Möglichkeit, von innerhalb eines Containers aus eine Verbindung zur Docker-Remote-API herzustellen.

@ianchildress Wenn Sie Ihren Daemon so konfiguriert haben, dass er Socket-Verbindungen akzeptiert, binden Sie einfach den Socket in Ihren Container ein, z. B. docker run -d -v /var/run/docker.sock:/var/run/docker.sock myimage

+1 für dockerhost
Dieses Problem wurde beim Durchsuchen von Lösungen für den Anwendungsfall gefunden: xdebug.remote_host=dockerhost

+1 für dockerhost

@thaJeztah und wie komme ich von dort zum Hostnamen oder zur IP-Adresse?

@mbonaci Ich habe @ianchildress geantwortet , die eine Verbindung zur Docker-API innerhalb eines Containers herstellen wollte (für die die Verwendung einer Socket-Verbindung der allgemeine Ansatz ist).

Ich bin verwirrt. @icecrime hat oben gesagt, dass dies jetzt dokumentiert ist, aber der Link, den er gegeben hat, ist tot. Ich kann den zitierten Teil der Dokumentation nicht schnell finden. Ich stelle fest, dass das apt-cache-ng-Beispiel Dockerhost verwendet, aber nicht definiert, was es ist (#11556). Die einzige Referenz, die ich leicht finden konnte, war dieser Thread. Ich habe die gesamte Quelle und Dokumentation von Docker durchsucht und scheint in diesem Zusammenhang nicht erwähnt zu werden .

@pwaller Seit März haben wir dieses riesige lange Dokument in separate Referenzen aufgeteilt. Der neue Speicherort für dieses Material ist:

http://docs.docker.com/reference/commandline/run/#adding -entries-to-a-container-hosts-file

+1 für dockerhost

@moxiegirl Ich denke, der Parameter --add-host ist zufriedenstellend. Danke

Und wie stellt man vom Docker-Container aus eine Verbindung zum Host her? Zum Beispiel, um Git Pull zu machen? Ohne Volumen verwenden?

@a93ushakov es ist alles in dem Link erklärt, den @moxiegirl bereitgestellt hat.
Wenn Sie docker run ausführen, fügen Sie den folgenden Parameter hinzu: --add-host=dockerhost:replace_with_docker_host_ip , wodurch ein Eintrag in der Datei /etc/hosts des Containers erstellt wird.
Was natürlich bedeutet, dass Sie von diesem Container aus mit seinem Namen dockerhost auf Ihren Docker-Host verweisen können.

@mbonaci > Was natürlich bedeutet, dass Sie von diesem Container aus mit seinem Namen Dockerhost auf Ihren Docker-Host verweisen können.

Per ssh?

@thaJeztah > Wenn Sie Ihren Daemon so konfiguriert haben, dass er Socket-Verbindungen akzeptiert, ...
Wie macht man das?

@ a93ushakov SSH: Wenn Sie es auf dem Host installiert haben und ausführen (und sein Port nicht blockiert ist), ja.

@a93ushakov @thaJeztah bezieht sich auf die Unix-Socket-Verbindung. Ich denke, das ist die Standardeinstellung - sehen Sie, ob Sie eine Datei /var/run/docker.sock auf Ihrem Host haben.

+1 für dockerhost

+1 für dockerhost

+1 für dockerhost

+1 für dockerhost
Es wäre schön, diesen Hostnamen ohne zusätzliche Schritte zu erhalten.

1 für dockerhost

+1 für dockerhost

Scheinbar kann keine Verbindung zum Docker-Host aus einem Container heraus hergestellt werden. Irgendwelche Ideen, was ich falsch mache?

$ hostip=$(ip route show 0.0.0.0/0 | grep -Eo 'via \S+' | awk '{ print $2 }')
$ nc -l -p 1234 &
[1] 17361
$ docker run --add-host=docker:$(hostip) --rm -it hiromasaono/curl curl docker:1234
curl: (7) Failed to connect to docker port 1234: Connection refused

+1 für dockerhost

Wenn ich die IP der Docker Bridge hinzufüge, funktioniert es.

Hören Sie zuerst auf Port 1234 mit netcat

$ nc -l -p 1234

Holen Sie sich die IP der Bridge

$ ifconfig docker0 | grep 'inet addr'
          inet addr:172.17.42.1  Bcast:0.0.0.0  Mask:255.255.0.0

Dann verbinden

$ docker run --add-host=docker:172.17.42.1 --rm -it hiromasaono/curl curl 172.17.42.1:1234

Dann sehe ich die Antwort

GET / HTTP/1.1
User-Agent: curl/7.35.0
Host: 172.17.42.1:1234
Accept: */*

+1 für dockerhost
Verdammt, wann?

+1 für Dockerhost, das auch auf Mac funktioniert, dh die VM transparent handhabt

Könnte mir bitte jemand sagen, wie ich die Docker-API aus dem Container heraus aufrufen werde? Ich bin kein Linux-Typ. Container habe ich bereits mit -v /var/run/docker.sock:/var/run/docker.sock gestartet.
Jeder spricht darüber, wie man den Mount macht, aber niemand hat erwähnt, wie man api im Inneren aufruft.

Ich habe versucht, mit curl anzurufen, es hat nicht funktioniert. Ich habe die Host-IP zB verwendet

curl -XGET http://hostip :2375/images/json

So habe ich meinen Daemon gestartet. dh docker -H unix:///var/run/docker.sock -H tcp://0.0.0.0 :2375

Jede Hilfe wird sehr geschätzt.

@jprogn der Github Issue Tracker ist nicht für allgemeine Support-Fragen gedacht; Es ist besser, diese Fragen im IRC-Kanal #docker, der docker-users-Gruppe bei Google oder forums.docker.com zu stellen

Diese Frage bezieht sich auf das ursprüngliche Thema, das nicht vollständig beantwortet wurde. Siehe Titel oben

Kann jemand bitte antworten, wie man die Docker-API aus dem Container heraus aufruft??????????????

@jprogn bitte folge meinem Kommentar oben; dies ist ein Problem-Tracker, der zum Verfolgen von Fehlern und Funktionsanfragen verwendet wird; kein Support-Forum für die Verwendung von Docker; Verwenden Sie die anderen Methoden, die ich oben erwähnt habe https://github.com/docker/docker/issues/1143#issuecomment -146924892

+1 für dockerhost

Auf meinem CentOS7-Docker-Host kann ich keine Route vom Container zum Host erhalten:

[root@docker-host-fkb slehmann]# ifconfig docker0 | grep 'inet'

inet 172.17.42.1  netmask 255.255.0.0  broadcast 0.0.0.0
inet6 fe80::42:a7ff:fe4d:4cb2  prefixlen 64  scopeid 0x20<link>


[root@docker-host-fkb slehmann]# docker run --add-host=docker:172.17.42.1 --rm -it hiromasaono/curl curl 172.17.42.1:1234

curl: (7) Failed to connect to 172.17.42.1 port 1234: No route to host

Irgendwelche Ideen?

+1, Möglicherweise sollte es dafür eine Umgebungsvariable geben.

Ich selbst hätte es gerne umgekehrt; ein Link von meinem Host-Rechner zu den Docker-Containern mit Namen

+1 für Dockerhost-Umgebungsvariable

Es ist wirklich schwierig, einen maßgeschneiderten DNS-Eintrag zu kombinieren, der auf den Host zugreift, ohne 172.17.42.1 fest zu codieren. z.B

extra_hosts:
     - "docker:172.17.42.1"

+1 für dockerhost wo auch immer (/etc/host von ENV)

+1 das wird noch benötigt!

meine +1 auch, weil das Hinzufügen ip route list dev eth0 | grep -Eo 'via \S+' | awk '{ print \$2 }' zu jedem Projekt (weil sich in dev alle Projekte auf demselben Host befinden und in der Lage sein müssen, sich gegenseitig anzurufen) wie ein schlechter Hack erscheint

Wie lösen wir dieses Problem in einem Cluster, zB Docker Swarm, wo wir nicht wissen, welcher Maschine ein Container zugewiesen wird, wenn wir ihn ausführen? Die Docker0-Gateway-IP kann sich von einem Host zum anderen innerhalb des Schwarmclusters unterscheiden, daher können wir nicht einfach den Befehl ip route auf einem Host ausführen und dann davon ausgehen, dass die IP für alle Hosts gleich ist.

Ich hätte auch gerne die Möglichkeit, einen Container-Port einem Port auf der Docker0-Bridge zuzuordnen, ohne die IP-Adresse der Docker0-Bridge kennen zu müssen. Etwas wie das:

eval $(docker-machine env --swarm swarm-master-node)
docker run -d -p "$HOST_GATEWAY_IP:80:80" my-image

$HOST_GATEWAY_IP wird durch dieselbe IP ersetzt, die Sie erhalten würden, wenn Sie den Befehl ip route auf dem Host ausführen würden, auf dem der Container letztendlich im Cluster bereitgestellt wird.

Dies müsste für alle anderen Befehle unterstützt werden, die IPs beinhalten, zB die Option --dns auf docker run .

Ich fand diesen Befehl einfacher:

ip ro | grep docker | sed 's|.* \(\([0-9]\+\(.[0-9]\+\)\{3\}\)\)\s*|\1|'

+1 für dockerhost in /etc/hosts

+1 Dockerhost

+1 für Dockerhost in /etc/hosts

+1000 für Dockerhost

+1 Dockerhost

+1

+1 oder mehr.

Ich betreibe einen Webserver in einem Container und muss ihn mit meinem MySQL verbinden, das auf dem Host ausgeführt wird.
Die IP des Hosts ändert sich mit DHCP, also ist etwas Dynamisches ein Muss.

@wederbrand Ein alternativer Ansatz (und wahrscheinlich leistungsstärker) könnte beispielsweise darin bestehen, eine Verbindung zum MySQL-Socket herzustellen.

docker run -v /var/lib/mysql/mysql.sock:/mysql.sock mywebapp

Das würde den MySQL-Socket als /mysql.sock innerhalb des Containers verfügbar machen

@thaJeztah Das könnte eine Option sein. Das von mir verwendete Docker-Image wird jedoch auch für andere Umgebungen verwendet, in denen sich der MySQL-Server auf einem Remote-Server befindet und das Image eine Konfiguration für host:port für die Datenbank hat.

Ich möchte, dass sich mein Container so nah wie möglich an dem in der Produktion verhält, also kein Herumbasteln an Verbindungseigenschaften, außer um den Host und den Port festzulegen.

+1

+1

+1

+1

@peterbollen @radek1st @BradRuderman @aldarund @wederbrand @pataiadam @jllado @geniousphp @coreylenertz @dgtlmoon @xlight (alle +1 allein im Dezember 2015)
_diese_ Ausgabe ist ebenso geschlossen wie #8395
Ich glaube nicht, dass das Hinzufügen von +1 zu einem alten Problem hilfreich ist. Erstellen Sie ein neues (ich habe es mit #8395 getan) oder versuchen Sie es mit einer anderen Route, um dies zu beheben.

Vielen Dank!

+1

+1 Dockerhost

+1 für dockerhost

+1 für dockerhost

+1 für Dockerhost, komm schon ...

+1 für dockerhost

Die Verwendung von Docker-Compose und das Skalieren von n-ären Containern in einem Schwarm bietet natürlich keine Möglichkeit, Knoten-IP-Adressen-Lookups im laufenden Betrieb auf allen Computern durchzuführen.

Dies ist, wie oben angegeben und auf das Gateway modifiziert, keine Option:

extra_hosts:
     - "docker:172.18.0.1"

👍 auch für dockerhost...

+1 für dockerhost

+1

+1

+1

+1 Dockerhost

+1 Dockerhost

+1 Dockerhost

+1 für dockerhost

+1 für dockerhost

+1 für dockerhost.
Da dieses Thema geschlossen ist, eröffne ein neues Ticket.

+1

+1

Um den Host in ein docker-machine -Setup zu bekommen, können Sie diesen Befehl verwenden:

docker-machine ssh "${DOCKER_MACHINE_NAME}" 'echo ${SSH_CONNECTION%% *}'

Es meldet die Maschine, mit der Sie sich über ssh verbinden, also sollte es sowohl für lokale als auch für entfernte Maschinen einigermaßen gut funktionieren, solange es unterwegs kein NAT gibt. Es wäre schön, wenn docker-machine inspect diesen Wert auch irgendwo melden würde, wenn das technisch machbar ist.

+1

+1 für dockerhost . Klingt nach einem wertvollen Feature, das sich praktisch ohne Aufwand implementieren lässt.

Wenn Sie vorerst auf Dockerhost innerhalb von Containern zugreifen müssen, die aus von Ihnen kontrollierten Images erstellt wurden, können Sie diesen Kern zum Entrypoint.sh-Skript für Ihr Image hinzufügen: https://gist.github.com/dimitrovs/493678fd86c7cdf0c88312d9ddb4906b

Oder ich denke, Sie können es zu /etc/rc.local hinzufügen, wenn Ihr Image kein Shell-Skript als Einstiegspunkt verwendet. Was dieser Kern tut, ist, dass er in /etc/hosts nach Dockerhost sucht und ihn hinzufügt, wenn er nicht dort ist. Es sollte jedes Mal passieren, wenn der Container gestartet wird.

Holen Sie sich die Gateway-IP aus /proc/net/route:

export ipaddr=$(printf "%d." $(
  echo $(awk '$2 == "00000000" {print $3}' /proc/net/route) | sed 's/../0x& /g' | tr ' ' '\n' | tac
  ) | sed 's/\.$/\n/')

@dimitrovs Kannst du eine Beispielkonfiguration zeigen? Ich habe daran herumgebastelt und konnte nicht die richtigen Ergebnisse erzielen.

Welche Ergebnisse hast du erhalten @amcdnl ? Sie können das von mir verlinkte Wesentliche entweder in die Datei entrypoint.sh einfügen, damit es bei jedem Start des Containers ausgeführt wird, oder in /etc/rc.local innerhalb des Containers. Sie müssen dies tun, wenn Sie das Image erstellen, aber das Skript selbst wird ausgeführt, wenn ein Container gestartet wird.

+1 für Docker-Host

@dimitrovs Am Ende habe ich ein Skript geschrieben, das zur Laufzeit eine Komposition generiert.

StartDocker.sh

#!/bin/bash
built_docker_file="docker-compose.dev.built.yml"

rm -rf docker-compose.dev.built.yml
localhost_ip="$(ifconfig en0 inet | grep "inet " | awk -F'[: ]+' '{ print $2 }')"
sed -e "s/\${localhost}/$localhost_ip/" docker-compose.dev.template.yml > $built_docker_file

docker-compose -f $built_docker_file build
docker-compose -f $built_docker_file up

docker-compose.dev.template.yml

version: '2'

services:
  nginx:
    container_name: sw_nginx
    image: nginx:latest
    ports:
      - 80:80
    links:
     - search
    volumes:
      - ./Web/wwwroot:/var/www/public
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
    extra_hosts:
      - "dockerhost:${localhost}"

@amcdnl Gute Problemumgehung. Beachten Sie, dass docker-compose die (Umgebungs-) Variablensubstitution unterstützt.

zB (bash):

$ export localhost=$(...)
$ docker-compose (...)

@sebastiannm mein Vorschlag sollte unabhängig vom Host sein, da er innerhalb des Docker-Images ausgeführt wird, aber wenn Sie es auf einem Mac in VirtualBox ausführen, ist die IP, die Sie erhalten, die IP der VirtualBox-VM, nicht Ihre Mac-IP. Ich denke, das ist die Anforderung, die wir diskutieren. Wenn Sie die Mac-IP innerhalb einer Docker-Instanz wissen möchten, ist ein anderer Ansatz erforderlich.

+1 für dockerhost.

Aber jetzt mache ich einen ähnlichen Hack wie oben beschrieben, mit dem Sie die Host-IP-Adresse dynamisch mit einem einfachen Skript abrufen können, das sowohl unter Linux als auch unter OSX funktioniert : http://stackoverflow.com/questions/24319662/from-inside -eines-docker-containers-wie-verbinde-ich-sich-mit-dem-localhost-des-mach#38753971

+1 für dockerhost.

+1 für dockerhost

+1+1 Dockerhost

+1 für dockerhost

+1 für dockerhost

+1 für dockerhost

Ich kann von einem Docker-Container aus keine Verbindung zu einem einfachen Host-Netcat-Server herstellen, wenn --net=bridge (Standardeinstellung) über die verschiedenen in dieser Ausgabe beschriebenen Techniken verwendet wird.

@frankscholten Ich kann deinen erfolgreichen Netcat-Test nicht reproduzieren

Ich habe ein Stackoverflow-Problem erstellt, das das genaue Problem beschreibt: http://stackoverflow.com/questions/38936738/communicate-to-docker-host-from-docker-container
und wollte hier posten, falls es jemandem in der Zukunft hilft

Während all dies über die Kommunikation vom Container zum Host mit Docker0-IP im Bridge-Modus spricht, möchte ich wissen, ob der Container auch mit der öffentlichen IP des Hosts kommunizieren kann (z. B. seine ursprüngliche eth0-IP). Vielen Dank für Ihre Antwort. Diesbezüglich war ich nicht erfolgreich.

@sburnwal Ich verstehe nicht, warum Sie nicht mit der eth0-IP des Hosts kommunizieren können. Der Container sendet eine Anfrage an sein Standard-Gateway (docker0) und der Host sollte ohne weitere Weiterleitung antworten, da er weiß, dass er die IP hat. Sind Ihre Pings zur eth0-IP vom Container zeitlich abgelaufen oder erhalten Sie keine Route zum Host oder was passiert? Kann sich der Container mit dem Internet verbinden?

Leider funktioniert das bei mir nicht. Während ich die Container-IP vom Host aus pingen kann, kann ich die Host-IP (LAN/eth0 des Hosts) nicht vom Container aus pingen. Ich verwende Docker 1.9.1. Ich stecke hier fest, da ich meinen Container brauche, um mit dem Webserver zu kommunizieren, der nur auf der eth0-IP des Hosts lauscht.

Ich habe docker0 mit der Option angepasst:
/bin/docker-Daemon --bip=169.254.0.254/24 --fixed-cidr=169.254.0.0/24

Ich habe also diese Schnittstellen auf meinem Host (wobei hier keine veth*-Schnittstellen aufgeführt sind):

[root@pxgrid-106 irf]# ifconfig
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtg 1500
        inet 169.254.0.254  netmask 255.255.255.0  broadcast 0.0.0.0
        inet6 fe80::42:84ff:fe87:d510  prefixlen 64  scopeid 0x20<link>
        ether 02:42:84:87:d5:10  txqueuelen 0  (Ethernet)
        RX packets 512  bytes 150727 (147.1 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 653  bytes 281686 (275.0 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtg 1500
        inet 172.23.166.176  netmask 255.255.255.128  broadcast 172.23.166.255
        inet6 fe80::20c:29ff:fecc:7d0f  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:cc:7d:0f  txqueuelen 1000  (Ethernet)
        RX packets 58462  bytes 12056152 (11.4 MiB)
        RX errors 0  dropped 69  overruns 0  frame 0
        TX packets 30877  bytes 18335042 (17.4 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

Mein Container hat die IP 169.254.0.2 und ich kann diese Container-IP vom Host aus pingen. Natürlich kann ich vom Container aus sein Gateway 169.254.0.254 (docker0 ip) pingen, aber ich kann Host eth0 ip 172.23.166.176 nicht pingen.

Ich habe versucht, die Firewall vollständig zu stoppen, und ich habe diese expliziten Regeln auch zur Firewall zur INPUT-Kette hinzugefügt, aber noch kein Glück. Wer kann mir dabei helfen? Oder ist das ein Bug?

ACCEPT     all  --  172.23.166.176       169.254.0.0/24      
ACCEPT     all  --  169.254.0.0/24       172.23.166.176   

Lassen Sie mich außerdem die Ausgabe von 'ip route' auf meinem Host ausgeben:

[root@pxgrid-106 bin]# ip route
default via 172.23.166.129 dev eth0 
169.254.0.0/24 dev docker0  proto kernel  scope link  src 169.254.0.254 
172.23.166.128/25 dev eth0  proto kernel  scope link  src 172.23.166.176 

@tn-osimis danke für den Vorschlag, ich habe aktualisiert und funktioniert gut, hier ist mein Code für andere:

docker-compose.yml

version: '2'

services:
  nginx:
    image: nginx:latest
    ports:
      - 80:80
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
    extra_hosts:
      - "dockerhost:${localhost_ip}"

StartDocker.sh

#!/bin/bash
dev_docker_file="docker-compose.yml"

export localhost_ip="$(ifconfig en0 inet | grep "inet " | awk -F'[: ]+' '{ print $2 }')"

docker-compose -f $dev_docker_file build
docker-compose -f $dev_docker_file up

+1 für dockerhost

+1 für dockerhost

+1 für dockerhost

Die Lösung von @magicalbob ist in der Tat magisch 🎉

+1 für dockerhost

+1, übrigens, warum ist das geschlossen? Das Problem/die Funktionsanfrage wurde noch nicht gelöst

Irgendwelche Updates dazu? Was ist der richtige Weg?

+1

Hat jemand ein Update zum Herstellen einer Verbindung zum Host (öffentliche IP des Hosts wie eth0 ip und nicht docker0 interface ip) aus dem Container?

@sburnwal docker run --add-host=publicip:$(hostname --ip) ubuntu ping -c2 publicip

Siehe die Antwort von @retog

+1 für dockerhost

+1 für dockerhost

+1 für dockerhost

Lassen Sie es hier, da es vielleicht zumindest einigen von Ihnen helfen wird:

Mir wurde gesagt, dass die Standard-Netzwerkschnittstelle nicht immer docker0 sein muss, das Erhalten der docker0 IP funktioniert nicht auf anderen Systemen als Linux, dies war ein Problem für uns, weil einige von Unsere Entwickler verwenden Macs

Anstatt die magischen Skripte zu verwenden, um die Host-IP von der Netzwerkverbindung abzurufen, wurde mir empfohlen, die Netzwerkeinstellungen des Containers zu erzwingen, anstatt zu versuchen, sie programmgesteuert herauszufinden

Ich habe die Docker-Netzwerkeinstellungen in meiner Docker-Compose-Datei wie folgt konfiguriert:

``` Netzwerke:
Ursprünglich:
Treiber: Brücke
ipam:
Konfiguration:
- Subnetz: 10.10.0.0/24
Gateway: 10.10.0.1

if you are only running one container, you could first create a network (`docker network create`) and connect to it with `docker run --network=<network-name>|<network-id> <image name>`

BUT if you don't want to do this (i.e. force the docker network) and really want to get the default gateway IP, you could get it more cleanly than using `docker0` network interface, for example by parsing the `docker network inspect <network name>`, which outputs the gateway IP (among other things):

...
"IPAM": {
"Treiber": "Standard",
"Konfig": [
{
"Subnetz": "172.17.0.1/16",
"Gateway": "172.17.0.1"
}
]
}
...

you could also use the `--format` option of `docker network inspect` to get only the fields that are of interest, like this:

$ docker network inspect bridge --format='{{range .IPAM.Config}}{{.Gateway}}{{end}}'
$ 172.17.0.1
```

HINWEIS: Wenn es mehr .IPAM.Config -Einträge gäbe, würden Sie alle in der Ausgabe erhalten, sodass zusätzliche Logik zum Auswählen des richtigen Eintrags erforderlich wäre

+1 für dockerhost

Beachten Sie, dass dies sehr nützlich wäre, wenn Sie xdebug einfach in einem php-fpm-Container verwenden möchten, um eine Verbindung zu Ihrer IDE zum Debuggen herzustellen, da Sie offensichtlich keine IDE in einem Container ausführen können.

+1 für dockerhost

Meine Zusammenfassung der obigen Hackarounds:

in docker-compose.yml :

nginx:
  restart: always
  build: ./nginx/
  ports:
    - "80:80"
  extra_hosts:
    # requires `export DOCKERHOST="$(ifconfig en0 inet | grep "inet " | awk -F'[: ]+' '{ print $2 }')"` in ~/.bash_profile
    - "dockerhost:$DOCKERHOST"

in ~/.bash_profile :

# see https://github.com/docker/docker/issues/1143
export DOCKERHOST="$(ifconfig en0 inet | grep "inet " | awk -F'[: ]+' '{ print $2 }')"

in nginx-conf :

location / {
        proxy_pass http://dockerhost:3000;
        proxy_set_header host $host;
        proxy_set_header x-real-ip $remote_addr;
        proxy_set_header x-forwarded-for $proxy_add_x_forwarded_for;
}

Ich neige dazu, das Docker-Image svendowideit/ambassador zu verwenden, um dieses Problem zu umgehen.

Wenn ich beispielsweise eine Bindung zu einem Elasticsearch-Knoten herstellen möchte, der auf dem Docker-Host ausgeführt wird:

docker run --restart always -d --name elasticsearch --expose 9200 -e ELASTICSEARCH_PORT_9200_TCP=tcp://<host>:9200 svendowideit/ambassador

Jetzt können andere Docker-Container Elasticsearch einfach finden, indem sie --link elasticsearch verwenden, während sie unabhängig davon bleiben, ob Elasticsearch in einem Docker-Container, auf dem Host oder wo auch immer ausgeführt wird.

+1 für dockerhost

... für den Moment, obwohl Sie dies tun könnten:

$ docker build --build-arg HTTP_PROXY=172.16.42.1 .

... oder in meinem ähnlichen Fall mit docker-compose - ich mache das:

client:
        build: ./client
        extra_hosts:
            - "foobar:${HTTP_PROXY}"

Stellen Sie Ihren Host zur Build-Zeit ein:

export HTTP_PROXY=172.16.42.1 && docker-compose build

@rattrayalex auf dem Mac habe ich festgestellt, dass dies die IP direkt ausgibt: ipconfig getifaddr en0

+1 für dockerhost

Können diejenigen von Ihnen, die gerade +1 für Dockerhost geben, einfach einen Daumen nach oben (Reaktion) zu einem bestehenden Kommentar der gleichen Art hinzufügen? +1-Kommentare erweitern/füllen diesen Thementhread nur unnötig. Es gibt bereits so viele, dass wir keine weiteren hinzufügen müssen, aber wir könnten immer einen Daumen nach oben gebrauchen! 👍

Ich denke, die Kommentatoren schreiben ein ausführliches +1, um hervorzuheben, dass dies ein häufiger Anwendungsfall mit bekannten Problemumgehungen ist und eine in Stunden schätzbare Zeit erfordern sollte, um vom Docker-Team codiert zu werden
Trotzdem ist es seit 3 ​​Jahren geöffnet 👍

Für mich sieht es also eher nach einem "Sind wir noch hier" aus? Stattdessen nur ein Emoji

Die @magicalbob- Lösung in https://github.com/docker/docker/issues/1143#issuecomment -233152700 funktioniert einwandfrei in jedem Container-Setup und jeder Bridge, die ich bisher ausprobiert habe!

Lösung von https://github.com/docker/docker/issues/1143#issuecomment -70052272 funktioniert nicht, wenn docker compose extra_hosts verwendet wird

+1 für dockerhost

Immer noch kein Dockerhost?

+1 für dockerhost

+1 für dockerhost

es wird nicht passieren, es wurde vor 3 Jahren geschlossen, und sie planen nicht, dies jemals umzusetzen. Aus dem gleichen Grund ist docker.sock ein Fußgewehr für die Sicherheit, Dockerhost ist es auch. Einen auflösbaren Domänennamen innerhalb Ihrer Anwendung zu haben, ist meiner Meinung nach ein großes Sicherheitsproblem. Wenn Sie müssen, verwenden Sie einfach die Problemumgehungen, selektiv nur dort, wo der Zugriff auf Hostdienste über IP keine erhöhte Angriffsfläche darstellt.

Widersprechen Sie nicht, dass es nicht passiert, aber ich sehe nicht, wie Dockerhost ein Sicherheitsrisiko darstellt, es sei denn, Sie schließen auch die vielen einfachen Problemumgehungen ....⁣

Gesendet von BlueMail

Am 16. Dezember 2016 um 17:58 Uhr um 17:58 Uhr schrieb Paulo Cesar [email protected] :

Es wird nicht passieren, es wurde vor 3 Jahren geschlossen, und sie haben nicht vor, dies jemals zu tun
dies umsetzen. Aus dem gleichen Grund ist docker.sock ein Fußgewehr für die Sicherheit,
dockerhost ist es auch. mit einem auflösbaren Domain-Namen von innerhalb Ihres
Anwendung ist IMHO ein großes Sicherheitsproblem. Wenn Sie müssen, verwenden Sie einfach die
Problemumgehungen, selektiv nur dort, wo der Zugriff auf Hostdienste über IP nicht funktioniert
eine vergrößerte Angriffsfläche sein.

--
Sie erhalten dies, weil Sie erwähnt wurden.
Antworten Sie direkt auf diese E-Mail oder sehen Sie sie auf GitHub an:
https://github.com/docker/docker/issues/1143#issuecomment -267655915

+1 für dockerhost

+1 für dockerhost

Die IP des Hostcomputers ist 192.168.0.208 .

docker-compose Datei ist wie folgt:

version: '2'
 services:
   zl-tigervnc:
     image: zl/dl-tigervnc:1.5
     container_name: zl_dl_tigervnc
     restart: always
     tty: true
     ports:
       - "8001:8888"
       - "6001:6006"
       - "8901:5900"
       - "10001:22"
     devices:
       - /dev/nvidia0
     volumes:
       - ~/data:/root/data
       - /var/run/docker.sock:/var/run/docker.sock
     extra_hosts:
       - "dockerhost:192.168.0.208"

Durch dieses Skript wurde ein Container gestartet. Der Container möchte auf Port 8080 auf dem Host-Rechner zugreifen (z. B. 192.168.0.208:8080 ). Aber es funktioniert nicht.

Ich verwende jedoch die Portweiterleitung, um 8080 auf dem Hostcomputer 8080 auf dem Router zuzuordnen. Die IP des Routers war 63.25.20.83 . Der Container könnte auf 8080 des Host-Rechners per Portweiterleitung zugreifen (z. B. 63.25.20.83:8080 ).

Ich habe viele Lösungen von dieser Seite ausprobiert, aber es funktioniert immer noch nicht.

Beachten Sie, dass dies sehr nützlich wäre, wenn Sie einfach xdebug in einem php-fpm-Container verwenden möchten
Verbinden Sie sich zum Debuggen mit Ihrer IDE, da Sie offensichtlich keine IDE in einem Container ausführen können.

Genau @colinmollenhour ! Außer es gibt ein zusätzliches Problem. Sie können den Host anpingen, aber Sie können sich nicht wirklich mit den Ports des Hosts verbinden (z. B. ein Remote-Debugger, der auf 9000 läuft).

Viele alte und/oder nicht ganz richtige Sachen im Netz. Viele Leute scheinen zu denken, dass das Einrichten einer Alias-IP und das Anhängen an die lo-Schnittstelle funktionieren sollte, aber nicht funktioniert.

(Testen mit Netcat auf dem Host und Telnet im Docker-Container, also bin ich gut abgespeckt).

@bitwombat Überprüfen Sie die Firewall Ihres Hosts auf eine Port 9000-Regel

@gregmartyn Genau das war es. Danke! Wäre das erste, was ich in einem einfacheren Setup überprüft hätte! All die Täuschungsschichten ließen mich seltsamere Dinge überprüfen.

Juli 2013 bis 2017. Fast 4 Jahre, wieso ist das noch kein Feature? Dies ist eindeutig kein isolierter Anwendungsfall.

Es ist kein Feature, weil es nicht mit der Strategie von Docker übereinstimmt, eine Multi-Host-Deployment-Management-Lösung zu sein.

Ich glaube immer noch, dass es viele gültige Anwendungsfälle gibt und das Hinzufügen der Funktion der Strategie von Docker keinen Schaden zufügen würde. Wie auch immer, hier ist eine etwas einfache Lösung, um die Docker-Hostadresse aus einem Container heraus aufzulösen, die meiner Meinung nach ziemlich universell funktionieren sollte:

ip route | awk '/^default via /{print $3}'

+1 für dockerhost

Sehr dringend benötigt. +1 für dockerhost

+1 für dockerhost

+1 für dockerhost

+1 für dockerhost

+1 für jede Lösung, die keine hackige Problemumgehung ist. Hier funktioniert nichts.

Einverstanden. +1 für eine Lösung. Benötigen Sie es für Entwicklungs- und Testarbeiten an Projekten, die Docker verwenden.

+1 für dockerhost

+1 für dockerhost

+1 für dockerhost

Wow.. 4 Jahre und stark. +1 für dockerhost?

+1 Dockerhost!!

+1 Dockerhost!!!

Dies ist wahrscheinlich stummgeschaltet. Wir sollten vielleicht eine neue Ausgabe machen, die sich darauf bezieht.

:+1: für Dockerhost ... Im Moment richte ich es mit env ein:

export DOCKERHOST=$(ifconfig | grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" | grep -v 127.0.0.1 | awk '{ print $2 }' | cut -f2 -d: | head -n1)

Das macht die Sache umständlich.

Sogar etwas so Einfaches wie die Verwendung von docker-compose in einem Container mit einer ssh-getunnelten privaten Registrierung funktioniert nicht, weil Docker so fest entschlossen ist, dockerhost nicht zu wollen.

HINWEIS: Dieses Problem ist geschlossen, es macht also keinen Sinn, weitere Kommentare hinzuzufügen :-)

Wenn Sie diese Funktion benötigen, können Sie einfach einen dockerhost DNS-Alias ​​hinzufügen, indem Sie --add-host und entsprechende Optionen verwenden.

Warum ist dies standardmäßig nicht verfügbar? Weil es nur in trivialen Fällen funktioniert. Dh:

  • Was ist mit Containern, die _keinen_ Netzwerkzugriff haben?
  • Was ist mit Containern, die _mehrere_ Netzwerke haben?
  • Was ist mit Containern, die auf einem Swarm-Cluster ausgeführt werden?

Wenn Sie einen guten Anwendungsfall haben (z. B. "Ich würde gerne XXX machen, und dafür hätte ich gerne dockerhost ...") sowie solide Antworten auf die obigen Fragen (und andere Eckfälle, die auftreten könnten), können Sie gerne ein neues Problem mit diesem Thema eröffnen!

Danke.

Das Problem ist, dass Ihre Host-IP dynamisch sein kann und davon abhängt, in welchem ​​​​Netzwerk Sie sich befinden. Wenn Sie eine Verbindung zum Host zum Debuggen entwickeln, ist dies ein Muss. Der Grund, warum jeder den Dockerhost haben möchte, ist nicht, dass die Optionen, die nicht vorhanden sind, praktisch oder überhaupt nützlich sind.
Docker hat unzählige Optionen, die nicht für alle relevant sind, was macht das anders? Warum nicht die Option in Docker haben, Dockerhost bei Bedarf zu aktivieren, das würde 99% glücklich machen, denke ich.

@jpetazzo

Was ist mit Containern, die keinen Netzwerkzugriff haben?

Dann funktioniert Dockerhost nicht.

Was ist mit Containern, die mehrere Netzwerke haben?

Dann funktioniert Dockerhost nicht.

Was ist mit Containern, die auf einem Swarm-Cluster ausgeführt werden?

Wen interessiert das?

Wenn Sie Software entwickeln, die Komponenten außerhalb des Docker-Ökosystems umfasst (z. B. Software, die in einer Windows-VM auf dem Host ausgeführt wird), ist es mühsam, sie mit Docker zu verbinden. Warum muss es ein Schmerz sein?

Alle Fälle, die Sie aufgelistet haben, sind nicht das, worüber die 226 Kommentare in diesem Thread sprechen, sie sprechen über den Grundfall.

Edit: Entschuldigung, ich habe einen Teil meines Kommentars gelöscht. Ich wollte nicht schimpfen. Es ist nur ein bisschen frustrierend, dies ist eine dringend benötigte Funktion für einige Docker-Benutzer, und wenn Sie Software entwickeln, die dies erfordert, ist es noch frustrierender, sie scheinbar ohne Grund hacken zu müssen.

@jpetazzo manchmal sind die "trivialen" Fälle 80% der Anwendungsfälle. Dockerhost wäre sehr wertvoll für Leute, die Docker in Entwicklungs- oder Staging-Umgebungen verwenden, oder wirklich alle Umgebungen, die nicht auf Schwarm-/Multi-Host-Netzwerke angewiesen sind. Hier sind einige Beispiele, wo ich Dockerhost verwenden möchte:

1) Docker-Compose unter Windows mit privater Registrierung. Wir haben eine selbst gehostete private Docker-Registrierung. Entwickler können über einen SSH-Tunnel mit Portweiterleitung (zB auf localhost:5000) auf die Registrierung zugreifen. Wenn Docker-Compose jedoch in einem eigenen Docker-Container ausgeführt wird, gibt es keine Möglichkeit, den privaten Registrierungshost anzugeben. Wenn wir dockerhost hätten , könnten wir dockerhost:5000 in unserer Datei docker-compose.yml verwenden, um Zugriff auf den weitergeleiteten Port auf dem Host zu erhalten.

2) Jede Anwendung, die mit Diensten kommunizieren muss, die auf dem Host ausgeführt werden. Beispielsweise könnte ein webbasierter SSH-Client, der in einem Docker-Container ausgeführt wird, verwendet werden, um eine SSH-Verbindung mit dem Host herzustellen, wenn dockerhost vorhanden ist . Es gibt unzählige Beispiele für Dienste, die auf dem Host eines Docker-Containers ausgeführt werden, die verwendet werden können, wenn dort dockerhost vorhanden ist .

3) Umgekehrte Portweiterleitung. Wir können unseren SSH- oder OpenVPN-Server in einem Docker-Container ausführen lassen und Clients Zugriff auf Dienste gewähren, die auf dem Host ausgeführt werden, wenn dockerhost vorhanden wäre . Sie können die Portweiterleitung vom Container zum Dockerhost einrichten.

Ich würde gerne technische Gründe hören, warum Moby-Entwickler sich weigern, die Community zu hören, wenn es um Dockerhost geht. Bisher höre ich nur politische/wirtschaftliche Gründe.

Bin auf diesen Thread gestoßen, als ich versuchte, eine Möglichkeit zu finden, eine Macvlan-Netzwerkschnittstelle an einen Schwarmdienst anzuhängen ... Swarm scheint eine halbfertige Lösung zu sein, die Unfähigkeit, Dienste direkt der Außenwelt zugänglich zu machen, ist für mich eine ständige Frustration. Es fühlt sich an, als ob Docker mit realen Anwendungsfällen die Bodenhaftung verloren hat, 4 Jahre nach dem Start dieses Threads im Schnellvorlauf, und es gibt immer noch keine native Implementierung, mit der Container sich selbst verwalten können.

Ich bin relativ neu bei Docker. Alles, was ich aus den offiziellen Dokumenten gelesen habe, macht Sinn. _Docker ist eigentlich ein recht einfach zu erlernendes Tool._

Tatsächlich habe ich mehrere Stunden damit verbracht herauszufinden, wie man sich aus einem Container heraus mit dem Host verbindet . Alles andere war leicht zu ermitteln. Ich weiß immer noch nicht, wie ich es machen soll. Viele der "Hacks" in diesem Forum und auf SO funktionieren einfach nicht. Wir müssen auf den Host zugreifen, um eine Legacy-App zu nutzen, die nicht für viele Monate auf „Dockerized“ eingestellt ist.

Wird nie passieren, fürchte ich, Josh. Das haben die Entwickler deutlich gemacht.
Was Docker für eine große Klasse von Anwendungen schlimmer als nutzlos macht,
leider konnte docker (oder "moby") darauf keinen Wert legen
Entwickler oder diese Anwendungen.

Am 19. Juni 2017 um 01:08 Uhr schrieb "Josh Wedekind" [email protected] :

Ich bin relativ neu bei Docker. Alles, was ich aus den offiziellen Dokumenten gelesen habe
macht Sinn. Docker ist eigentlich ein ziemlich einfach zu erlernendes Tool.

In der Tat das einzige, was ich mehrere Stunden damit verbracht habe, es herauszufinden
So stellen Sie von einem Container aus eine Verbindung zum Host her. Alles andere
war leicht zu bestimmen. Ich weiß immer noch nicht, wie ich es machen soll. Viele der
"Hacks" in diesem Forum und auf SO funktionieren einfach nicht. Wir müssen auf die zugreifen
hosten, um eine Legacy-App zu nutzen, die nicht auf „Dockerized“ eingestellt ist
für viele Monate.


Sie erhalten dies, weil Sie kommentiert haben.
Antworten Sie direkt auf diese E-Mail und zeigen Sie sie auf GitHub an
https://github.com/moby/moby/issues/1143#issuecomment-309311997 , oder stumm
der Faden
https://github.com/notifications/unsubscribe-auth/AA-shyjglsJXawxHHWGhQH0d1LlZeJqxks5sFbwXgaJpZM4Ayw00
.

Es ist wirklich frustrierend, dass Sie jede Situation mit einer einfachen deklarativen Docker-Compose-Datei bewältigen können, aber Sie sollten tausend Tricks anwenden, um eine Verbindung zu einer Legacy-Anwendung von Ihrem Container in Ihrer Entwicklungsumgebung herzustellen.
@thaJeztah Es macht überhaupt keinen guten ersten Eindruck von Docker.

Zu Ihrer Information, genau aus diesem Grund haben wir Docker in der Produktion aufgegeben. Ich weiß, dass die Docker-Entwickler fest dagegen sind (und ich verstehe, dass es kein so triviales Feature ist, wie manche behaupten würden), aber ich wollte mich nur einmischen: Sie verlieren echte Kunden, weil Sie sich hartnäckig weigern, überhaupt darüber nachzudenken dieses Problem. Als widerstrebender Docker-„Experte“ in meinem Unternehmen muss ich jetzt Leute, die mich danach fragen, warnen, indem ich sage: „Docker ist großartig … außer wenn Sie mit irgendetwas kommunizieren müssen, das auf dem lokalen Host läuft.“

Also noch einmal, ich bin mir sicher, dass das Problem stummgeschaltet ist, aber wenn Sie jemals auf diesen Thread zurückblicken, Docker-Entwickler, verursacht dies echte Schmerzen und veranlasst echte Docker-Kunden, Docker nicht mehr zu verwenden. Ich empfehle, Ihre hartnäckige Weigerung, das Problem anzusprechen, noch einmal zu überdenken; Nur weil es nicht Ihrer Vorstellung davon entspricht, wie Docker verwendet werden soll, heißt das nicht, dass es ein nutzloses oder unnötiges Feature ist.

Sie könnten (werden) nicht nur bestehende Kunden verlieren. Wir hätten alles auf Docker migrieren können, wenn es sein Entwicklungsversprechen gehalten hätte. Dies ist eine echte Anti-Promotion für Docker, um sie in großem Umfang für alle Prozesse zu verwenden.

Die Art und Weise, wie ich es jetzt zum Laufen bringe, besteht darin, ein Netzwerk zu erstellen. So sieht meine Docker-Compose-Datei aus:

version: '2'
services:
  <container_name>:
    image: <image_name>
    networks:
      - dockernet

networks:
  dockernet:
    driver: bridge
    ipam:
      config:
        - subnet: 192.168.0.0/24
          gateway: 192.168.0.1

Danach können Sie mit 192.168.0.1 auf den Host zugreifen.
Könnte für einige von Ihnen nützlich sein, da diese Funktion nicht so bald verfügbar ist.

@deltabweb Werden Anfragen, die in Apps auf dem Hostcomputer eingehen, als „localhost“-Datenverkehr angezeigt, oder muss ich die Apps ändern, um auf 192.168.0.1 zu reagieren?

Danke für Ihre Hilfe.

@halfnibble
Ich habe mir die Dokumentation von networks nicht im Detail angesehen, aber ich verstehe, dass ein neues Netzwerk auf Ihrem Host-Rechner erstellt wird, wo:

  • IP des „dockerhost“ ist 192.168.0.1
  • IP des ersten Containers ist 192.168.0.2
  • IP des zweiten Containers ist 192.168.0.3
  • und so weiter ...

Von dort aus sollte alles so funktionieren, als ob Sie physische Maschinen in einem lokalen Netzwerk miteinander verbunden hätten:

  • Maschinen können sich miteinander verbinden
  • und Sie sollten sogar ping 192.168.0.2 vom Host verwenden können - dies funktioniert jedoch nur, wenn Ihr Container auf Pings antwortet.

Um Ihre Frage zu beantworten, denke ich, dass Ihre Apps auf dem Hostcomputer auf 192.168.0.X reagieren müssen (abhängig vom Container, der versucht, eine Verbindung herzustellen).

@deltabweb Wie greife ich über die Cloud auf den Server-Host-Port zu? >>> Verbindung abgelehnt

@nooperpudd Nur um sicherzugehen: Sie versuchen, von einem Container aus auf eine Anwendung zuzugreifen, die auf dem Host ausgeführt wird, oder?
Ich würde zuerst prüfen, ob die Anwendung eingehende Verbindungen von außen zulässt (0.0.0.0 und nicht nur localhost). Und stellen Sie vielleicht auch sicher, dass Sie keine Firewall haben, die die Verbindung blockiert?

@nooperpudd Wenn Sie Docker for mac verwenden, können Sie den host -Modus nicht verwenden, die @deltabweb- Lösung funktioniert auch nicht für mich (meine Server hören alle auf 0.0.0.0 und die Firewalls meiner Host-Maschine wurden ausgeschaltet, aber ich bekomme jedes Mal Connection refused ). Nach ungefähr 2 Tagen Versuch und Irrtum ist die einzige Möglichkeit, dieses Problem zu beheben, das folgende Skript:

#!/bin/bash
export DOCKERHOST=$(ifconfig | grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" | grep -v 127.0.0.1 | awk '{ print $2 }' | cut -f2 -d: | head -n1)

# You should use DOCKERHOST env variable in your `docker-compose.yml` 
# and put it everywhere you want to connect to `localhost` of the host machine
docker-compose $@

Das einzige Problem bei diesem Ansatz ist, wenn sich Ihre IP ändert, nachdem Sie Ihre Container ausgeführt haben, sollten Sie sie erneut ausführen und sie können Ihre neue IP nicht finden.

Eine bemerkenswerte Beobachtung für mich ist, dass der Befehl, der beim Starten von Docker-Containern ausgeführt wird, sich nicht über seine Host-IP-Adresse mit dem Container verbinden kann. Wenn dieser Befehl jedoch keine solchen Verbindungsversuche durchführt und die Ausführung erfolgreich beendet, kann sich der Container über seine Host-IP-Adresse selbst erreichen.

Ich habe diese Beobachtung gemacht, als ich versuchte, die Endpunkte von NoSql-Datenbank-Cluster-Instanzen für Clients außerhalb des Schwarm-Clusters verfügbar zu machen. Schließlich müssen diese Endpunkte mit privaten oder öffentlichen IP-Adressen der VM konfiguriert werden, damit der externe Client sie erreichen kann. Cassandra ist jedoch so konzipiert, dass es beim Start versucht, sich sofort mit der Host-IP-Adresse zu verbinden (als Umgebungsvariable CASSANDRA_BROADCAST_ADDRESS gesetzt -- siehe unten) und daher fehlschlägt. Andererseits werden alle Mongodb-Replikatsatzknoten zunächst alle in einem sauberen Zustand gestartet, und dann wird ein separater Initialisierungsbefehl ausgeführt, sodass die primären und sekundären Knoten einen Replikatsatz bilden können.

Unten sehen Sie eine detaillierte Beschreibung dieser Beobachtung für cassandra (ich erstelle diese mit docker swarm, aber das gleiche Problem tritt in docker run -d (im NAT-Modus, also ohne Option --net=host)

1) Einerseits ein Container erstellt von

docker service create  --name cassandra-service
--publish mode=host,target=7000,published=7000,protocol=tcp 
-e CASSANDRA_SEEDS=host IP address  -e CASSANDRA_BROADCAST_ADDRESS=host IP address

schlägt mit der Meldung fehl, dass keine Verbindung zur Abhöradresse hergestellt werden kann: <host IP address>:7000

2) Auf der anderen Seite ein Container, der an ein Overlay-Netzwerk angehängt ist, erstellt von

docker service create  --network cassandra-net --name cassandra-service
-e CASSANDRA_SEEDS=cassandra-service  -e CASSANDRA_BROADCAST_ADDRESS=cassandra-service

startet korrekt und gleichzeitig kann ich eine Verbindung zur Host-IP-Adresse an jedem Port herstellen, der in der Docker-Datei des cassandra: 2.0 -Images verfügbar gemacht wird:

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                                         NAMES
07603a75a379        cassandra:2.0       "/docker-entrypoin..."   About a minute ago   Up About a minute   7000-7001/tcp, 7199/tcp, 9042/tcp, 9160/tcp   cassandra-service-1.1.m243u97zku15w08m6puytdngs

$ docker exec -it 1e61ec16f8d0 bash
root<strong i="5">@1e61ec16f8d0</strong>:/# cqlsh 172.17.13.151
Connected to Test Cluster at 172.17.13.151:9160.
[cqlsh 4.1.1 | Cassandra 2.0.17 | CQL spec 3.1.1 | Thrift protocol 19.39.0]

Gleiches kann während der Erstellung eines zweiten Cassandra-Knotens beobachtet werden

1) Wenn ich einen zweiten Cassandra-Container auf einem anderen Knoten durch erstelle

docker service create  --network cassandra-net --name cassandra-service-2
-e CASSANDRA_SEEDS=172.17.13.151  -e CASSANDRA_BROADCAST_ADDRESS=cassandra-service-2

Der Container schlägt mit der Laufzeitausnahme fehl, dass er nicht mit dem Seed klatschen kann:

java.lang.RuntimeException: Unable to gossip with any seeds
        at org.apache.cassandra.gms.Gossiper.doShadowRound(Gossiper.java:1322)
        at org.apache.cassandra.service.StorageService.checkForEndpointCollision(StorageService.java:457)

2) Wenn ich andererseits einen Cassandra-Container über docker run -d erstelle, kann ich den Seed-Knoten über seine Host-IP-Adresse erreichen:

$ docker run -d cassandra:2.0
d87a79cc3de8cd7e4cf40284d1eca91ceb660581cc71082fe64a6b84a09fbd77
$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                         NAMES
d87a79cc3de8        cassandra:2.0       "/docker-entrypoin..."   3 seconds ago       Up 2 seconds        7000-7001/tcp, 7199/tcp, 9042/tcp, 9160/tcp   trusting_ardinghelli
$ docker exec -it d87a79cc3de8 bash
root<strong i="17">@d87a79cc3de8</strong>:/# cqlsh 172.17.13.151
Connected to Test Cluster at 172.17.13.151:9160.
[cqlsh 4.1.1 | Cassandra 2.0.17 | CQL spec 3.1.1 | Thrift protocol 19.39.0]
Use HELP for help.
cqlsh>

Speziell für Cassandra lösen Sie dieses Problem, indem Sie das automatische Bootstrapping von Cassandra-Knoten deaktivieren. Sie tun dies, indem Sie auto_bootstrap $ in /etc/cassandra/cassandra.yaml mithilfe eines Einstiegspunktbefehls in Compose V3 auf false setzen:

version: '3'
services:
  cassandra-1:
    image: cassandra:2.0
    entrypoint:
    - "sh"
    - "-c"
    - "echo auto_bootstrap: false >> /etc/cassandra/cassandra.yaml; /docker-entrypoint.sh cassandra -f"
    environment:
      CASSANDRA_BROADCAST_ADDRESS: 172.17.13.151
    volumes:
    - volume1:/var/lib/cassandra
    ports:
    - "7000:7000"
    - "7001"
    - "7199"
    - "9042:9042"
    - "9160:9160"

und starten Sie dann Cassandra-Knoten manuell, indem Sie docker exec -it <container id> nodetool rebuild ausführen.

Ich könnte diese Funktion in der Entwicklung verwenden, na ja ...

@jpetazzo Wir entwickeln PHP-Lösungen in Teams auf verschiedenen Plattformen. Unser Debugger (xdebug) muss sich wieder mit der IDE auf dem Host verbinden. Unter Windows und Linux funktioniert dies "out of the box", aber auf dem Mac müssen unsere Entwickler die xdebug.ini-Datei ändern, um ihre lokale IP ausdrücklich zu erwähnen. Aber die Docker-Datei steht unter Quellcodeverwaltung ... ständige Konflikte und Fluchen, wenn Entwickler sich über die Bearbeitung dieser Datei streiten. Ja, es gibt skriptfähige Problemumgehungen, aber warum hat Docker für Windows und Mac docker.for.win.localhost und docker.for.mac.localhost? Es ist teilweise hilfreich, aber wir brauchen immer noch Skripte, um zu erkennen, auf welcher Plattform wir uns befinden, um dies richtig einzurichten. Es scheint nur so viel komplizierter zu sein, als es sein sollte. Bitte überdenken Sie diese Funktion. Docker kann eine steile Lernkurve sein, aber Probleme wie dieses lassen Ihre Benutzer stundenlang ungläubig auf Google suchen.

Das Überprüfen der Seite https://docs.docker.com/docker-for-mac/networking/#use-cases-and-workarounds hat geholfen, die Verwendung docker.for.mac.localhost hat für uns funktioniert :)

Im Guten wie im Schlechten ist docker-compose immer noch bei weitem der einfachste Weg, den ich kenne, um einen Selenium-Hub und kopflose Firefox/Chrome-Grid-Knoten zum Testen eines Webservers einzurichten, der auf einem lokalen Entwicklungscomputer oder in CI (Launching der Webserver in einem Docker-Container ist einfach zu langsam, um für die Entwicklung geeignet zu sein). Es ist überhaupt nicht das, wofür Docker gedacht war, aber Docker ist das beste Tool für diesen Job, und es ist Dockers eigene Schuld 😆 Nur dass das einzige Problem darin besteht, die Host-IP so zu finden, dass sie auf jedem Betriebssystem funktioniert.

@rskuipers kannst du erklären, was genau du mit docker.for.mac.localhost gemacht hast? Ich versuche, Anfragen aus meinen Containern zu stellen, um sie auf dem Hostcomputer aufzulösen. Meine Container werden auf Traefik ausgeführt, was bedeutet, dass ich über domain.docker.localhost auf sie zugreifen kann, aber wenn ich versuche, auf eine URL zuzugreifen, die damit beginnt, in meinem Container, wird sie nicht aufgelöst.

Was ich derzeit getan habe, ist, dass ich dies zu meinem docker-compose.yml hinzugefügt habe, wodurch eine Zeile zu /etc/hosts hinzugefügt wird, damit die Domäne gut aufgelöst wird:

extra_hosts: - "domain.docker.localhost:172.18.0.1"

Die IP ist die Host-IP aus meinem Container, die ich mit ip route | awk '/^default via /{print $3}' erhalten kann. Aber ich möchte das nach Möglichkeit nicht fest codieren ...

@jzavrl Ich habe lediglich docker.for.mac.localhost verwendet, damit meine HTTP-Anforderungen über einen Proxy laufen, der auf dem Host ausgeführt wird. Ich verwende keine anderen Ebenen außer docker-compose .

Genau das interessiert mich. Welche Änderungen mussten Sie konkret vornehmen?

@jzavrl Keine: P es hat einfach funktioniert.

Ich verstehe nicht, was hast du dann mit docker.for.mac.localhost gemacht?

@jzavrl Ich habe das anstelle der IP verwendet, um eine Verbindung herzustellen. Also docker.for.mac. lokaler Host: 8888

Ahhhhhh, jetzt macht das langsam Sinn. Werde das dann versuchen. Prost @rskuipers.

Verwenden Sie einfach die IP von "en0" auf Ihrem Computer.

zum Beispiel

ssh [email protected]

'192.168.1.100' möglicherweise vom DHCP-Dienst Ihres Routers.

@acuthbert , danke für deinen Vorschlag.
docker.for.win.localhost funktioniert bei mir in Docker für Windows. Es gibt noch Hoffnung für Docker und Windows. 😣

Es gibt wenig technischen Grund, warum dies nicht möglich ist, und die 90% der Leute in diesem Thread zufriedenzustellen, die Eckfälle und Situationen, in denen es nicht wirklich funktioniert, die Leute, die in dieser Situation entwickeln, könnten mit einem einfachen Satz zufrieden sein von "Anwendungsfällen", die erklären, welche Szenarien wahrscheinlich nicht funktionieren.

Das ist meistens nur politischer Müll und keine wirkliche technische Argumentation hier. Ich hoffe, dass eine der anderen Container-Engines anspringt und ich stattdessen Kubernetes gegen diese austauschen kann. Dann muss ich mich nicht mehr mit diesem Müll herumschlagen.

@NdubisiOnuora , welche Art von Bewerbung? Internetanwendung?

Ich habe 2 Konsolen-Apps (TCP-Server im Host und TCP-Client im Container).
Da sie TCP verwenden, brauche ich genau die IP ( docker.for.win.localhost passt nicht, weil es eine Domäne ist).

Zum Beispiel, Welche ip:port muss ich im TCP-Client setzen, wenn ich ip:port 127.0.0.1:9595 im TCP-Server setze?

Einfach die Domain in eine IP-Adresse auflösen?

@orf ,
Ich möchte diesen Code in C# verwenden:
IPAddress hostAddr = Dns.Resolve("docker.for.win.localhost").AddressList[0];
Aber vorher versuche ich, docker.for.win.localhost zu pingen, sehe das aber nicht, Fehler: Ping request could not find host docker.for.win.localhost. Please check the name and try again.
Mein Dockerfile:
FROM microsoft/windowsservercore
ADD . /
ENTRYPOINT powershell ping docker.for.win.localhost

Falls es jemand verpasst hat, glaube ich, dass die Lösung ab 18.03 host.docker.internal ist, obwohl dies aus irgendeinem Grund nur auf Docker für Windows funktioniert!? Warum nicht andere?

BEARBEITEN: Ich habe nicht gesehen, dass Kommentare von Github reduziert wurden ... 🤦‍♂️

Funktioniert bei mir:
docker run --rm -it --add-host "docker.for.localhost:$(ip -4 addr show docker0 | grep -Po 'inet \K[\d.]+')" alpine:latest ping docker.for.localhost

@lukasmrtvy Das funktioniert für eine Shell, aber wie wäre es mit docker-compose.yml ?

Ich habe einen Container erstellt, um dieses Problem auf allgemeine Weise zu lösen, der auf allen Plattformen funktioniert: https://github.com/qoomon/docker-host

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen