【发布时间】: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 的回答。如果有效,请将其标记为答案:)