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
。
都。
您只能发布已声明为已公开的端口。
宣称它是单独暴露是不够的。
例如:
在该图中,8080被EXPOSE发布到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)的连接 。