2016-02-15 6 views
16

Ich habe einen einfachen Knoten-Server in Docker eingerichtet.Docker-Ports sind nicht ausgesetzt

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/'); 

nun das Bild bauen

$ Andockfenster -t node_server bauen.

nun in Behälter laufen

$ -p 1337 laufen Docker: 1337 -d node_server
5909e87302ab7520884060437e19ef543ffafc568419c04630abffe6ff731f70 $

Überprüfen der Behälter läuft und Ports sind abgebildet:

$ 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 jetzt an dem Behälter befestigen und den Server überprüfen läuft innen:

$ Docker exec-it 5909e87302ab7520884060437e19ef543ffafc568419c04630abffe6ff731f70/bin/bash

Und in dem Behälter Befehl Zeilentyp:

[email protected]:/# curl http://localhost:1337 
Hello World 
Mon Feb 15 2016 16:28:38 GMT+0000 (UTC) 

Sieht gut aus oder?

Das Problem

Wenn ich den gleichen curl Befehl auf dem Host ausgeführt werden (oder navigieren Sie mit meinem Browser http://localhost:1337) Ich sehe nichts.

Eine Idee, warum die Port-Zuordnung zwischen Container und Host nicht funktioniert?

Dinge, die ich schon versucht:

  • mit dem --expose 1337 Flagge Rennen
+0

Sie laufen nicht mit '--expose'". Sie erstellen ein Bild mit der 'EXPOSE'-Anweisung, * dann * laufen Sie mit' --publish' (oder '-p'). Siehe meine Antwort unten. – VonC

Antwort

30

Ihre Ports ausgesetzt sind korrekt, aber Ihr Server auf Verbindungen auf 127.0.0.1 in Ihrem Behälter hören:

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 benötigen Server wie folgt auszufü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'); 

Notiere die 0.0. 0.0 statt 127.0.0.1.

+0

Yup, das war es. Vielen Dank ! –

+0

Gern geschehen. –

+1

Hören auf 0.0.0.0 sieht sehr seltsam aus, nicht sofort offensichtlich, was es bedeutet. Es scheint jedoch, der Standard zu sein, so dass Sie dieses Argument einfach aus der 'listen()' Funktion weglassen können, die ich denke, ist einfacher zu verstehen https://nodejs.org/api/net.html#net_server_listen_port_host_backlog_callback – Davos

11

SETZEN 1337 in die Datei Docker

EXPOSE obligatorisch ist, wenn Sie möchten hinzufügen „entlarven "Dieser Port zu anderen Containern

Laufen mit der --expose 1337 Flagge

Nicht genau: Sie docker run brauchen es with -p 1337:1337

Sie benötigen beides:

  • ein Bild mit der
  • darin EXPOSE Richtlinie bauen und führen Sie es mit dem Port auf der veröffentlichten Host -p 1337: 1337

Der Test curl http://localhost:1337 aus dem Behälter durchgeführt wurde (keine EXPOSE oder publish erforderlich).
Wenn Sie möchten, dass es vom Linux-Host funktioniert, benötigen Sie EXPOSE und Sie benötigen -p 1337:1337.
Beide.

Sie können nur einen Port veröffentlichen, der als exposed deklariert wurde.
Das Deklarieren von Expose allein ist nicht genug.

Zum Beispiel:

https://i.stack.imgur.com/wmKgd.png

In dieser Figur ist 8080 EXPOSE'd, an dem Host-Linux veröffentlicht 8888.
Und wenn der Linux-Host ist nicht die eigentliche Host, dass die gleichen Bedürfnisse Port schnell zum aktuellen Host gesendet werden. Siehe "How to access tomcat running in docker container from browser?".

Wenn localhost nicht aus dem Linux-Host nicht funktioniert, versuchen, seine IP-Adresse:

CID=$(docker run -p 1337:1337 -d node_server) 
CIP=$(docker inspect --format '{{ .NetworkSettings.IPAddress }}' ${CID}) 
curl http://${CIP}:1337 

Oder, wie oben erwähnt, machen Sie Ihren Server hören von Verbindungen von jeder IP kommen: 0.0.0.0 die the broadcast address or zero network ist.

+0

Vielen Dank für den Kommentar, aber ich habe bereits versucht, die EXPOSE 1337 und es funktioniert nicht –

+0

@AssafShomer Sie brauchen beide, das ist der aller Punkt meiner Antwort – VonC

+0

@AssafShomer Ich habe die Antwort in bearbeitet um diesen Punkt klarer zu machen. – VonC

Verwandte Themen