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
配置