node.js - 如何使用 docker-compose 设置 NodeJs 客户端和服务器?
问题描述
我有以下node.js
脚本:
客户端.js
const net = require('net');
const client = new net.Socket();
client.connect(9233, 'server', (error) => {
console.log('Connected to packet feed');
});
client.on('error', (err) => {
console.log(err);
})
服务器.js
const net = require('net');
const server = net.createServer((socket) => {
});
server.listen(9233, 'localhost');
以及以下docker-compose.yaml
version: '3'
services:
server:
build: .
volumes:
- ./:/usr/src/app
command: node server.js
ports:
- "9233:9233"
client:
build: .
volumes:
- ./:/usr/src/app
environment:
command: node clients.js
links:
- server
depends_on:
- server
如果我在我的机器上运行node server.js
,node client.js
它们会成功地相互连接。
但是如果我运行docker-compose up
,我会得到以下错误:
client_1 | Error: connect ECONNREFUSED 172.26.0.2:9233
client_1 | at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1056:14) {
client_1 | errno: 'ECONNREFUSED',
client_1 | code: 'ECONNREFUSED',
client_1 | syscall: 'connect',
client_1 | address: '172.26.0.2',
client_1 | port: 9233
client_1 | }
我究竟做错了什么?我已经尽我所能,包括docker-compose run --service-ports
代替docker-compose up
.
解决方案
在server.listen()
调用中,您需要指定神奇的 IPv4“无处不在”地址 0.0.0.0。如果您在此处指定localhost
,它将无法从容器外部访问。(它只接受来自容器的连接localhost
,并且每个容器都有自己的localhost
。)