容器能用 IPv6 吗?默认是关的,怎么打开,打开之后容器之间、容器访问外网各是什么样?这篇用 docker network create --ipv6 实测地址分配、名字解析和外网连通性。
默认 bridge 网络的 EnableIPv6 = false 容器里 eth0 的 IPv6 地址:无 容器里 lo 的 IPv6:::1/128 disable_ipv6(all / eth0):0 / 1 默认路由(IPv6):没有
默认 bridge 网络的 EnableIPv6 是 false,容器 eth0 上的 disable_ipv6 是 1,没有 IPv6 地址和默认路由;守护进程配置里默认网络选项也是 enable_ipv6=false。
docker network create --ipv6(不指定子网):退出码 0 这个网络的 IPAM:172.19.0.0/16 gw=172.19.0.1 ; fd5c:c1ec:db63::/64 gw=fd5c:c1ec:db63::1 ; 容器 b 的地址:inet 172.19.0.2/16 ; inet6 fd5c:c1ec:db63::2/64 ; inet6 fe80::f8f0:43ff:fe46:50e2/64 容器 c 的 IPv6 地址:fd5c:c1ec:db63::3 b ping6 c 的 IPv6 地址:退出码 0;round-trip min/avg/max = 0.102/0.119/0.137 ms b 查询 bwlab-c56c 的 AAAA 记录:127.0.0.11:53 fd5c:c1ec:db63::3(退出码 0) b ping6 按名字 bwlab-c56c:退出码 0;PING bwlab-c56c (fd5c:c1ec:db63::3): 56 data bytes
创建网络时加 --ipv6,docker 自动分配一个 fd 开头的 /64 子网,容器拿到 IPv4 和 IPv6 两个地址;内置 DNS 对 AAAA 记录返回容器的 IPv6 地址,容器名可以直接用于 ping6。
容器 b ping6 2606:4700:4700::1111(Cloudflare DNS):退出码 0;round-trip min/avg/max = 202.382/202.382/202.382 ms 容器 b 的默认 IPv6 路由:default via fd5c:c1ec:db63::1 dev eth0 metric 1024 守护进程配置(虚拟机里的 daemon.json)中默认网络选项的 IPv6 项:"com.docker.network.enable_ipv6":"false"
这个容器用私有的 fd 地址,仍然 ping6 通了外网的 IPv6 地址,说明出网经过了转换。这个结果依赖我这台 Mac 的网络是否有 IPv6 出口,在没有 IPv6 的网络上可能不通,我只测了一次。