首页/云/Docker 容器速查/发布的端口外部访问不通
容器排障52 条

发布的端口外部访问不通

宿主本机通、外部不通的三层排查:发布绑定地址(127.0.0.1)→ 宿主防火墙(含 DOCKER-USER 链)→ 云安全组。

Docker 容器速查云更新于 2026-10-13

本机通、外部不通

容器端口在宿主机上用 curl 能通、从外部访问却连不上,几乎所有情况都落在这三层:一是发布时绑定地址只写了 127.0.0.1,从设计上就不接受外部连接;二是宿主机的包过滤规则,Docker 自己维护了 DOCKER-USER 链并会在其它链之前生效;三是云平台的安全组与上游网络 ACL。按这个顺序逐层排除,比反复重启容器高效得多。

基本信息

第一层docker port 容器 看实际绑定的地址与端口
第二层iptables -L DOCKER-USER -n 与 firewall-cmd --list-all
第三层云平台安全组、负载均衡与上游 ACL
快速判定只绑定 127.0.0.1 的端口从外部必然不通,属设计行为

典型使用场景

  • 新上线服务外部打不开:先确认映射写成了 0.0.0.0:端口 还是 127.0.0.1:端口
  • 发布后突然不通:宿主启用了防火墙或安全组规则被改
  • 只开了 TCP:UDP 服务需要单独写 /udp,否则表现为无响应
  • 换了发布端口后不一致:反代与安全组配置没同步更新
  • IPv6 环境访问异常:监听地址族与 AAAA 记录要对齐

逐层检查

逐层检查
# 第一层:看容器端口实际绑定到哪个地址
docker port web

# 第二层:宿主机监听情况与包过滤规则
ss -ltnp | grep -E '8080|80'
sudo iptables -L DOCKER-USER -n --line-numbers

# 本机自测,排除应用自身问题
curl -v --connect-timeout 3 http://127.0.0.1:8080

# 重新发布时显式绑定全部地址
docker run -d -p 0.0.0.0:8080:80 --name web nginx:1.27-alpine

层次与处理

层次典型现象处理方向
发布绑定本机通、外部不通改为绑定 0.0.0.0 或省略地址部分
宿主防火墙同网段也不通检查 DOCKER-USER 链与 firewalld 的放行规则
云安全组特定来源不通在安全组放行对应端口与来源网段
上层设备跨网段访问失败核对路由器、负载均衡与网络 ACL
容器发布端口时 Docker 会自行写入 nat 与 filter 规则,部分主机防火墙的前端规则会被绕过,排查要以 iptables 实际链的规则为准,不要只看防火墙管理工具的状态。
IPv4 能通而 IPv6 不通时,先看服务监听的是哪个地址族,再核对域名是否有多余的 AAAA 记录指向不可达的地址。

易错点

  • 映射里写 127.0.0.1 又想外部访问:这是设计上的限制,必须改成绑定全部地址或指定对外 IP
  • 只放行 TCP:UDP 服务需要额外写 /udp,漏写时表现为请求无响应而不是连接被拒绝
  • 依赖防火墙管理工具的状态判断:容器规则由 Docker 维护,最终生效情况要回到 iptables 看
  • 排查时只重启容器:绑定与防火墙问题不会因重启消失,按层次定位才能收敛

数据来源与参考

  • Docker 官方文档:Packet filtering and firewalls(docs.docker.com/network)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌