2014-10-31 66 views
10

在過去的兩天裏,我遇到了碼頭問題,我可以得到它。在docker doc之後,您可以暴露容器將偵聽與EXPOSE連接的端口。到現在爲止還挺好!Docker EXPOSE。無法得到它

如果我的應用程序在端口8080上偵聽,我應該使用EXPOSE 8080公開我的碼頭集裝箱,並將其與docker run -p 80:8080綁定到主主機的端口80。

這裏是我的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 

而我只是start.sh汝南cd /root/ & npm install & node server.js

我有一個簡單明確的NodeJS應用:

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

這裏是我建立我的搬運工圖像:docker build -t app1 . ,我該如何啓動我的搬運工:docker run -it -p 80:8080 --name app1 app1

什麼是真正的連線,這不是加工。要使它工作,我必須將EXPOSE 8080更改爲EXPOSE 80。我不明白。

任何解釋?

感謝您的閱讀, 湯姆

+0

這是一個配置問題,我一直使用這種類型的端口映射。 「不工作」不是足夠的信息。主機上的端口是否打開?如果你直接繪製它,會發生什麼? -p 8080:8080?等等 – user2105103 2014-10-31 16:56:14

+0

當我說「不工作」時,這意味着即使我在主要主機上請求我的容器,我也無法使用curl或80端口上的任何瀏覽器連接到我的容器。使用「-p 8080:8080」不會改變任何內容。 – 2014-11-03 08:38:35

回答

26

在你的應用程序的NodeJS,你必須告訴給的NodeJS啓動服務器偵聽端口PORT loopback接口上連接的指令app.listen(PORT);。 因此,您的應用程序將只能看到源自本地主機(容器本身)的連接。

你需要告訴你的應用程序在所有接口監聽端口PORT

app.listen(PORT, "0.0.0.0"); 

這樣,它會看到連接從泊塢容器以外的地方。

+0

謝謝,現在我明白了;) – 2014-11-03 08:47:18

+0

它沒有爲我工作。 :( – 2015-01-30 07:38:54

+0

我不得不在生產線末尾運行nodejs命令時使用這個參數+你的提示現在有效 – 2015-01-30 07:48:53