必须先确认宿主机已启用ipv6,即运行ip -6 addr show有scope global地址且sysctl net.ipv6.conf.all.disable_ipv6输出为0;否则docker ipv6配置必然失败。

必须先确认宿主机已启用 IPv6,否则 Docker 的 IPv6 配置一定失败。
检查宿主机 IPv6 是否就绪
很多问题其实卡在这一步:Docker 能配,但容器起不来、ping 不通、连不上公网,根源是宿主机根本没 IPv6 地址。
- 运行
ip -6 addr show,找带scope global的inet6行(比如2607:f0d0:1002:51::4/64),不是fe80::/64这类 link-local 地址 - 运行
sysctl net.ipv6.conf.all.disable_ipv6,输出0才表示内核 IPv6 模块已启用 - 如果没 global 地址,去云厂商控制台查是否分配了 IPv6 段,或联系客服开通;别在 Docker 层面硬调
修改 /etc/docker/daemon.json 启用 IPv6
这步看似简单,但填错 fixed-cidr-v6 会导致容器获取不到合法 IPv6 地址,甚至启动失败。
- 确保文件存在且 JSON 格式合法(末尾不能有多余逗号)
- 必须同时设置
"ipv6": true和"fixed-cidr-v6",只开开关不指定地址段,bridge 网络仍不会分配 IPv6 -
fixed-cidr-v6值不能直接照抄宿主机地址,要从你获得的 IPv6 段里划出一个子网,例如宿主机是2607:f0d0:1002:51::/64,可设为"2607:f0d0:1002:51:1::/80"(前缀 ≤ /80 才能被 Docker 正确解析) - 生产环境避免用
2001:db8::/64这类文档地址,它无法路由到公网
创建支持 IPv6 的自定义网络
Docker 默认的 bridge 网络虽能启 IPv6,但不推荐直接用——它和宿主机共用 docker0,容易冲突,且无法精细控制网关和 DNS。
- 用命令创建:
docker network create --ipv6 --subnet=2607:f0d0:1002:51:1::/80 --gateway=2607:f0d0:1002:51:1::1 my-ipv6-net - 宝塔面板用户:进「Docker 管理器 → 网络 → 创建网络」,勾选「启用 IPv6」,IPv4 部分可全留空
- 验证:
docker network inspect my-ipv6-net | grep -A5 IPAM应看到Subnet和Gateway对应你填的值
运行容器时绑定 IPv6 网络
即使 Docker 和网络都配好了,容器默认仍走 IPv4,必须显式指定网络才能拿到 IPv6 地址。
- 启动时用
--network my-ipv6-net,不要用--network bridge(它可能没启 IPv6) - 避免混用
--network host和 IPv6 容器:host 模式下容器直接用宿主机网络栈,ip -6 addr能看到地址,但端口暴露逻辑和隔离性会变,不适合多数 Web 服务 - 验证容器 IPv6:进容器执行
ip -6 addr show eth0,确认有 global scope 地址;再试ping6 ipv6.google.com测试连通性 - Nginx 等服务若需监听 IPv6,配置里得写
listen [::]:80;,光写listen 80;只绑 IPv4
最常被跳过的环节是:没确认宿主机 IPv6 地址是否真实可达,就急着改 daemon.json;或者把 fixed-cidr-v6 设成和宿主机同网段的 /64,导致地址冲突。IPv6 不是“开了就通”,它依赖整条链路——物理网卡、内核、Docker 守护进程、网络驱动、容器配置——每层都得对上。











