docker桥接容器中支持与ipv6地址的联通

场景还原

之前用openresty做了一个动态代理http请求的网关,为了部署方便,打包成了docker镜像, 以docker容器的方式提供的服务,网络模式选择的桥接。最近多了个需求,需要把用户请求转发到ipv6地址的目标服务器上,之前在写代码的时候,做过兼容,所以觉得没问题,但是实际测试,才发现是不OK,最后发现是容器中无法ping通对方的ipv6地址(ping6 xxxx), 从容器中退出来,宿主机ping6是可以通的, 所以就把问题锁定在了docker对ipv6的支持上。

docker 版本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Client:
Version: 1.12.6
API version: 1.24
Package version: docker-1.12.6-71.git3e8e77d.el7.centos.1.x86_64
Go version: go1.8.3
Git commit: 3e8e77d/1.12.6
Built: Tue Jan 30 09:17:00 2018
OS/Arch: linux/amd64

Server:
Version: 1.12.6
API version: 1.24
Package version: docker-1.12.6-71.git3e8e77d.el7.centos.1.x86_64
Go version: go1.8.3
Git commit: 3e8e77d/1.12.6
Built: Tue Jan 30 09:17:00 2018
OS/Arch: linux/amd64

解决方法

centos7.2:
从docker 官网看到的信息来看,是需要对docker daemon做一些设置,让daemon启动时增加对ipv6的支持,docker是我用yum在centos7.2上自动安装的,解决方法就是vim /etc/docker/daemon.json,在其中增加如下两行:

1
2
"ipv6": true,
"fixed-cidr-v6": "2002:ac1c:e361::1/120"(这里根据自己宿主机的ipv6地址情况进行配置)

centos 6.5:
同事的centos6.5的机器上,解决方式有所不同,需要做的是修改/etc/sysconfig/docker这个配置文件,在其中加入如下一行,这里的ipv6地址为宿主机对应网卡的ipv6地址

1
other_args=" --ipv6 --fixed-cidr-v6=2002:ac1c:e361::1/120"

修改完配置,执行service docker restart即可, 重启docker daemon后,机器上原本的容器重启一下即可,不需要再做额外配置, 此时docker exec 进入容器中,发现已经可以ping通目标ipv6地址。

验证

验证1 :
在做完上述配置后,ifconfig查看宿主机的docker0网卡,会看到上面会多出一条inet6的信息。

验证2:
docker run启动一个新容器后, docker inspect container-id,查看容器的NetworkSettings里面的ipv6部分,是否有ipv6网关信息