首页 > 解决方案 > 通过 HTTP POST 请求进行跨容器通信

问题描述

我是 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)

在这种情况下,我得到Failed to load resource: net::ERR_NAME_NOT_RESOLVED我的 chrome 浏览器出错。我的猜测是http中的名称serviceB无法解析。但这很奇怪,因为 ping 有效。至此,serviceA 和 serviceB 都配置为使用动态分配的 IP 地址。然后,如果 serviceB 更改为真实 IP 地址,

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

则它按预期工作(创建的自定义网络 mybridge 配置在子网 172.16.1.0/24 中)。使用自定义的docker网络,我可以在docker-compose.yaml中为serviceB配置静态IP地址,在本例中为172.16.1.20(而serviceA仍然获取动态IP地址)来解决这个问题。然而,问题是为什么它无法使用动态 IP 地址下的名称,而 ping 可以用于 serviceB?

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

标签: node.jsdockerdocker-compose

解决方案


推荐阅读