连接Docker容器:在同一台主机上通过Docker Compose将前端连接到GraphQL后端

假设我在docker-compose上运行2个容器/服务的主机上:

  • 后端graphql(端口:8000:8000)
  • 前端反应(端口:8081:8081)

在我的react + apollo代码所在的前端容器中,我需要设置这个const:

// frontend container code export const APOLLO = { uri: 'http://0.0.0.0:8000/graphql' // << not working, what to use here? }; 

但是,uri值无法成功连接到后端graphql端点。 我收到错误,如Error Network error: request to http://0.0.0.0:8000/graphql failed, reason: connect ECONNREFUSED 0.0.0.0:8000

容器可以自行工作。 我可以导航到http://0.0.0.0:8000与他们分别进行交互。 我也可以input每个容器,并通过他们的服务名称空间与ping backendping frontend到达另一个。

但是,当我在我的代码中做uri: 'http://backend:8000/graphql'uri: 'http://backend/graphql'时,我得到了错误Error Network error: only absolute urls are supported

docker inspect backend ,我得到的后端容器的IP地址为: '172.18.0.5' 。 我试图插入uri作为uri: 'http://172.18.0.5/graphql' ,但我得到Error Network error: Network request failed with status 403 - "Forbidden"

在给定这些场景的代码中,我应该如何将后端docker容器连接到前端?

谢谢!

通过在本地运行服务器而不是Docker来修复它,并发现后端由于未设置CORS头部而拒绝前端条目。 白名单前端的IP,它的工作。 在Docker容器中用后端ip http://172.18.0.5/graphql再次testing,连接是完美的。

希望这可以帮助!

编辑 :引用在url主机名称的容器名称,即http://backend/graphql也工作得益于泊坞窗networking桥接设置由docker撰写。 这是比硬编码上面的docker集装箱IP更好的解决scheme。

这是节点获取无法访问协议或主机名时发生的问题

https://github.com/bitinn/node-fetch/blob/e2603d31c767cd5111df2ff6e2977577840656a4/src/request.js#L125

 if (!parsedURL.protocol || !parsedURL.hostname) { throw new TypeError('Only absolute URLs are supported'); } 

根据您的graphql后端进程查询的方式,最好注销每个服务端点的URL,并确保URL包含主机AND协议,否则获取将失败。

对于我自己,当我的主机variables从我的服务端点的ENV回到undefined时,发生了错误。