关键在于底层网络环境就绪:宿主机启用ipv6(cat /proc/sys/net/ipv6/conf/all/disable_ipv6输出0)、docker守护进程配置ipv6:true和fixed-cidr-v6、创建显式双栈自定义网络(--ipv6并指定--subnet ipv6子网),容器加入该网络后自动获得ipv4+ipv6双地址。

确保宿主机已启用 IPv6
容器无法获得 IPv6 地址,首要前提是宿主机本身支持 IPv6:
- 运行
cat /proc/sys/net/ipv6/conf/all/disable_ipv6,输出 0 表示已启用;若为 1,需修改内核参数:echo 'net.ipv6.conf.all.disable_ipv6 = 0' >> /etc/sysctl.conf && sysctl -p - 验证连通性:
ping6 -c 3 2001:db8::1(测试地址)或公网地址如ping6 -c 3 ipv6.google.com - 云服务器通常默认开启,但需确认分配了 IPv6 公网地址并正确配置路由和防火墙规则
配置 Docker 守护进程启用 IPv6
Docker 默认只配 IPv4,必须显式开启 IPv6 并指定地址池:
- 编辑
/etc/docker/daemon.json(若不存在则新建),写入:
{
"ipv6": true,
"fixed-cidr-v6": "2001:db8:1::/64"
}
-
"ipv6": true启用全局 IPv6 支持 -
"fixed-cidr-v6"指定容器获取 IPv6 地址的子网(2001:db8::/32是文档专用段,生产中请替换为 ISP 或云平台分配的真实前缀,如240e:xx:xx::/64) - 保存后执行
sudo systemctl restart docker
创建双栈自定义网络(推荐方式)
不要依赖默认 bridge 网络(它不支持 IPv6),而是创建显式双栈网络:
- 运行命令创建网络:
docker network create \ --driver bridge \ --subnet 172.20.0.0/16 \ --ipv6 \ --subnet 2001:db8:1::/64 \ my-dual-stack-net
- 该网络同时提供 IPv4 和 IPv6 子网,容器加入后会自动获得两个地址
- 可通过
docker network inspect my-dual-stack-net查看是否含IPAM.Config的双 subnet 条目 - 后续启动容器时指定该网络:
docker run --network my-dual-stack-net nginx
验证容器是否获得双栈地址
启动容器后,进入容器检查网络配置:
docker exec -it ip addr show eth0- 应看到类似输出:
inet 172.20.0.2/16 ... inet6 2001:db8:1:0:0:0:0:2/64 ...
- 再测试 IPv6 连通性:
ping6 -c 2 2001:db8:1::1(网关)或curl -6 https://httpbin.org/ip - 若只有链路本地地址(
fe80::/10),说明fixed-cidr-v6未生效或网络未指定 IPv6 subnet











