Docker反向代理可ping通后端应用服务但无法访问其端口问题
故障根因定位
ping通whoami服务仅证明三层网络连通、ICMP协议未被拦截,TCP端口访问失败的核心原因通常来自以下三类:
- whoami服务的8000端口未监听在容器的网桥网卡地址(仅绑定127.0.0.1)
- 自定义网桥
no-internet的相关iptables规则拦截了同网桥内容器的TCP 8000端口通信 - Docker内置DNS解析异常,服务名
whoami解析到了错误的IP地址
排查步骤
- 验证服务监听配置:进入whoami容器执行命令
ss -tulnp | grep 8000,检查输出中监听地址是否为0.0.0.0,如果为127.0.0.1则为监听配置问题。 - 验证DNS解析正确性:进入proxy容器执行命令
nslookup whoami,对比返回的IP地址和docker inspect whoami | grep IPAddress输出的IP是否一致,确认无解析错误。 - 验证网桥规则配置:执行命令
docker network inspect no-internet,确认两个容器均已正确加入该网桥,同时检查宿主机iptables规则,执行iptables -nvL DOCKER和iptables -nvL DOCKER-USER,确认没有拦截源为proxy容器IP、目标为whoami容器8000端口的规则。 - 抓包确认异常点:在proxy容器内执行
tcpdump -i any host whoami and port 8000,同时尝试nc whoami 8000,如果返回RST包则为whoami侧端口未对外开放,如果无返回包则为中间规则拦截。
解决方案
- 若为whoami监听地址问题:调整whoami服务启动参数,指定监听
0.0.0.0,官方jwilder/whoami镜像默认监听0.0.0.0,如自行修改过启动命令需还原配置。 - 若为iptables规则拦截:添加放行规则
iptables -I DOCKER -s <proxy容器IP> -d <whoami容器IP> -p tcp --dport 8000 -j ACCEPT,如使用ufw、firewalld等宿主机防火墙,需同步放行docker网桥的跨容器通信流量。 - 若为网桥配置异常:删除原有异常网桥后重建,执行
docker network rm no-internet && docker network create no-internet,再重新启动compose服务即可。
内容的提问来源于stack exchange,提问作者colin-zhou
相关产品推荐
相关产品推荐

