Docker端口不公开

我在Docker中设置了一个简单的节点服务器。

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

现在build立图像

$ docker build -t node_server。

现在在容器中运行

$ docker run -p 1337:1337 -d node_server
$ 5909e87302ab7520884060437e19ef543ffafc568419c04630abffe6ff731f70

validation容器正在运行,端口已映射:

$ 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 

现在,让我们附加到容器,并validation服务器正在运行:

$ docker exec -it 5909e87302ab7520884060437e19ef543ffafc568419c04630abffe6ff731f70 / bin / bash

并在容器命令行中input:

 root@5909e87302ab:/# curl http://localhost:1337 Hello World Mon Feb 15 2016 16:28:38 GMT+0000 (UTC) 

看起来不错吧?

问题

当我在主机上执行相同的curl命令(或者用我的浏览器导航到http:// localhost:1337 ),我什么都看不到。

任何想法为什么容器和主机之间的端口映射不起作用?

我已经尝试过的事情:

  • --expose 1337标志运行

您的端口正在正确显示,但您的服务器正在监听容器内127.0.0.1上的连接:

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

你需要像这样运行你的服务器:

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

请注意0​​.0.0.0而不是127.0.0.1。

将EXPOSE 1337添加到docker文件

如果您想将该端口“公开”到其他容器,则必须使用EXPOSE

--expose 1337标志运行

不完全是:你需要docker运行它-p 1337:1337

你需要两个:

  • 使用EXPOSE指令构build一个图像
  • 使用主机上发布的端口运行它-p 1337:1337

testingcurl http://localhost:1337是从容器内完成的(不需要EXPOSE或发布)。
如果你想让它在Linux主机上工作,你需要EXPOSE 你需要-p 1337:1337
都。

您只能发布已声明为已公开的端口。
宣称它是单独暴露是不够的。

例如:

http://img.gdocker.com/networking/wmKgd.png

在该图中,8080被EXP​​OSE发布到Linux主机8888。
如果这个Linux主机不是真正的主机,那么同一个端口需要被快速实现到实际的主机。 请参阅“ 如何从浏览器访问在Docker容器中运行的Tomcat? ”。

如果本地主机不能从Linux主机上运行,​​请尝试使用其IP地址:

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

或者,如上所述,让您的服务器监听来自任何IP: 0.0.0.0 ( 广播地址或零networking)的连接 。