最接在做容器化的 IPV6,发现一些小伙伴跟我一样根据官方文档配置后,容器里面根本无法与外部通信
注意:我们只讨论 IPV6 NAT 的实现,容器需要真实的外网 IPV6 不在此范围
vi /etc/docker/daemon.json
{
"ipv6": true,
"fixed-cidr-v6": "2001:db8:1::/64"
# 这里的 "fixed-cidr-v6": "2001:db8:1::/64" 只是容器内部使用的 ipv6 地址,选一个常用不与现有网络冲突的网段即可(不知道如何设置保持默认也行)
}
systemctl reload docker
官方文档到这里就结束了,这样设置后,容器确实可以获取到 ipv6
的地址了,但是除了宿主之外的 ipv6
均无法正常访问,这是因为 ip6tables
规则缺失,不知道为什么 Docker
没有自动生成 NAT
规则
ip6tables -t nat -A POSTROUTING -s 2001:db8:1::/64 -j MASQUERADE
这里的 2001:db8:1::/64
是 /etc/docker/daemon.json
定义的 fixed-cidr-v6
地址
到这里就可以正常在容器里面使用宿主的网络权限访问局域网或者外网的 ipv6 地址了
如果是 docker-compose
, 可以不修改 /etc/docker/daemon.json
, 直接使用 yml 定义
cat docker-compose-network.yml
version: '2.2'
networks:
net:
driver: bridge
enable_ipv6: true
ipam:
driver: default
config:
- subnet: 172.18.0.0/16
- subnet: 2001:db8:10::/64
ip6tables -t nat -A POSTROUTING -s 2001:db8:10::/64 -j MASQUERADE
Docker 官方已经在新版本修复了此问题。请更新 Docker 到最新版本然后修改配置文件即可。
vi /etc/docker/daemon.json
# 加入下面内容,注意不要覆盖已有的内容
{
"ipv6": true,
"fixed-cidr-v6": "fc00:100::/24",
"experimental": true,
"ip6tables": true,
}
systemctl restart docker
1
zro 2020-12-06 14:23:37 +08:00
用 Docker 调试网络方面,实在是太蛋疼了。。
|
2
qq296015668 OP 经过测试,VMware 虚拟机需要像文中这样操作,但是 Hyper-V 只需要开启地址转发
firewall-cmd --add-masquerade --permanent firewall-cmd --reload 然后重启 docker 即可 |