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

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子网的静态路由:

  1. 执行docker network inspect solr,查询该Docker网络的网关地址,一般为172.23.0.1
  2. 以管理员身份打开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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 23:03:03