一、序言
因需要在创建的容器内使用IPv6网络进行测试,详细记录一下Docker如何开始IPv6,以及一些调试的奇淫技巧。
二、 docker配置IPv6
方案一:直接使用宿主机的网络在容器启动时加入--host
参数;
1 | docker run -d --name=busybox --net=host busybox top |
显然方案一,太low,这里就不在介绍了。
方案二:将宿主机IPv6网络下划分一个子段,通过nd代理容器流量;
1)查看宿主机IPv6地址
1 | xdnsadmin@ubuntu:~$ ifconfig ens3 |
2)划分子段并配置docker
配置/etc/docker/daemon.json
,重启容器进程
1 | xdnsadmin@ubuntu:~$ sudo cat /etc/docker/daemon.json |
3)配置转发
配置NDP(邻居发现协议)代理。关于这部分内容,请参见 Using NDP proxying。
1 | xdnsadmin@ubuntu:~$ sudo ip -6 neigh add proxy 2001:eb:8001:e01:2::2 dev ens3 |
4)测试IPv6
启动ubuntu 18.04镜像测试是否有IPv6网络,由于18.04镜像内无ifconfig
和ip
命令,可以安装相应工具或在宿主机上ping测试。
1 | xdnsadmin@ubuntu:~$ docker run -itd ubuntu:18.04 |
如需在镜像内测试,需要安装相应工具
1 | xdnsadmin@ubuntu:~$ docker exec -it 78604aa6c229 bash |
【奇淫技巧】也可以在宿主机上测试通过namespace的方式测试
1 | xdnsadmin@ubuntu:~$ docker ps -a |
上述操作可以保存为一个脚本
1 | id=docker inspect -f '{{.State.Pid}}' $1 |
方案二的一个缺点是每创建一个容器或重启机器都需要添加ip -6 neigh add proxy <ipv6_addr> dev ens3
,对于自动化构建较为麻烦。
【Tips】:检查宿主机DNS配置,在配置过程中出现宿主机仅配置了IPv6的DNS导致容器在开启IPv6服务后容器无法解析域名的情况。
方案三:创建支持IPv6的网桥
IPv6地址需要依据宿主机地址段来修改。
1 | xdnsadmin@ubuntu:~$ docker network create -d bridge --ipv6 --subnet "2001:eb:8001:e01:3::/120" --gateway="2001:eb:8001:e01:3::1" --subnet=172.30.0.0/16 --gateway=172.30.0.1 IPv6Net |
容器仍然无法访问v6网络,需要向方案二一样添加配置NDP(邻居发现协议)代理
1 | xdnsadmin@ubuntu:~$ sudo ip -6 neigh add proxy 2001:eb:8001:e01:3::2 dev ens3 |
相比方案二方案三的好处是能够指定容器的IP,可以预先配置好NPD代理。同样都有的缺点是IPv6无法像IPv4一样仅暴漏端口,IPv6下地址全端口都开放。
【参考链接】