首页 > 解决方案 > 如何使用 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.jsnode 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.

标签: node.jsdockerdocker-compose

解决方案


server.listen()调用中,您需要指定神奇的 IPv4“无处不在”地址 0.0.0.0。如果您在此处指定localhost,它将无法从容器外部访问。(它只接受来自容器的连接localhost,并且每个容器都有自己的localhost。)


推荐阅读