Docker 在 Linux 上支持 IPv6 bridge 网络,不过具体配置取决于服务商分配地址的方式:只有一个 /128 地址时,容器不能直接瓜分这个地址;如果另有一段路由到宿主机的 /64 前缀,容器才适合使用独立的公网 IPv6。

本文分别记录这两种配置。目标是让容器能够访问 IPv6 网络;涉及公网入站访问时,还需要同时检查端口发布和防火墙规则。

先确认宿主机 IPv6

配置 Docker 之前,先确认宿主机本身拥有全局 IPv6 地址、默认路由和正常的外网连接:

ip -6 addr show scope global
ip -6 route show default
ping -6 -c 4 2606:4700:4700::1111
curl -6 https://ifconfig.co

如果最后两条命令失败,应先排查服务商路由、系统网络配置和防火墙;Docker 无法修复宿主机自身的 IPv6 连接。

根据地址条件选择方案

只有一个 /128:使用 ULA 和 NAT

/128 只代表一个地址,通常已经由宿主机占用。此时可以给 Docker bridge 分配一段 ULA 私有地址,再由 Docker 使用宿主机的公网 IPv6 对容器出站流量进行 masquerade。

编辑 /etc/docker/daemon.json,将以下字段合并进已有配置,不要直接覆盖文件中原来的选项:

{
  "ipv6": true,
  "fixed-cidr-v6": "fd00:dead:beef::/64",
  "ip6tables": true
}

检查配置并重启 Docker:

sudo dockerd --validate --config-file=/etc/docker/daemon.json
sudo systemctl restart docker

然后从容器内测试 IPv6。正常情况下,返回的是宿主机的公网 IPv6:

docker run --rm curlimages/curl -6 -sS https://ifconfig.co

这种方式适合容器访问 IPv6 外网以及通过宿主机发布端口,但容器本身不会获得可直接路由的公网 IPv6。

有可路由的 /64:直接分配给容器

如果服务商提供了一段额外路由到宿主机/64,可以把它交给用户自定义 bridge 网络。下面的 2001:db8:1234::/64 是文档示例地址,使用时必须替换成自己的前缀:

services:
  ipv6-test:
    image: curlimages/curl
    command: ["-6", "-sS", "https://ifconfig.co"]
    networks:
      - appnet

networks:
  appnet:
    enable_ipv6: true
    driver_opts:
      com.docker.network.bridge.gateway_mode_ipv6: routed
    ipam:
      config:
        - subnet: 2001:db8:1234::/64

启动一次性测试容器:

docker compose run --rm ipv6-test

routed 模式不会对 IPv6 出站流量做 NAT,因此测试结果应当是分配给容器的地址。它要求上游确实把这段前缀路由到宿主机;如果服务商提供的是同一二层网络上的 on-link 前缀,还可能需要额外配置 NDP proxy。

出现问题时检查什么

先查看 Docker 实际分配的地址和网络配置:

docker network inspect bridge
docker compose run --rm --entrypoint ip ipv6-test -6 addr
docker compose run --rm --entrypoint ip ipv6-test -6 route

排查时重点确认:

  • 宿主机是否存在 IPv6 默认路由;
  • Docker 网络是否拿到了预期的 IPv6 子网;
  • ip6tables 或 nftables 是否允许转发;
  • 公网前缀是否真的被上游路由到了这台宿主机;
  • 对外服务是否使用 ports 发布,并受到合适的防火墙规则保护。

小结

只有 /128 时,使用 ULA bridge 配合默认 NAT 最省事;拥有独立路由的 /64 时,才考虑让容器直接使用公网 IPv6。两种方式不要混用,也不要把宿主机正在使用的单个 /128 地址直接配置成 Docker 子网。

参考:Docker IPv6 networkingBridge network driverCompose networks