【问题标题】:Docker not exposing portsDocker 不暴露端口
【发布时间】:2018-09-03 23:25:20
【问题描述】:

我正在尝试将容器的 3000 端口暴露给主机。这是我正在使用的命令:

docker run -ti --expose=3000 -p 3000:3000 dockerName

docker psPORTS 部分,我看到了0.0.0.0:3000->3000/tcp

当我尝试连接到该端口上的简单 NodeJS 服务器时,我得到Unable to connect。我正在运行 Docker 18.03.0-ce 和最新版本的 NodeJS。

我尝试通过localhost(127.0.0.1)IP,内部容器IP(172.17.0.1),主机OS下发的IP(172.17.0.1)和主机IP都没有成功。我还完全禁用了主机操作系统上的防火墙。

这是 NodeJS 代码,在主机上运行良好:

var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n');
}).listen(3000, "127.0.0.1");
console.log('Server running at http://127.0.0.1:3000/');

有没有办法让它在容器内工作并通过主机操作系统连接到它?

【问题讨论】:

标签: docker


【解决方案1】:

您无法连接的原因是您的 Node.js 应用程序侦听 IP 127.0.0.1,该 IP 在容器外不可用。

更改您的应用程序,使其侦听 IP 0.0.0.0,您将能够正确连接。

【讨论】:

  • 那行得通。谢谢!出于好奇,为什么初始方法不起作用,有没有办法让它起作用?
  • 初始方法不起作用,因为应用程序正在侦听容器外部无法访问的 localhost 接口。 Docker 使用网络连接到容器,并且由于 localhost 在主机外部无法访问,因此在容器外部也不可用。解决此问题的唯一方法是在容器内创建端口映射,但这比收益更多。如果担心安全问题,将 docker 的监听地址绑定到 127.0.0.1 也可以达到同样的效果。
  • 感谢您的信息。