通过HTTP POST请求进行跨容器通信

时间:2018-07-24 02:53:43

标签: node.js docker docker-compose

我是Docker的新手,最近在我的工作中发现以下问题。

基本上,我在docker-compose.yaml中定义了两个服务,例如serviceA和serviceB,并使用docker-compose同时启动这两个容器。具体来说,serviceA是一个node.js环境,其中包含一些我自己编写的JavaScript。另外,该容器中还有一个webpack-dev-server用于开发目的。将serviceB配置为具有某些自定义逻辑的python-tornado Web服务器,以处理从serviceA发送的HTTP POST请求。

我已经在docker network的帮助下创建了一个自定义的网桥网络。假设此网络的名称为mybridge。然后,在docker-compose.yaml中,两个服务都被定义为使用此自定义网络。现在,使用docker-compose启动这两个服务后,我可以从serviceA容器中成功 ping serviceB (使用名称,而不是serviceB的IP地址),反之亦然。但是,当从serviceA使用JS发送HTTP POST请求时,就会出现问题。通常,我只是使用XMLHttpRequest初始化了一个新请求
    
request=new XMLHttpRequest();

然后

request.open(‘POST’, “http://serviceB:8888/somewhere”, true)

在这种情况下,我的Chrome浏览器出现无法加载资源:net :: ERR_NAME_NOT_RESOLVED 错误。我的猜测是无法解析http中的名称serviceB。但这在ping起作用时很奇怪。至此,serviceA和serviceB均配置为使用动态分配的IP地址。然后,如果将serviceB更改为真实IP地址,例如
 
request.open(‘POST’, “http://172.16.1.20:8888/somewhere”, true)

然后按预期工作(在子网172.16.1.0/24中配置了创建的自定义网络mybridge)。通过自定义的docker网络,我可以在docker-compose.yaml中为serviceB配置静态IP地址(在本示例中为172.16.1.20)(而serviceA仍获得动态IP地址)来解决此问题。但是,问题是,为什么在ping可以对serviceB起作用的情况下,为什么它不能使用动态IP地址下的名称呢?

在过去的几天里,我为此问题进行了大量搜索,但没有找到合适的解决方案。因此,我在这里创建了一个帖子,希望有人可以对此问题提供帮助。如果需要的话,可以提供有关我的docker compose配置的更多详细信息。

0 个答案:

没有答案
相关问题