2014-10-31 7 views
10

diese letzten zwei Tage habe ich Probleme mit Docker und ich kann es bekommen. Im Anschluss an das Andockdokument können Sie die Ports angeben, auf denen ein Container auf Verbindungen mit EXPOSE wartet. So weit, ist es gut!Docker EXPOSE. Kann es nicht bekommen

Wenn meine App auf Port 8080 hört, sollte ich meinen Docker-Container mit EXPOSE 8080 aussetzen und an Port 80 des Haupthosts mit docker run -p 80:8080 binden.

Hier ist meine Dockerfile:

# DOCKER-VERSION 0.0.1 

FROM ubuntu:14.10 

# make sure apt is up to date 
RUN apt-get update 

# install nodejs and npm 
RUN apt-get install -y nodejs-legacy npm git git-core 

ADD package.json /root/ 
ADD server.js /root/ 

# start script 
ADD start.sh /root/ 
RUN chmod +x /root/start.sh 

EXPOSE 8080 

CMD ./root/start.sh 

Und mein start.sh Runan nur cd /root/ & npm install & node server.js.

bekam ich einen einfacher express NodeJS App:

var express = require('express'); 

// Constants 
var PORT = 8080; 

// App 
var app = express(); 
app.get('/', function (req, res) { 
    res.send('Hello world\n'); 
}); 

app.listen(PORT); 
console.log('Running on http://localhost:' + PORT); 

Hier ist, wie ich mein Docker Bild bauen: docker build -t app1 . Und wie ich meine Docker starten: docker run -it -p 80:8080 --name app1 app1

Was wirklich verdrahtet ist, ist dies nicht Arbeiten. Um es funktionieren zu lassen, muss ich EXPOSE 8080 zu EXPOSE 80 ändern. Ich verstehe es nicht.

Eine Erklärung?

Dank für das Lesen, Tom

+0

Dies ist ein Konfigurationsproblem, ich verwende diese Art von Port-Mapping die ganze Zeit. "Nicht funktioniert" ist keine ausreichende Information. Sind die Ports auf dem Host geöffnet? Was passiert, wenn Sie es direkt abbilden? -p 8080: 8080? etc. etc. – user2105103

+0

Wenn ich sage "Nicht funktioniert", bedeutet dies, dass ich keine Verbindung zu meinem Container mit curl oder einem Browser auf Port 80 herstellen kann, auch wenn ich meinen Container auf dem Haupt-Host anfordere. Die Verwendung von "-p 8080: 8080" ändert nichts. –

Antwort

26

In Ihrem NodeJS App haben Sie die Anweisung app.listen(PORT); die NodeJS starten einen Server Empfang von Verbindungen auf der Loopback-Schnittstelle auf PORT Port erzählt. Dadurch wird Ihre App nur in der Lage sein, Verbindungen zu sehen, die von localhost (dem Container selbst) stammen.

Sie benötigen eine App sagen, an allen Schnittstellen auf Port hört PORT:

app.listen(PORT, "0.0.0.0"); 

Auf diese Weise wird es die Verbindungen von außerhalb des Docker Behälter Ursprung sehen.

+0

Danke, jetzt bekomme ich es;) –

+0

Es hat nicht für mich funktioniert. :( –

+0

Ich musste --production param am Ende der Zeile beim Ausführen von nodejs Befehl setzen. Mit diesem Parameter + Ihr Tipp funktioniert es jetzt. –