如何让docker-compose环境下的nodejs微服务之间实现正常通信?
问题根因
你当前调用失败的核心原因是容器网络的寻址逻辑错误:在Docker容器内部使用localhost时,指向的是当前容器自身的网络命名空间,而非宿主机或者其他同网络下的容器,因此无法访问到comments服务。
正确调用方式
Docker Compose启动时会默认给所有服务创建专用的桥接网络,同网络下的服务可以直接使用服务名作为域名互相寻址,端口使用服务在容器内部监听的端口即可,不需要使用宿主机映射端口。
你配置的comments服务的服务名为comments,内部监听端口为4201,因此将posts服务内的调用代码修改为如下即可:
let comments = await axios.get("http://comments:4201/comments");
补充注意事项
- 服务间调用不需要依赖宿主机端口映射,哪怕你删除comments服务的
ports配置,只要两个服务在同一个Docker Compose网络下,就能正常互通 depends_on仅能控制容器的启动顺序,无法保证comments服务的业务进程完全启动就绪,如果启动初期调用仍偶发报错,可以给axios请求增加重试逻辑,或者给服务配置健康检查来控制启动依赖links属于Docker已废弃的特性,Docker Compose内置的DNS服务已经可以自动解析服务名,你可以直接删除links配置项
内容的提问来源于stack exchange,提问作者Jan Tuđan
相关产品推荐
相关产品推荐

