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

时间:2017-07-04 10:31:10

标签: 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:8000http://0.0.0.0:8000/graphqlhttp://0.0.0.0:8081以单独与他们互动。我也可以输入每个容器,并通过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: 'http://172.18.0.5/graphql'插入uri,但我得到Error Network error: Network request failed with status 403 - "Forbidden"

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

谢谢!

2 个答案:

答案 0 :(得分:2)

通过在本地运行服务器而不是Docker来修复它,并发现后端由于未设置CORS头而拒绝前端条目。列入白名单的前端&#39; ip和它工作。使用后端ip http://172.18.0.5/graphql在Docker容器中再次测试,连接非常完美。

希望这有帮助!

修改:引用网址名称中的容器名称,即http://backend/graphql也可以使用docker compose设置的docker网桥。这是比上面的docker container ip硬编码更好的解决方案。

答案 1 :(得分:0)

当节点提取无权访问协议或主机名时,会出现此问题

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协议,否则获取将失败。

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