我的docker容器在端口8500上暴露了HTTP接口,该端口映射到主机端口8500。未启用IPv6。这仍然意味着,我应该能够在localhost:8500上访问它。首选IPv6,因此我最终请求了[:: 1]:8500。这个卡住了,再也回不来了。
用curl复制它,这个命令卡住了:
curl -g -6 "http://[::1]:8500"
curl的--verbose选项不会显示任何内容,--ascii-trace也不会显示任何内容。同时,对IPv4本地主机的请求成功:
curl http://127.0.0.1:8500
给我期望的HTML。如果我在回送上运行IPv4 HTTP服务器,请使用
python -m SimpleHTTPServer 4001
然后我得到了很多用于IPv4本地主机的HTML
curl http://127.1:4001
以及IPv6的正确连接失败:
curl -g -6 "http://[::1]:4001"
curl: (7) Failed to connect to ::1 port 4001: Connection refused
注意事项:Docker 1.7.1。容器未启用IPv6 ,因此没有IPv6 iptable规则。(ip6tables -v -L不提供任何内容)
我的问题是:为什么请求卡住了,怎么办?
1
您能告诉我们“ netstat -6 -an”的输出吗?
—
Rui F Ribeiro
是的,码头工人正在那个端口上监听:
—
mknecht 2015年
tcp6 0 0 :::8500 :::* LISTEN 1648/docker
令人着迷。为什么?为什么会阻塞?
我想是监听且未配置,或在sysctl中禁用了IPv6。nginx,apache,lighthttp,请问您将有问题的Web服务器附加到帖子中吗?
—
Rui F Ribeiro 2015年
在容器内部,Consul(用于配置的键值存储)正在监听。但我认为这无关紧要:容器尚未启用IPv6。该请求永远不会到达领事。不过,我不知道它会卡在哪一层。在主机上,
—
mknecht
/proc/sys/net/ipv6/conf/all/disable_ipv6
产生0,因此应启用IPv6。
那并不重要。您甚至可以在sysctl和较新的内核中禁用IPv6,只要程序绑定到IPv6套接字,请求就会被兑现。麻烦的是,您必须遍历支持IPv6的每个守护程序并禁用IPv6配置。
—
Rui F Ribeiro 2015年