You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker部署PHP应用通过JavaScript连接本地WebSocket失败排查

问题描述

宿主机运行Java Spring应用,该应用在8080端口暴露WebSocket服务,经Postman测试可正常工作。另一组件是运行在Docker中的PHP Web应用,前端JavaScript尝试连接宿主机的WebSocket,连接代码如下:

exampleSocket = new WebSocket("ws://192.168.1.113:8080/socket");

但启动Docker应用后连接失败,不过从PHP容器内ping 192.168.1.113可获得正常响应。以下是docker-compose配置文件:

version: '3.8'

services:
  nginx-cq:
    build:
      context: .
      dockerfile: nginx.dockerfile
    ports:
      - 11096:80
    volumes:
      - .:/var/www/html
    depends_on:
      - php
  php:
    build:
      context: .
      dockerfile: php.dockerfile
    container_name: cq_php_docker
    networks:
      - default
      - dbnetwork
    volumes:
      - .:/var/www/html
      - ./xdebug/docker-xdebug.ini:/usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
    ports:
      - 9011:9000
    extra_hosts:
      - "host.docker.internal:192.168.1.113"

networks:
  dbnetwork:
    external: true
可能的连接失败原因分析
  • 宿主机防火墙/安全组拦截8080端口:ping依赖ICMP协议,而WebSocket使用TCP协议,防火墙可能仅放行ICMP流量,未开放8080端口给Docker容器所在网段。需检查宿主机防火墙规则,确保8080端口允许来自Docker子网的TCP连接。
  • Spring应用仅绑定localhost网卡:如果Spring配置中server.address设为127.0.0.1,服务只会监听宿主机回环网卡,容器无法通过局域网IP访问。需修改配置为server.address=0.0.0.0,让服务监听所有可用网卡。
  • 前端JS执行环境误解:JavaScript代码在用户浏览器中运行,而非PHP容器内部。如果浏览器所在网络无法访问192.168.1.113:8080(比如不在同一局域网、宿主机未开放端口给浏览器网络),就会连接失败。需确保浏览器能直接访问该地址,或通过反向代理暴露WebSocket服务。
  • Docker网络iptables规则限制:若自定义过宿主机iptables规则,可能阻断了容器到宿主机8080端口的TCP流量。可检查iptables规则,确认允许Docker网络段访问该端口。
  • WebSocket端点配置不匹配:检查Spring应用的WebSocket端点路径是否确实是/socket,是否存在拼写错误、拦截器限制或跨域配置问题。比如Spring是否配置了正确的CORS规则,允许前端域名访问WebSocket服务。

内容的提问来源于stack exchange,提问作者guest86

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 06:17:39