看完就感觉Docker对IPv6的支持还差很多
Experimental
步骤
方法来自这个知乎的文章,但是这个daemon的选项,除了在一个issue里面,就没有搜到了,也不知道有没有进文档
修改
/etc/docker/daemon.json
为{
"ipv6": true,
"fixed-cidr-v6": "fd00::/80",
"experimental": true,
"ip6tables": true
}
然后重启
sudo systemctl restart docker
然后默认的bridge的network就会有ipv6了
sudo docker run --rm -it busybox ping -6 -c4 ipv6-test.com
sudo docker run --rm -it busybox ifconfig


对于docker-compose,把网络修改为
network_mode: bridge
就可以了,问题
1
我想创建一个新的网络,而不是用默认的网络
参考这个里面的docker compose https://github.com/qdm12/gluetun/issues/425
...
networks:
- gluetun
sysctls:
- net.ipv6.conf.all.disable_ipv6=0
networks:
gluetun:
enable_ipv6: true
但是
docker-compose up
的时候会发生下面的错误error: could not find an available, non-overlapping ipv6 address pool among the defaults to assign to the network
重写默认的network也会报相同的错误
networks:
default:
enable_ipv6: true
2
在最开始看到这个文章的时候,能够拿到ipv6的地址,也可以正常的使用,但是给gluetun的docker compose加上了network_mode的时候,在日志里面可以看到报错
ERROR vpn: cannot add route for interface: permission denied: when adding route: {Ifindex: 2 Dst: ::/0 Src: <nil> Gw: <nil> Flags: [] Table: 51820}
在里面查看网卡,发现 wg0 的网卡是没有正常运行起来的,然后就去看其他的东西了
但是尝试了很多东西之后,又试了试这个方法,发现正常了?
upd: 通过撤销发现,是我在尝试这个方法的时候,把之前的给删掉了
sysctls:
net.ipv6.conf.all.disable_ipv6: 0
但是在知乎的文章里面并没有配置这个参数,搞不懂为什么就可以了,并且在上面的docker run里面也是能够使用的
upd2: 发现不加
sysctls
的时候是 permission denied,并且进容器里面看, disable_ipv6 = 1
$ sysctl net.ipv6.conf.all.disable_ipv6
net.ipv6.conf.all.disable_ipv6 = 1
查看ip的话,是拿到了ipv6的地址
406: eth0@if407: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fd00::242:ac11:2/80 scope global nodad
valid_lft forever preferred_lft forever
inet6 fe80::42:acff:fe11:2/64 scope link
valid_lft forever preferred_lft forever
但是加了
sysctls
但是手动配置了 disable_ipv6 = 1
,进容器里面看$ sysctl net.ipv6.conf.all.disable_ipv6
net.ipv6.conf.all.disable_ipv6 = 1
并且没有拿到ipv6的地址
408: eth0@if409: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
报错是报连不上导致的问题
ERROR peer(bmXO…fgyo) - Failed to send handshake initiation: cannot assign requested address
network: host
看起来用 host 的网络是最方便的
docker run ... --network=host ...
docker-compose.yaml
network_mode: host
但是这个不可以和gluetun直接用在一起,会出大问题
文档
文档里面就一点点,在
/etc/docker/daemon.json
里面设置 "ipv6": true
,并添加合适的前缀{
"ipv6": true,
"fixed-cidr-v6": "2001:db8:1::/64"
}
最开始看到的就是这个,然后也没有改前缀,在docker compose里面设置了一下
sysctls:
- net.ipv6.conf.all.disable_ipv6=0
进容器里面之后,的确eth0有ipv6的本地地址了,但是ping外面的话是ping不通的,显示Unreachable Network,就是坏了
看到了这个,说要改合适的前缀,但是现在拿到的运营商给的ipv6的前缀一般而言也不是固定的,也会有防火墙的问题。也就没去试设置合适的前缀的方法了,对于后面的IPv6 NAT的方法,感觉不那么阳间,并且在看到这个文章的时候,也同时在看上面的用了experiment方法的文章,感觉这个不如上面的好用,也就没有尝试了
并且也没有看懂文档里面的
--ipv6
的flag对应到docker compose应该是哪个,不太清楚这个改如何进行配置iptables
这个没有尝试
docker-ipv6nat
这个也没有尝试