最接在做容器化的 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
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.