node.js - 通过 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 配置的更多详细信息,并提前致谢。
解决方案
推荐阅读
- amazon-web-services - TCP 连接锁定在“CLOSE_WAIT”状态,IIS 应用程序在 AWS 服务器上进行 Kerberos 身份验证(Windows 服务器 2016 标准)
- c++ - 对向量进行排序时的奇怪行为
- apache-spark - Pyspark Fpgrowth - 是否可以只返回关闭的频繁项集?
- jquery - 几个拥有大型 JQuery 自动完成数据集的用户降低了整个 Ruby on Rails 应用程序的速度
- azure - ESP32 的 C2D 消息
- python - 合并具有相同凭据的行 -pyspark 数据框
- python - Python - 从抽象基类继承的动态类注册
- javascript - 用 Javascript 而不是 jQuery 编写这个
- .net-core - 如何使用 Azure SDK for .Net Core 列出角色分配的成员?
- sql - 删除 id 存在多次但保留最新日期戳的记录的行