it-swarm.com.de

Kann nicht auf den öffentlich zugänglichen Docker-Container-Port von einem externen Computer aus zugegriffen werden, nur von localhost?

Auf meinem Ubuntu Linux 14.04-Computer läuft ein Docker-Container, der einen Port öffentlich zugänglich macht:

docker run --name spacyapi -d -p 127.0.0.1:7091:7091 jgontrum/spacyapi:en

Ich kann ohne Probleme auf dem lokalen Computer Befehle an den Server im Container anschließen und ausführen. Zum Beispiel:

curl http://localhost:7091/api --header 'content-type: application/json' --data '{"text": "This is a test."}' -X POST

Der Befehl wird getreu ausgeführt. Wenn ich jedoch den gleichen CURL-Befehl von einem externen Rechner aus versuche, erhalte ich die Fehlermeldung "Verbindung abgelehnt":

curl http://192.5.169.50:5000/api --header 'content-type: application/json' --data '{"text": "This is a test."}' -X POST
curl: (7) Failed to connect to 192.5.169.50 port 7091: Connection refused

Dabei ist 192.5.169.50 die IP-Adresse der Box, in der der Docker-Container ausgeführt wird.

Ich glaube nicht, dass ich iptables-Regeln brauche, da ich für den Node.JS-Server, der auf derselben Box ausgeführt wird, keine Einstellungen vornehmen musste. Alle anderen Computer in meinem lokalen Netzwerk können problemlos auf den Node.JS-Server zugreifen. Nicht jedoch der Docker-Container, der als Server fungiert.

Wie kann ich das beheben?

7
Robert Oschler

Sie haben Ihren Port nicht öffentlich mit dieser Flagge veröffentlicht:

-p 127.0.0.1:7091:7091

Dieses Flag gibt an, auf der Host-Schnittstelle 127.0.0.1 (localhost), Port 7091, für den Container-Port 7091 zu veröffentlichen. Die einzige Möglichkeit, diesen Port zu erreichen, besteht darin, auf dem Host zu sein und eine Verbindung zur Loopback-Schnittstelle herzustellen.

Um den Port öffentlich zu veröffentlichen, entfernen Sie die IP-Adresse von diesem Flag:

-p 7091:7091

oder explizit veröffentlichen an allen Schnittstellen mit:

-p 0.0.0.0:7091:7091

Das letztere Format ist identisch mit dem ersten, solange Sie die Einstellungen Ihres Docker-Daemons nicht mit dockerd --ip x.x.x.x überschrieben oder den Wert ip in Ihrer Datei /etc/docker/daemon.json festgelegt haben.

7
BMitch

Ich glaube nicht, dass die IP des Containers 192.5.169.50 ist. Versuchen Sie es mit docker inspect <container-uid> | grep IPAddress, um die IP des Containers zu überprüfen. Ich glaube, es sollte so etwas wie 172.17.0.X sein.

Sie könnten auch docker run -d --network=Host <image> tun, der den Container auf dem Host-Netzwerk stapelt.

Container sind nur etwas über dem Host, der Host ist derjenige, der tatsächlich mit der Außenwelt kommuniziert.

2
Bill Cheng