docker 执行http服务端口映射不生效


使用nodejs的docker镜像,

1.在里面创建了一个http服务,然后监听30000端口

```js
var http = require('http');

var server = http.createServer(function(req, res) {
res.end('hello i am [' + process.pid + ']');
});

server.listen(30000);
```

2.执行 docker run -ti --name test3 -p 30000:30000 server sh

3.进到控制台以后运行了http服务;

4.在外面执行docker ps -a效果是

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
aa4be23e6353 server "sh" About an hour ago Up About an hour 0.0.0.0:30000->30000/tcp test3


5.但是访问本地的30000端口还是拒绝连接

➜ ~ telnet localhost 30000
Trying ::1...
telnet: connect to address ::1: Connection refused
Trying 127.0.0.1...
telnet: connect to address 127.0.0.1: Connection refused
telnet: Unable to connect to remote host


不知道啥原因…==#,有人能帮忙解答一下么?

a.png
已邀请:

徐磊 - BlackOps@Qunar

赞同来自: albin


先确认下docker-proxy绑定的地址是否是IPV6的。我个人的机器上默认情况下是绑定IPV6的,快速解决的办法就是给-p参数制定bind的IP,例如-p 127.0.0.1:30000:30000。然后访问本地的30000端口就可以了。

关于-p默认bind地址是IPV6还是IPV4的问题,可以参考这个问题,讨论很详细,内容比较全面了。

https://github.com/docker/docker/issues/2174

tuxknight

赞同来自: albin


server.listen(30000); 默认监听127.0.0.1这个IP,但这个IP地址是host的IP而不是container的IP,所以应该指定监听的IP地址,或者hostname。
解决方法就是先获取到hostname,然后server.listen的时候指定hostname。

[已注销]

赞同来自: albin


我自己试了一下是OK的,直接用的你的代码。你能不能贴下netstat -tlnp的结果?

要回复问题请先登录注册