Docker EXPOSE。无法得到它

时间:2014-10-31 14:51:39

标签: node.js docker

过去两天,我遇到了码头工人的麻烦,我可以得到它。在docker doc之后,您可以公开容器将侦听与EXPOSE的连接的端口。到目前为止,太棒了!

如果我的应用程序侦听端口8080,我应该使用EXPOSE 8080公开我的docker容器,并使用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 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);

以下是我构建docker镜像的方法:docker build -t app1 . 以及我如何启动我的码头:docker run -it -p 80:8080 --name app1 app1

真正有线,这是行不通的。为了使其有效,我必须将EXPOSE 8080更改为EXPOSE 80。我不明白。

有任何解释吗?

感谢阅读, 汤姆

1 个答案:

答案 0 :(得分:30)

在您的nodejs应用程序中,您有指令app.listen(PORT);,它告诉nodejs启动服务器,侦听端口PORT上的环回接口上的连接。 因此,您的应用只能看到源自localhost的连接(容器本身)。

您需要告诉您的应用监听端口PORT上的所有接口:

app.listen(PORT, "0.0.0.0");

这样,它将看到源自Docker容器外部的连接。