Luk*_*R97 3 http node.js docker docker-compose
我正在运行一个带有 2 个容器的简单 Nodejs 应用程序。服务器容器和客户端。我有一个设置,以便当客户端向服务器发出请求时,它将一些数据流回客户端,但是当我尝试从客户端发出此请求时,我收到以下错误
connect ECONNREFUSED 127.0.0.1:8080
Run Code Online (Sandbox Code Playgroud)
当我使用容器IP地址时也是这种情况。两个容器都位于同一网络上。我通过 docker 网络检查确认了这一点。当我通过邮递员提出相同的请求时,效果很好。
这是我的设置
服务器设置
服务器 Dockerfile
FROM node:12
EXPOSE 8080
WORKDIR /home/node/server
COPY package*.json ./
RUN npm install
COPY . .
CMD ["node", "app.js"]
Run Code Online (Sandbox Code Playgroud)
服务器http函数
http.createServer(function(request, response){
filePath = path.join("./serverdata", 'filename.txt');
var stat = fs.statSync(filePath);
response.writeHead(200, {
'Content-Type': 'text/plain',
'Content-Length': stat.size
});
var readStream = fs.createReadStream(filePath);
readStream.pipe(response);
})
.listen(port);
Run Code Online (Sandbox Code Playgroud)
客户端设置
客户端 Dockerfile
FROM node:12
WORKDIR /home/node/client
COPY package*.json ./
RUN npm install
COPY . .
CMD ["node", "capp.js"]
Run Code Online (Sandbox Code Playgroud)
使用服务器容器 IP 的客户端 Get Function NB产生相同的结果
http.get('http://localhost:8080', (resp)=>{
let data = '';
resp.on('data', (chunk)=>{
data += chunk;
});
resp.end('end', ()=>{
console.log(data);
});
}).on("error", (err)=>{
console.log(err.message);
});
Run Code Online (Sandbox Code Playgroud)
Docker 组合
version: "3.2"
services:
server-app:
build: ./serverClient
ports:
- 8080:8080
volumes:
- servervol:/serverdata
client-app:
build: ./clientClient
ports:
- 8081:8081
volumes:
- clientvol:/clientdata
depends_on:
- "server-app"
volumes:
servervol:
driver: local
clientvol:
driver: local
Run Code Online (Sandbox Code Playgroud)
我读过一些帖子,声称问题在于使用 localhost 而不是容器 IP,但我尝试了两者都没有成功。如前所述,在 Postman 中完成时,效果很好;这让我认为问题出在客户端部分。非常感谢任何指导。
谢谢
由于您使用的是 Docker Compose,默认情况下(因为您没有指定网络)您的服务共享相同的(默认)网络,因此您可以使用服务的名称而不是其 IP 地址与其进行通信,因为 Docker 可以由于服务名称解析,根据服务名称找出 IP 地址。
由于 Docker 的魔力,您唯一需要更改的是连接到服务器的方式:
http.get('server-app:8080', (resp) => { ... })
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6881 次 |
| 最近记录: |