Ich habe in Docker einen einfachen Knotenserver eingerichtet.
Dockerfile
FROM node:latest
RUN apt-get -y update
ADD example.js .
EXPOSE 1337
CMD node example.js
example.js
var http = require('http');
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World\n'+new Date);
}).listen(1337, '127.0.0.1');
console.log('Server running at http://127.0.0.1:1337/');
Erstellen Sie nun das Image
$ docker build -t node_server .
Jetzt im Container laufen lassen
$ docker run -p 1337:1337 -d node_server
$ 5909e87302ab7520884060437e19ef543ffafc568419c04630abffe6ff731f70
Stellen Sie sicher, dass der Container ausgeführt wird und die Ports zugeordnet sind:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5909e87302ab node_server "/bin/sh -c 'node exa" 7 seconds ago Up 6 seconds 0.0.0.0:1337->1337/tcp grave_goldberg
Lassen Sie uns nun eine Verbindung zum Container herstellen und überprüfen, ob der Server im Inneren ausgeführt wird:
$ docker exec -it 5909e87302ab7520884060437e19ef543ffafc568419c04630abffe6ff731f70 /bin/bash
Und in der Container-Befehlszeile geben Sie Folgendes ein:
root@5909e87302ab:/# curl http://localhost:1337
Hello World
Mon Feb 15 2016 16:28:38 GMT+0000 (UTC)
Sieht gut aus, oder?
Das Problem
Wenn ich denselben Curl-Befehl auf dem Host ausführe (oder mit meinem Browser zu http: // localhost: 1337 navigiere ), wird nichts angezeigt .
Irgendeine Idee, warum die Portzuordnung zwischen Container und Host nicht funktioniert?
Dinge, die ich bereits versucht habe:
- Laufen mit der
--expose 1337
Flagge
networking
docker
port
Assaf Shomer
quelle
quelle
--expose
". Sie erstellen ein Image mit derEXPOSE
Direktive und führen es dann mit--publish
(oder-p
) aus. Siehe meine Antwort unten.Antworten:
Ihre Ports werden korrekt angezeigt, aber Ihr Server überwacht Verbindungen
127.0.0.1
in Ihrem Container:http.createServer(function (req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); res.end('Hello World\n'+new Date); }).listen(1337, '127.0.0.1');
Sie müssen Ihren Server folgendermaßen ausführen:
http.createServer(function (req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); res.end('Hello World\n'+new Date); }).listen(1337, '0.0.0.0');
Beachten Sie die 0.0.0.0 anstelle von 127.0.0.1.
quelle
listen()
Funktion weglassen können, was meiner Meinung nach einfacher zu erfassen ist. Nodejs.org/api/…0.0.0.0
der Port derjenige ist, der mit der-P $PORT:$PORT/tcp
Option exportiert wird , würde normalerweise ein Server zurexport HOST=0.0.0.0
Laufzeit nachsehen.EXPOSE
istverpflichtendWenn Sie diesen Port anderen Containern "aussetzen" möchten.Wie BMitch kommentiert:
Damit:
Nicht genau: Sie müssen es mit Docker ausführen
-p 1337:1337
Sie benötigen entweder:
EXPOSE
Direktive (verwendet von-P
).-p 1337:1337
Der Test
curl http://localhost:1337
wurde aus dem Container heraus durchgeführt (keineEXPOSE
oder Veröffentlichung erforderlich).Wenn Sie möchten, dass es vom Linux-Host aus funktioniert, benötigen Sie
EXPOSE+-P
oder benötigen Sie-p 1337:1337
.Entweder.
Allein zu deklarieren ist gut, um die Absicht zu dokumentieren, macht aber nichts alleine.
Zum Beispiel:
In dieser Abbildung ist 8080 EXPOSE'd, veröffentlicht auf dem Linux-Host 8888.
Und wenn dieser Linux-Host nicht der tatsächliche Host ist, muss derselbe Port schnell auf den tatsächlichen Host übertragen werden. Siehe " Zugriff auf Tomcat, der im Docker-Container vom Browser ausgeführt wird? ".
Wenn localhost vom Linux-Host aus nicht funktioniert, versuchen Sie es mit seiner IP-Adresse:
Oder lassen Sie Ihren Server, wie oben erwähnt, Verbindungen von einer beliebigen IP- Adresse abhören:
0.0.0.0
Dies ist die Broadcast-Adresse oder das Null-Netzwerk .quelle