无法从Docker宿主机curl访问容器内Nexus服务的问题求助
问题分析与解决建议
针对宿主机无法访问自身映射的Nexus服务问题,结合你的环境配置,可按以下方向排查:
1. 开启自定义Docker桥接网络的Hairpin模式
你使用了自定义bridge网络docker_network,默认情况下该网络的hairpin模式可能未开启,导致宿主机通过容器绑定的外部/内部IP访问时,数据包无法正确回流到容器。
操作步骤:
- 检查当前网络的hairpin配置:
docker network inspect docker_network | grep -i hairpin
- 若未开启,执行以下命令更新网络配置:
docker network update --opt com.docker.network.bridge.enable_hairpin=true docker_network
- 重启Nexus容器生效:
docker-compose restart nexus
2. 检查宿主机端口占用情况
确认宿主机91端口是否仅被Docker代理进程监听,避免端口冲突导致访问异常:
ss -tulpn | grep ":91"
若输出中有非docker-proxy的进程占用91端口,需停止对应进程或修改Nexus的端口映射。
3. 验证Docker的iptables转发规则
检查Docker自动生成的DOCKER链是否包含正确的端口转发规则:
iptables -L DOCKER -n -v
应能看到类似以下的规则(对应91端口转发到容器的8081端口):
ACCEPT tcp -- 0.0.0.0/0 172.1.0.2 tcp dpt:91
若缺少该规则,可重启Docker服务重建规则:
systemctl restart docker
4. 排查宿主机路由走向
当宿主机访问INTERNAL_ADDRESS:91时,确认数据包是否走Docker桥接网络而非物理网卡:
ip route get INTERNAL_ADDRESS
若输出显示走物理网卡(如eth0)而非docker_network桥,需检查宿主机路由表,确保自定义Docker网络的路由优先级正确。
5. 确认Nexus服务的绑定范围
进入容器内部,验证Nexus是否绑定了容器内的所有IP(而非仅特定IP):
docker exec -it nexus curl -v localhost:8081
若容器内访问正常,说明Nexus服务本身无问题;若容器内也无法访问,需检查Nexus的配置文件(/nexus-data/etc/nexus.properties)中application-host参数是否设置为0.0.0.0。
内容的提问来源于stack exchange,提问作者zhoriq
相关产品推荐
相关产品推荐

