本机通、外部不通
容器端口在宿主机上用 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 记录指向不可达的地址。