IPv6双栈是Docker支撑现代应用的基础设施级要求,需宿主机具备全局IPv6地址、Docker守护进程启用fixed-cidr-v6、创建显式双栈自定义网络,并通过-p [::]:80:80等配置实现容器双协议监听与访问。

要让 Docker 网络真正支撑现代应用,IPv6 双栈(IPv4 + IPv6 同时可用)不是可选项,而是基础设施级要求。它不只是“能通”,而是要容器原生获取双栈地址、服务自动发现、端口映射无差别、且不破坏现有 IPv4 流量。实现的关键不在单点配置,而在三层协同:宿主机网络基础、Docker 守护进程全局设置、以及容器网络的显式定义。
宿主机必须具备可用的 IPv6 连通能力
这是所有后续操作的前提。Docker 无法凭空生成公网可达的 IPv6,它依赖宿主机网卡已分配有效的 global scope 地址(非仅 fe80::/10 链路本地地址)。
- 运行
ip -6 addr show,确认主网卡(如 eth0)下有类似inet6 2001:db8:abcd:1234::100/64 scope global的输出 - 若无,请先联系云厂商或 ISP 获取合法 IPv6 前缀,并在系统网络配置中启用(如 CentOS 的
IPV6INIT=yes,Ubuntu 的ipv6.disable=0内核参数) - 测试连通性:
ping6 -c 3 2001:4860:4860::8888(Google DNS),失败则需排查路由或防火墙策略
全局启用 Docker IPv6 并指定地址池
Docker 默认只开 IPv4,必须通过 daemon.json 显式激活 IPv6 支持,并限定容器可分配的 IPv6 子网范围——否则容器只能拿到链路本地地址,无法对外通信。
- 编辑
/etc/docker/daemon.json,加入以下内容(注意 JSON 格式正确):
{
"ipv6": true,
"fixed-cidr-v6": "2001:db8:1::/64"
}
说明:其中 2001:db8::/32 是 IANA 文档保留段,仅用于测试;生产环境务必替换为你的 ISP 或云平台分配的真实前缀(如 240e:xxxx:xxxx::/64)。
- 保存后执行
sudo systemctl reload docker(或restart) - 验证是否生效:
docker network inspect bridge | grep -i "enableipv6\|subnet",应看到"EnableIPv6": true和对应 IPv6 subnet
创建显式双栈自定义网络
默认 bridge 网络虽支持双栈,但缺乏子网控制和 DNS 自解析能力。推荐新建用户定义桥接网络,同时声明 IPv4 和 IPv6 子网:
- 执行命令创建双栈网络:
docker network create \ --driver bridge \ --subnet 172.20.0.0/16 \ --ipv6 \ --subnet 2001:db8:1::/64 \ my-dualstack-net
关键点:
- 该网络下容器会自动获得一个 IPv4 地址(如
172.20.0.3)和一个 IPv6 地址(如2001:db8:1::3) - 容器名可直接被同网络内其他容器解析(如
curl http://backend),无需额外 DNS 配置 - 避免使用默认
bridge网络——它不支持跨容器名解析,且 IPv6 地址分配行为不稳定
部署容器并验证双栈访问
启动容器时明确接入双栈网络,并确保服务监听双协议栈(多数现代应用默认支持):
- 以 Nginx 为例:
docker run -d \ --name web-app \ --network my-dualstack-net \ -p 80:80 \ -p [::]:80:80 \ nginx:alpine
说明:
-
-p 80:80映射 IPv4 的 80 端口 -
-p [::]:80:80映射所有 IPv6 地址的 80 端口(方括号是必需语法) - 进入容器检查:
docker exec -it web-app ip -6 addr和ip -4 addr,应各看到一个 global 地址 - 从宿主机或外部设备分别用
curl http://<ipv4-addr></ipv4-addr>和curl http://[<ipv6-addr>]</ipv6-addr>测试响应


















