双栈容器需四层协同:宿主机启用ipv6转发与ra接收、docker守护进程配置ipv6和fixed-cidr-v6、创建显式双栈自定义网络、compose中声明external网络。缺一不可。

用 Docker Compose 编排双栈(IPv4+IPv6)容器应用,关键不在“写几个服务”,而在于四层协同:宿主机内核、Docker 守护进程、自定义网络、Compose 配置。漏掉任何一层,IPv6 就可能不通或仅限本地 ping 通。
确保宿主机已启用 IPv6 转发与 RA 接收
这是整个链路的起点。Docker 容器要真正访问外网 IPv6,宿主机必须能转发 IPv6 流量,并接受路由器通告(RA)——尤其在云环境或企业内网中,这点常被忽略。
- 临时启用:
sudo sysctl -w net.ipv6.conf.all.forwarding=1sudo sysctl -w net.ipv6.conf.all.accept_ra=2 - 永久生效:向
/etc/sysctl.d/99-ipv6.conf写入两行:net.ipv6.conf.all.forwarding = 1net.ipv6.conf.all.accept_ra = 2 - 验证是否生效:
sysctl net.ipv6.conf.all.forwarding应返回 1
配置 Docker 守护进程支持 IPv6
默认 Docker 完全不启用 IPv6。必须显式开启,并指定一个稳定的 IPv6 地址段供容器使用。推荐用 ULA(唯一本地地址)fd00::/7 或其子网,避免与公网地址冲突。
- 编辑
/etc/docker/daemon.json,加入以下内容(若文件不存在请新建):{<br> "ipv6": true,<br> "fixed-cidr-v6": "fd00:dead:beef::/64",<br> "ip6tables": true,<br> "experimental": true<br>} - 保存后重启服务:
sudo systemctl daemon-reload && sudo systemctl restart docker - 验证:
docker network inspect bridge | grep EnableIPv6应输出 true
创建双栈自定义网络(推荐方式)
不要依赖默认 bridge 网络——它对 IPv6 支持不稳定,且无法同时定义 IPv4 和 IPv6 子网。应创建显式的双栈用户网络。
- 执行命令创建网络:
docker network create \<br> --driver bridge \<br> --subnet=172.28.0.0/16 \<br> --ipv6 \<br> --subnet=fd00:dead:beef::/64 \<br> mynet
- 该网络下启动的每个容器会自动获得一个 IPv4 地址(如
172.28.0.2)和一个 IPv6 地址(如fd00:dead:beef::2) - 检查:
docker network inspect mynet中应同时看到IPAM.Config下的 IPv4 和 IPv6 子网条目
编写支持双栈的 docker-compose.yml
Compose 文件需明确声明网络并启用 IPv6;若复用已有网络(如上一步创建的 mynet),必须标注 external: true,否则 Compose 会尝试重建同名网络导致失败。
- 示例配置(含 Nginx + BusyBox 测试):
version: "3.9"<br>services:<br> nginx:<br> image: nginx:alpine<br> ports:<br> - "8080:80"<br> tester:<br> image: busybox:latest<br> command: ["ping6", "-c", "4", "nginx"]<br> networks:<br> - mynet<br>networks:<br> mynet:<br> name: mynet<br> external: true
- 关键点:
•networks顶层块中声明external: true指向已存在网络
• 容器间可通过服务名(如nginx)直接解析 IPv6 地址(DNS64 / SLAAC 自动生效)
• 不需要额外配置enable_ipv6: true—— 只要网络本身是双栈且容器接入其中,IPv6 即可用
跑起来后,进 tester 容器执行 ip -6 addr 能看到 inet6 fd00:dead:beef::3/64,再 ping6 nginx 成功,就说明双栈通了。不复杂但容易忽略内核和 daemon 层的前置开关。











