答案是禁用ipv6或强制docker使用ipv4。本质是系统启用ipv6但网络不支持,docker优先尝试ipv6导致连接失败;临时方案用sysctl禁用ipv6,长期方案修改/etc/docker/daemon.json设"ipv6": false并重启docker服务。

遇到 docker pull 因 IPv6 失败(如 dial tcp [2600:...]:443: connect: network is unreachable),本质不是“怎么配 IPv6”,而是系统有 IPv6 协议栈但网络不通,Docker 却优先尝试 IPv6 连接镜像仓库。解决方向是让 Docker 绕过不可用的 IPv6,专注走稳定的 IPv4。
临时快速验证:禁用系统 IPv6(仅测试)
执行后立即生效,重启失效,适合快速排查:
-
禁用所有接口 IPv6:
sudo sysctl -w net.ipv6.conf.all.disable_ipv6=1 -
或只禁用主网卡(如 eth0):
sudo sysctl -w net.ipv6.conf.eth0.disable_ipv6=1 - 再试
docker pull hello-world,若成功,说明问题确由 IPv6 引起
推荐长期方案:强制 Docker 使用 IPv4
修改 Docker 守护进程配置,使其完全忽略 IPv6 网络路径:
- 编辑配置文件:
sudo nano /etc/docker/daemon.json - 写入以下内容(若文件已存在其他配置,请合并,不要覆盖):
{
"ipv6": false,
"fixed-cidr-v6": ""
}
- 保存后重启服务:
sudo systemctl restart docker - 该配置关闭 Docker 内部 IPv6 支持,所有容器默认不分配 IPv6 地址,拉取镜像时自动回退到 IPv4
进阶:保留 IPv6 功能但绕过 registry 连接
若你确实需要容器内 IPv6(比如业务依赖),但只想让镜像拉取走 IPv4,可配置 DNS 解析策略:
- 在
/etc/docker/daemon.json中添加 DNS 设置:
{
"dns": ["8.8.8.8", "1.1.1.1"],
"ipv6": true,
"fixed-cidr-v6": "fd00:db8:1::/64"
}
- 同时确保宿主机 DNS 能正确解析
registry-1.docker.io到 IPv4 地址(可手动dig A registry-1.docker.io验证) - 部分环境还需补充:
"ip6tables": false防止 NAT 规则干扰
验证是否生效
执行后检查两件事:
-
docker info | grep -i ipv6→ 应显示IPv6: false(若按第二方案) -
docker pull hello-world成功且无 IPv6 报错 - 可选:抓包确认连接目标为 IPv4 地址:
sudo tcpdump -i any port 443 -n | grep 'A.'











