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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用Docker Compose将容器A中的Node.js TCP客户端连接到容器B中的TCP服务器?相关的知识,希望对你有一定的参考价值。

我正在尝试将容器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
');
    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是否与主机位于同一个界面中。此外,端口绑定是8001.但是,我会重新尝试另一种方法:

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

1)添加tcpclient容器定义: links: - tcpserver 2)在tcp服务器中保留1337:1337(为什么客户端暴露TCP端口btw?)3)使用client.connect(1337, 'tcpserver', function(...){...}

以上是关于如何使用Docker Compose将容器A中的Node.js TCP客户端连接到容器B中的TCP服务器?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 docker-compose.yml 和 ecs-cli 将 EBS 卷附加到我的容器

docker学习 docker-compose使用示例

无法将docker Spring-Boot应用程序与docker-compose中的mysql容器和flyway连接起来

使用 docker-compose 时如何在容器内使用主机用户修改卷文件

Docker的那些事儿—啥是docker compose?

Docker-compose - 如何将一个容器的数据填充到另一个容器中?