2014-10-31 47 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