这两天因为某个需求,一直在研究这个问题。
网上都看了,什么ipv6 subnet daemon.json 之类的,都是一通抄,还是没有能说明白关键联系的,很多都是抄的碎片化信息。
因为说不清楚关联,所以就没法在实际环境中结合实际灵活解决问题。
docker的版本
docker的版本问题。初步结论是:docker engine 的版本大于等于20.10.2 。参见:https://zhuanlan.zhihu.com/p/342633966
经过验证,如果版本不对,在配置daemon.json时,就会报错,令人莫名, 实际是版本的ipv6支持问题,不支持新字段。
注意:系统默认的docker版本是跟这个系统的代码版本库走的,所以想要最新的docker版本,首先要确认自己的系统,否则要手动安装。
daemon.json
这个也是网上看到最多的:
{
"ipv6": true,
"fixed-cidr-v6": "fd00::/80",
"experimental": true,
"ip6tables": true
}
在跳过了docker版本的坑,这里就可以配置了。这里核心的是那个fixed-cidr-v6, 很多人看不懂这个,不知道这个要怎么改,这个就要自己实际弄懂ipv6的子网了,要根据自己的外网IPV6地址,配置实际的子网段。参见 https://docs.docker.com/engine/daemon/ipv6/
检查对应docker的网络配置
docker inspect xxx
检查 Networks 字段,下面对应就是network的对象,如下例子就是 bridge:
"Networks": {
"bridge": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "xxx",
"EndpointID": "xxx",
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "fd17::1",
"GlobalIPv6Address": "fd17::242:ac11:2",
"GlobalIPv6PrefixLen": 64,
"MacAddress": "xxx",
"DriverOpts": null
}
}
然后我们继续检查 bridge对ipv6的支持情况:
docker network inspect bridge
我们检查EnableIPv6字段:
"Name": "bridge",
"Id": "xxx",
"Created": "xxx",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": true,
如果是true,则证明此bridge网络已经支持ipv6
测试docker获取ipv6能力
docker run --rm -it busybox ping -6 -c4 ipv6-test.com
docker run --rm -it busybox ifconfig
正常返回,就说明系统的docker ipv6能力正常