我正在运行一个小型arm板,在我们的本地网络中提供一些服务。当我试图理解docker的ipv6支持时,我对我第一次测试的结果感到非常困惑。
我的网络由一个使用dhcpv6的路由控制,每个客户端都有两个有效的全局ipv6地址(也是一个本地ipv4),并且受到路由器防火墙的保护(不允许从互联网向客户端发出请求)。
arm板运行的是ubuntu16.04,有一个有效的ipv6地址,并启用了隐私扩展。
所有码头集装箱都使用默认桥接器网络,不作任何调整。
在码头主机上
netstat -tulpen|grep docker显示
tcp6 0 0 :::8080 :::* LISTEN 0 22490 1559/docker-proxy没有一个ipv4服务侦听。
在这个码头容器内,同样的netstat请求给出
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 0 23955 8/nginx
tcp6 0 0 :::80 :::* LISTEN 0 23956 8/nginx Nginx正在监听ipv6和ipv4 -端口80是公开给端口8080的
docker run (...) -p 8080:80 (...) 桥梁网络监测
docker network inspect bridge显示默认的本地桥。
(...)
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
(...)
"b10cf3750252daf0ba11a59cfcd64c72194adcaacd4b9b5df17fae0f53fc4f00": {
"Name": "ng",
"EndpointID": "f42de3590072dec2b0d3fae61fc89aeffcb8e6e716b27f5736272fcc8f94f643",
"MacAddress": "02:42:ac:11:00:03",
"IPv4Address": "172.17.0.3/16",
"IPv6Address": ""
}
(...)正如我所理解的配置,码头桥ipv6是禁用的,码头容器不只有一个ipv6 - ipv4。Nginx在ipv4和ipv6上都监听--忽略了没有可用ipv6的事实。
为什么主机上的nginx服务只在端口8080上公开,仅通过ipv6列出?
使用另一个网络客户端验证这一点
curl -g -6 http://[DOCKER_HOST_IPV6]:8080
curl http://[DOCKER_HOST_IPV4]:8080显示ipv6和ipv4都可以使用该服务--为什么netstat不将服务显示为ipv4服务?
如果在网桥网络配置中禁用了ipv6,那么服务是如何到达的?
我在udp 1194上运行了另一个容器openvpn。我将服务器配置为使用udp6,并在容器内使用netstat进行验证。此容器使用-p标志以相同的方式公开,但在主机上根本不可用。如何正确地连接此服务?
发布于 2018-04-17 11:00:19
这不是侦听ipv6的nginx容器(顺便说一句,您在容器中看到的tcp6套接字绑定在它的fe80::和:1上,并且它无法从容器世界之外到达)。这是管理主机端口的停靠代理进程。当您使用"-p 8080:80“时,停靠代理在主机上绑定一个tcp6套接字::0,侦听端口8080 ( tcp6套接字也接受tcp4 )。
因此,码头上禁用的ipv6支持(默认)意味着您的容器只分配了ipv4,但是停靠代理“将”v6“转换”为v4:
(ipv6世界) ->码头主机ipv6 6:8080 -> 码头代理 -> nginx容器ipv6 4:80
https://serverfault.com/questions/878837
复制相似问题