Docker Container 分配独立 IPv6 地址

发布于 2019-04-27  61 次阅读


** Deprecated!这样实现有一些小问题无法解决,请看这篇. **

因为 我国的 IPv6 建设逐渐提上了日程,改造自己的网络环境,全面拥抱 IPv6 刻不容缓 IPv6 不计流量,所以我要配置我的 Docker 支持 IPv6 网络。

踩过的坑

按照官网文档,只需要在 /etc/docker/daemon.json 里打开 IPv6 并配置 IPv6 前缀,Docker 就会按照前缀自动给每个容器配置 v6 地址。但是情况在北邮校园网不太一样。北邮校园网的 v6 分配方式是 SLAAC,前缀是 /64,最终拿到的地址是一个 /128 的地址,不像其它学校是一个 /64 的网段。这就导致了 Docker 不能获取足够的地址空间。

我按照网上的 NAT 方法(比如这个:Docker containers with IPv6 behind NAT),配置了 IPv6 NAT来解决问题。但是这又带来了新问题:BT 下载的时候,无法有效的获取 peer,外网不能直接对 Docker Container 发起通讯。这不能满足我的要求。并且,IPv6 地址那么多,NAT66 在任何情况下都不应该存在。

解决方案

不想看的可以直接跳到最后。

首先建立一个 Docker Network:

docker network create --ipv6 --subnet=fd00::/64 ipv6_bridge

然后运行 ifconfig 找到新创建的 Docker Network:

可以看到,我们新创建的名为 ipv6_bridge 的网络在 Host 机名为 br-f495e6f8d3fd

然后通过 brctl 把新创建的 network 和母鸡网卡桥接器来。我们运行:

apt install bridge-utls -y
brctl addif br-f495e6f8d3fd enp1s0
sysctl -w net.ipv6.conf.br-f495e6f8d3fd.accept_ra=2
sysctl -p --system

最后我们创建一个新的 Container 来测试一下,得到如下回显:

docker run -itd --name alpine --net=ipv6_bridge alpine sh
docker exec -it alpine sh
ifconfig

一句话概括:新建一个 Docker Network,然后把这个 bridge 和 母鸡网卡桥接,直接暴漏 Container 到外网。


一沙一世界,一花一天堂。君掌盛无边,刹那成永恒。