【问题标题】:Node app inside docker cannot connect to another node appdocker内的节点应用程序无法连接到另一个节点应用程序
【发布时间】:2020-12-26 18:03:24
【问题描述】:

所以这两个应用程序都在 docker 中。两者都通过 nginx 上游:

upstream api {
    server api:5000;
}

upstream search {
    server search:5001;
}

server {
...

location /api {
    rewrite /api/(.*) /$1 break;
    proxy_pass  http://api;
}

location /search {
    rewrite /search/(.*) /$1 break;
    proxy_pass  http://search;
}

使用浏览器甚至 curl 到

http://localhost/api/ 

http://localhost/search/ works.

在其中一个应用程序中,我尝试转到另一个应用程序:

//const url = "http://localhost/search/search/test";
const url = "http://localhost:5001";
request.get(url, (error, response, body) => {
    console.log('error:',error);
    console.log('response:',response);
    console.log('body:',body);
});

我尝试了两个网址。但在这两种情况下,响应是相同的:

Error: connect ECONNREFUSED 127.0.0.1:5001

在 docker-compose 中,我有这个:

api:
  restart: always
  build:
    dockerfile: Dockerfile
    context: ./server
  volumes:
    - /app/node_modules
    - ./server:/app
  links:
    - mongo
    - elasticsearch
    - search
  ports:
    - '5000:5000'
  environment:
    - NODE_ENV=${NODE_ENV}
  depends_on:
    - mongo
    
search:
  restart: always
  build:
    dockerfile: Dockerfile
    context: ./search
  volumes:
    - /app/node_modules
    - ./search:/app
  links:
    - elasticsearch
  ports:
    - '5001:5001'
  environment:
    - NODE_ENV=${NODE_ENV}        

为什么会这样?我还有另一个应用程序,一个响应的客户端。该应用程序可以连接到 api。所以我很难理解为什么这两个节点应用程序无法相互通信。

【问题讨论】:

  • 您是否尝试过使用容器名称? url = "http://search:5001";
  • 我现在做到了,它可以工作。但是,它只有在我直接通过端口时才有效:search:5001。所以它不会通过nginx。
  • 那么,nginx 在哪里呢?是另一个容器吗?
  • 请看我的回答,并请完成 Docker Compose
  • Oderfla 请看一下@German 的回答。如果有效,请将其标记为答案:)

标签: node.js docker


【解决方案1】:

问题是您将(本地)主机端口映射到容器端口,这就是您可以访问 localhost:5000 和 localhost:5001 的原因。

从cointainer的角度来看,他们并不知道对方是本地主机,每个都是它自己的本地主机。

我可以看到你有一个 mongo 硬币容器,你是如何到达 mongo 的?

您可以做两件事:第一,创建一个虚拟网络,为每个容器分配一个 IP 并使用该 IP 进行通信;或第二件事,使用命名容器并使用url = "http://search:5001"

使您的“API”容器与其名称的“搜索”容器通信

如果你有一个带有 nginx 的第三个容器,那么你需要使用它的名字 http://nginx:port/search 而不是 search

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多