Docker IPv6 配置¶
Docker 0 默认不开启 IPv6 配置, 但是在某些场景我们又需要 IPv6 网络的支持, 特别是随着 IPv6 的普及,以后使用 IPv6 的场景会越来越多。
备注
本教程假设您的服务器拥有公网 IPv6 地址段,
并且 IPv6 地址段为: 1111:1111:1111:1111::/64
Docker 启用 IPv6 支持 1¶
首先编辑 /etc/docker/daemon.json 文件,把如下配置添加到配置文件中:
备注
如果 /etc/docker/daemon.json 文件不存在,手动创建即可。
{
"ipv6": true,
"fixed-cidr-v6": "1111:1111:1111:1111::/64"
}
重启 docker 服务 systemctl restart docker。
宿主服务器配置¶
如果我们的 Docker 容器需要使用 IPv6 公网地址, 我们还需要配置宿主机器的 路由/转发 规则,允许宿主机 路由/转发 Docker 容器的 IPv6 流量。
备注
这里我们这里假设宿主机的默认 IPv6 网卡名称为 eth0。
/etc/sysctl.conf 配置¶
我们需要宿主机允许转发 IPv6 流量 & 邻居发现消息:
net.ipv6.conf.all.forwarding=1
net.ipv6.conf.all.proxy_ndp=1
net.ipv6.conf.default.proxy_ndp=1
# docker0 是 docker 默认的网桥 (bridge)
net.ipv6.conf.docker0.proxy_ndp=1
# eth0 是默认的网卡
net.ipv6.conf.eth0.proxy_ndp=1
使用 sysctl -f 重载系统配置。
ndppd 配置¶
因为 Linux IPv6 的 ndp 邻居发现配置仅允许单个 IP 配置(IPv6 /128),
因此我们使用 ndppd 守护进程来自动转发邻居发现消息。
备注
理论上我们也可以手工一条一条的配置所有 IPv6 邻居发现消息转发规则。
apt install ndppd
/etc/ndppd.conf 写入如下配置:
route-ttl 30000 address-ttl 30000 proxyeth0{ router yes timeout 500 autowire no keepalive yes retries 3 promiscuous no ttl 30000 rule1111:1111:1111:1111::/64{ static autovia no } }
备注
ndppd 详细配置参见: https://github.com/DanielAdolfsson/ndppd/blob/master/ndppd.conf-dist
systemctl restart ndppd
docker-compose 启用 IPv6¶
docker-compose.yaml 可以使用类似如下的配置启用 IPv6 地址:
version: "2.4"
networks:
ipv6_network:
enable_ipv6: true
driver: bridge
ipam:
driver: default
config:
- subnet: "172.16.238.0/24"
- subnet: "1111:1111:1111:1111:1::/80"
小技巧
subnet 中的 IPv6 地址不要直接使用 1111:1111:1111:1111::/64,
否则可能会导致路由混乱(Docker 容器无法正常使用 IPv6 网络)。
使用 1111:1111:1111:1111::/64 的任意子网段都可以。
警告
docker-compose 文件 必须使用 version: 2,
version: 3 不支持 enable_ipv6 配置 2 。
如果您已有旧的容器在运行(网络配置发生了变化),则需要先销毁容器 docker-compose down
然后再重新创建 docker-compose up。
实现原理¶
Docker 启用 IPv6 功能的原理实际就是:
配置宿主机器启用 IPv6 路由/转发 功能
这是必须的,否则宿主机器不会 路由/转发 Docker 的 IPv6 流量。
Docker 底层网络实现就是在宿主机器创建网桥 (bridge 模式)
所以一切关于网桥配置的原理都可以应用到这里。
给宿主机配置正确的 路由/转发 规则
参考资料¶
Updated on 31 十二月 2021
autovia yes 配置可能会导致 ndppd CPU 使用率 100%, 应该使用 autovia no 配置
津公网安备 12010602120312 号