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

使用Docker、Node.js和Apollo Rover构建Supergraph时连接错误求助

解决Docker内Supergraph无法连接宿主子图的问题

问题根源

Docker容器内部的localhost指向容器自身的网络栈,而非宿主机。你的子图运行在宿主机上,因此容器内的Supergraph无法通过localhost访问到这些子图服务。

解决思路

1. 替换localhost为宿主机局域网IP(开发环境快速验证)

  • 查看宿主机的局域网IP:
    • Windows:执行ipconfig,找到「以太网适配器」或「WLAN」下的IPv4地址
    • Mac/Linux:执行ifconfig或ip addr,找到对应网卡的inet地址
  • 修改supergraph-config.yaml中的所有localhost为该IP:
    users:
      routing_url: http://192.168.1.100:4000/graphql
      schema:
        subgraph_url: http://192.168.1.100:4000/graphql
    projects:
      routing_url: http://192.168.1.100:4002/graphql
      schema:
        subgraph_url: http://192.168.1.100:4002/graphql
    datasets:
      routing_url: http://192.168.1.100:4001/graphql
      schema:
        subgraph_url: http://192.168.1.100:4001/graphql
    

2. 使用Docker内置的宿主机访问域名(Mac/Windows优先)

Mac和Windows的Docker Desktop内置了host.docker.internal域名,直接映射到宿主机。修改配置文件:

users:
  routing_url: http://host.docker.internal:4000/graphql
  schema:
    subgraph_url: http://host.docker.internal:4000/graphql
# 其余子图同理替换localhost为host.docker.internal

Linux系统需要额外配置:启动容器时添加--add-host=host.docker.internal:host-gateway参数,即可使用该域名。

3. 统一Docker网络(推荐多容器生产环境)

将Supergraph和所有子图容器加入同一个自定义Docker网络,通过容器名称互相访问:

  1. 创建自定义网络:
    docker network create supergraph-network
    
  2. 启动子图容器时指定该网络(以users子图为例):
    docker run --network supergraph-network --name users-subgraph -p 4000:4000 your-users-subgraph-image
    
  3. 修改supergraph-config.yaml中的地址为子图容器名称:
    users:
      routing_url: http://users-subgraph:4000/graphql
      schema:
        subgraph_url: http://users-subgraph:4000/graphql
    # 其余子图对应替换为容器名称(如projects-subgraph、datasets-subgraph)
    
  4. 启动Supergraph容器时加入同一网络:
    docker run --network supergraph-network your-supergraph-image
    

4. 使用Host网络模式(不推荐,隔离性差)

启动Supergraph容器时直接使用宿主机网络栈,此时容器内的localhost等同于宿主机的localhost:

docker run --network host your-supergraph-image

注意:该模式会让容器完全共享宿主机网络,失去Docker的网络隔离性,仅适合临时测试。

额外注意事项

  • 确保子图服务的监听地址设置为0.0.0.0,而非127.0.0.1。如果子图只监听127.0.0.1,则仅能被宿主机本地访问,容器无法连接。
  • 检查宿主机防火墙是否开放了4000、4001、4002端口,避免端口被拦截。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 02:57:10