现象

http服务程序server.js如下

const http = require('http');

const hostname = '127.0.0.1';
const port = 3000;

const server = http.createServer((req, res) => {
      res.statusCode = 200;
      res.setHeader('Content-Type', 'text/plain');
      res.end('Hello World\n');
});

server.listen(port, hostname, () => {
      console.log(`Server running at http://${hostname}:${port}/`);
});

用node执行该脚本显示服务已启动。

node server.js
Server running at http://127.0.0.1:3000/

如果此时开一个新容器进程(exec),在容器内部执行wget http://127.0.0.1:3000是可以正常访问的。
但是在宿主机上 同样的方法无法访问,会返回
Connection reset by peer错误。
在宿主机以外的设备上用浏览器访问http://宿主机IP:3000也会出错。

原因

由于server.js中的监听地址为127.0.0.1,所以只允许本机(docker容器内部)访问。改成0.0.0.0即可,表示监听所有请求。也就是改成这样:
const hostname = '0.0.0.0';
这样,不管是宿主机用127.0.0.1:3000或是其他设备通过宿主机ip或宿主机绑定的域名都可以正常访问了。

Last modification:April 24, 2021
If you think my article is useful to you, please feel free to appreciate