node.js - 如何使用 Docker Compose 将容器 A 中的 Node.js TCP 客户端连接到容器 B 中的 TCP 服务器?

标签 node.js docker tcp docker-compose

我正在尝试将容器 A 中的 TCP 客户端连接到容器 B 中的 TCP 服务器。运行 docker-compose up 导致客户端出现 ECONNREFUSED 错误。为什么呢?

TCP 客户端看起来像这样:

   var net = require('net');

var client = new net.Socket();
client.connect(1337, function() {
    console.log('Connected');
    client.write('Hello, server! Love, Client.');
});

client.on('data', function(data) {
    console.log('Received: ' + data);
    // client.destroy(); // kill client after server's response
});

client.on('close', function() {
    console.log('Connection closed');
});

TCP 客户端 Dockerfile 如下所示:

FROM node:latest

RUN mkdir /app
WORKDIR /app

ADD . /app

ADD package.json /app
RUN npm install

EXPOSE 1337

ENV PATH /app/node_modules/.bin:$PATH

CMD npm start

TCP 服务器看起来像这样:

var net = require('net');

var server = net.createServer(function(socket) {
    socket.write('Echo server\r\n');
    socket.pipe(socket);
});

server.listen(1337);

TCP 服务器 Dockerfile 如下所示:

FROM node:latest

RUN mkdir /app
WORKDIR /app

ADD . /app

ADD package.json /app
RUN npm install

EXPOSE 1337

ENV PATH /app/node_modules/.bin:$PATH

CMD npm start

docker-compose.yml 看起来像这样:

version: "3"
services:
  tcpclient:
    build: ./tcpclient
    ports:
      - "8000:8000"
    depends_on:
      - tcpserver
  tcpserver:
    build: ./tcpserver
    ports:
      - "8001:1337"

连接错误如下所示:

tcpclient_1  | > http-service@1.0.0 start /app
tcpclient_1  | > node tcpclient.js
tcpclient_1  |
tcpclient_1  | events.js:137
tcpclient_1  |       throw er; // Unhandled 'error' event
tcpclient_1  |       ^
tcpclient_1  |
tcpclient_1  | Error: connect ECONNREFUSED 127.0.0.1:1337
tcpclient_1  |     at Object._errnoException (util.js:1003:13)
tcpclient_1  |     at _exceptionWithHostPort (util.js:1024:20)
tcpclient_1  |     at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1194:14)
tcpclient_1  | npm ERR! code ELIFECYCLE

帮助将不胜感激

最佳答案

这里有多个问题。 我不确定容器中的 localhost 是否与您的主机处于同一界面。此外,端口绑定(bind)是 8001。但是,我会推荐另一种方法:

使用link,您可以使用名称引用其他容器主机。 我会尝试:

1)在tcpclient容器定义中添加: 链接: - TCP 服务器 2) 将 1337:1337 保留在 tcp 服务器中(顺便说一句,为什么客户端暴露了一个 TCP 端口?) 3) 使用 client.connect(1337, 'tcpserver', function(...){...}

关于node.js - 如何使用 Docker Compose 将容器 A 中的 Node.js TCP 客户端连接到容器 B 中的 TCP 服务器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48565029/

相关文章:

javascript - 请求 promise 返回未定义但存在

node.js 响应两次

忽略TCP ACK,重传SYN ACK,为什么?

连接被拒绝 - Linux 中的 TCP 套接字

javascript - 在 Node.js 中使用流来缓冲 HTTP 通信

mysql - 部署 NodeJS 后 Azure Function 无法连接到 mysql

javascript - 使用任意 gulpfile 名称运行 gulp(不是 gulpfile.js)

python - 在docker上运行uwsgi导致没有这样的文件或目录

docker - 什么是暂停容器?

python - 如何为 Python socketserver 请求处理程序编写单元测试?