Windows环境下docker-compose部署Solr集群无法通过容器IP访问
问题原因
Windows环境下的Docker Desktop依赖WSL2或Hyper-V实现虚拟化,容器使用的内部子网(如你场景中的172.23.0.0/16)是Docker在虚拟隔离层内创建的,Windows宿主机默认没有指向该子网的路由规则,因此直接访问容器内部IP会超时,这是Windows平台Docker的固有特性,并非集群配置错误。
你的Solr集群默认会读取容器内部IP注册到ZooKeeper,SolrJ客户端从ZK获取到的就是宿主机不可达的内部IP,最终抛出连接超时异常。
解决方案
方案1:修改Solr注册地址为宿主机可访问地址(推荐,改造成本最低)
给每个Solr服务新增SOLR_HOST和SOLR_PORT环境变量,让Solr把宿主机可访问的地址注册到ZooKeeper,而非容器内部IP。
修改docker-compose.yml中三个solr服务的配置,其余原有配置保持不变:
services: solr1: environment: - ZK_HOST=zoo1:2181,zoo2:2181,zoo3:2181 - SOLR_HOST=host.docker.internal # Docker Desktop内置的指向宿主机的域名,Windows/Mac通用 - SOLR_PORT=8981 # 对应宿主机映射的端口 solr2: environment: - ZK_HOST=zoo1:2181,zoo2:2181,zoo3:2181 - SOLR_HOST=host.docker.internal - SOLR_PORT=8982 # 对应宿主机映射的端口 solr3: environment: - ZK_HOST=zoo1:2181,zoo2:2181,zoo3:2181 - SOLR_HOST=host.docker.internal - SOLR_PORT=8983 # 对应宿主机映射的端口
修改完成后执行docker compose down && docker compose up -d重启集群即可,无需修改SolrJ代码就能正常连接。如果host.docker.internal无法解析,可以替换为Windows宿主机的局域网固定IP。
方案2:添加静态路由(适合必须直接访问容器IP的场景)
如果业务场景要求必须通过容器内部IP访问服务,可以手动在Windows宿主机添加指向Docker子网的静态路由:
- 执行
docker network inspect solr,查询该Docker网络的网关地址,一般为172.23.0.1 - 以管理员身份打开Windows命令提示符/PowerShell,执行命令:
route add 172.23.0.0 MASK 255.255.0.0 <你查到的网关地址> -p
参数-p表示路由永久生效,配置完成后即可直接访问容器内部IP。注意如果WSL2重启后网关发生变化,需要重新更新路由规则。
方案3:Java代码容器化运行
如果是本地开发测试场景,可以将SolrJ的Java代码打包为镜像,加入到compose定义的solr网络中运行,同一Docker网络内的服务可以直接通过内部IP/服务名互通,不会存在访问限制。
内容的提问来源于stack exchange,提问作者Ricky Sixx

