现象
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或宿主机绑定的域名都可以正常访问了。