docker镜像拉取失败常因防火墙拦截出站请求,需精准放行tcp 443端口(https访问registry)和udp 53端口(dns解析),云环境尤其需配置安全组的出方向规则而非入方向。

Docker 镜像拉取失败常因防火墙拦截出站请求,尤其在企业内网、云服务器或强化安全策略的 Linux 环境中。关键不是“关掉防火墙”,而是精准放行 Docker 必需的通信路径。
防火墙必须开放的端口和协议
Docker 默认通过 HTTPS 协议访问 registry-1.docker.io(即 Docker Hub),所有镜像拉取均走 443 端口。部分私有仓库或代理镜像可能用到 80(HTTP)或自定义端口(如阿里云加速器仍走 443),但核心只需保障:
- ✅ TCP 443 端口出站(outbound):用于 HTTPS 访问 registry
- ✅ TCP 53 端口(UDP 更常用)出站:DNS 解析必需,否则
registry-1.docker.io解析失败会导致超时 - ❌ 不需要开放入站(inbound)端口给 Docker 拉取操作(除非你运行的是私有 registry)
注意:
ufw、firewalld、iptables等工具默认只限制入站;出站规则通常放行,但企业级防火墙或云安全组常默认拒绝所有出站,需手动配置。
各类防火墙实操配置
Ubuntu / Debian(ufw)
# 允许出站 HTTPS(443)和 DNS(53) sudo ufw allow out 443/tcp sudo ufw allow out 53/udp # 若使用 HTTP 镜像源(不推荐),再加: sudo ufw allow out 80/tcp # 查看当前规则 sudo ufw status verbose
CentOS / RHEL(firewalld)
# 开放出站 443 和 53(firewalld 默认不限制出站,但若启用 rich rules 或 zone 配置需显式放行) sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" outbound port port="443" protocol="tcp" accept' sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" outbound port port="53" protocol="udp" accept' sudo firewall-cmd --reload # 验证 sudo firewall-cmd --list-all
云服务器(AWS / 阿里云 / 腾讯云)
- 进入控制台 → 找到对应 ECS 实例 → 查看「安全组」
- 编辑「出方向规则」(不是入方向!)
- 添加规则:
- 类型:HTTPS(自动填 443/TCP)或自定义 TCP
- 目标:
0.0.0.0/0(或更严格的 registry IP 段,但 Docker Hub IP 不固定,建议全放) - 协议:TCP
- 端口:443
- 同样添加一条 UDP 出方向规则,目标
0.0.0.0/0,端口53
⚠️ 常见误区:只配了入方向(Inbound),却忘了出方向(Outbound)——这正是云环境拉取超时的主因。
验证防火墙是否真拦住了
不用猜,直接测:
# 1. 测试 DNS 是否通 nslookup registry-1.docker.io # 2. 测试 HTTPS 连通性(绕过 Docker,直连 registry) curl -I https://registry-1.docker.io/v2/ # 3. 抓包确认请求是否发出(需 root) sudo tcpdump -i any "host registry-1.docker.io and port 443" -c 3
如果 curl 超时或 tcpdump 无输出,且 nslookup 失败 → 基本锁定为防火墙或 DNS 问题。
补充提醒
- SELinux(RHEL/CentOS)一般不影响拉取,但若启用了
dockerd的--selinux-enabled,可临时测试:setenforce 0 - 关闭防火墙是临时排查手段(
sudo ufw disable或sudo systemctl stop firewalld),不可作为长期方案 - 若使用代理或镜像加速器,防火墙仍需放行其目标域名的 443 端口(如
docker.m.daocloud.io)
不复杂但容易忽略——出站规则才是 Docker 拉取卡住的隐形墙。











