有多种方法可以实现
- 使用host类型网络
services:
web:
image: haohetao/nginx
restart: always
network_mode: "host"
这样容器内直接使用宿主机的IP地址,而且这种情况下不再需要对外公布端口,因为端口直接就在宿主机上
- 给宿主机分配私有IPv6地址
/etc/docker/daemon.json添加以下内容
“`json
{
"registry-mirrors": ["https://docker.hetao.me"],
"bip": "172.18.0.1/16",
"ipv6": true,
"fixed-cidr-v6": "fd33::1/64",
"experimental": true,
"ip6tables": true
}
</p></li>
</ul><pre><code class="line-numbers">这样可以全局开启IPv6
如果要在docker compose中开启IPv6,可以在docker-compose.yaml中指定
“`yaml
services:
web:
image: haohetao/nginx
restart: always
ports:
– 80:80/tcp
– 443:443/tcp
– 443:443/udp
networks:
web-network:
ipv4_address: 172.30.0.20
ipv6_address: fd34::20
networks:
web-network:
driver: bridge
enable_ipv6: true
ipam:
config:
– subnet: “172.30.0.0/24”
– subnet: “fd34::/64”
这样docker会自动添加NAT64,容器用私有IPV6也能上网
- 分配固定公网IP
ip6tables设为false,同时把私有IPv6改为公网IPv6即可,此方法需要路由器或者云平台支持划分子网段
aws支持,aliyun不支持 -
NDP proxying
注意:aliyun不支持,aliyun限制了一个网卡只能有一个IPv6地址(不同实例规格数量不同),多余的IP会被拦截
daemon.json配置
{ "registry-mirrors": ["https://docker.hetao.me"], "bip": "172.18.0.1/16", "ipv6": true, "fixed-cidr-v6": "2409:8a1e:6a51:61e1:2::/80", "experimental": true, "ip6tables": false }
容器子网要在宿主机的网段范围内,前缀要小于宿主机前缀(不能等于)
然后在宿主机上执行
sysctl -w net.ipv6.conf.enp6s18.proxy_ndp=1 sysctl net.ipv6.conf.default.forwarding=1 sysctl net.ipv6.conf.all.forwarding=1 ip -6 neigh add proxy 2409:8a1e:6a51:61e1:0:242:ac11:2 dev enp6s18 #这个ipv6地址是容器的ipv6地址
最后一部的ip -6 neigh命令可以替换为npd6
apt install npd6 cd /etc/ cp npd6.conf.examle npd6.conf
配置
prefix=2409:8a1e:6a51:61e1:2:
interface = enp6s18systemctl enable npd6 systemctl start npd6
- SLAAC或DHCPv6分配公网IPv6
目前没有找到方法
总结下来就是还是NAT66最靠谱,其它方法都有各种局限性
- 分配固定公网IP