docker集装箱没有IPv6连接

我在Docker中启用IPv6时遇到了严重的问题。

环境

  • 该主机正在运行Debian Jessie。
  • 这是一个虚拟服务器(KVM)。
  • eth0在w:xy:z :: / 64这样的networking中有一个像w:x:y:z :: 1这样的静态configuration的地址,这个地址由我的托pipe公司分配给我。
  • 我的主机能够正常使用IPv6:Ping外部世界的作品,运行在一个容器上的网站(端口80绑定到主机:80)可以通过ipv6访问。

问题

然而,我不能从容器内访问外面的世界! 使用下面的参数重新启动docker后,我的docker0桥没有IPv6地址。 没有路由也没有网关(没有ipv6地址没有意义)。

我的Docker设置:Docker在DOCKER_OPTS中用这些参数启动

DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4 --ipv6 --fixed-cidr-v6=w:x:y:z:a::/80" 

一些ipv6主机configuration参数:

 net.ipv6.conf.all.forwarding = 1 net.ipv6.conf.default.forwarding = 1 

这里是我自己创build的networking之一:

 root@wopr:~# docker network inspect wopr6 [ { "Name": "wopr6", "Id": "ddc192d4af2a8edc809975e84cf3e4cb82c24d4cfe970dd8e3fc7d6ff31e20ee", "Scope": "local", "Driver": "bridge", "EnableIPv6": true, "IPAM": { "Driver": "default", "Options": {}, "Config": [ { "Subnet": "172.23.0.0/16", "Gateway": "172.23.0.1/16" }, { "Subnet": "w:x:y:z:a:0:0:0/80", "Gateway": "w:x:y:z:a::1" } ] }, "Internal": false, "Containers": { "dff30ab1496a4c3689ad6da0837fdb6cf7ea1a5b32312116214313b5b14ed07e": { "Name": "happy_varahamihira", "EndpointID": "8cd4ed4b91d8421171ec8cc771bbe7b7d81f05dc9f4679f20c642c2e828ec475", "MacAddress": "02:42:ac:17:00:02", "IPv4Address": "172.23.0.2/16", "IPv6Address": "w:x:y:z:a::2/80" } }, "Options": {}, "Labels": {} } ] 

以上是容器内部的一些信息,如上所述:

地址

 root@dff30ab1496a:/# ip -6 a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 inet6 ::1/128 scope host valid_lft forever preferred_lft forever 332: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 inet6 2a03:4000:6:2158:a::2/80 scope global nodad valid_lft forever preferred_lft forever inet6 fe80::42:acff:fe17:2/64 scope link valid_lft forever preferred_lft forever 

路线

 root@dff30ab1496a:/# ip -6 r 2a03:4000:6:2158:a::/80 dev eth0 proto kernel metric 256 fe80::/64 dev eth0 proto kernel metric 256 default via 2a03:4000:6:2158:a::1 dev eth0 metric 1024 

 PING ipv6.l.google.com (2a00:1450:4001:811::200e): 56 data bytes, id 0x0011 = 17 --- ipv6.l.google.com ping statistics --- 1 packets transmitted, 0 packets received, 100% packet loss 

我错过了什么?

所以在等了两个星期的答案和研究了几个小时后,开放了一个赏金我find了解决办法。

  1. 设置一个新的启用IPv6的networking,并为我分配一个子网(my / 64的一个/ 80)

     docker network create --ipv6 --subnet=w:x:y:z:aaaa::/80 myfancynetwork 

    现在启动一个容器并将其连接到新的networking。 找出它的IP地址。 假设在这个例子中是w:x:y:z:aaaa :: 5。

  2. 启用proxy_ndp

     sysctl net.ipv6.conf.eth0.proxy_ndp=1 

    你也可以通过/etc/sysctl.conf来configuration这个设置,使之持久化。

  3. 添加代理使我的主机(IPv6启用)响应来自我的路由器的邻居Sollicitation消息(例如:“嘿,谁是主机w:x:y:z:aaaa :: 5?”)与邻居通告消息做我自己!”)。

     ip -6 neigh add proxy w:x:y:z:aaaa::5 dev eth0 

    ndppd可以帮助您自动通告您的networking上的任何主机。

巴姆,就是这样。