Bagaimana cara menghubungkan klien TCP Node.js di wadah A ke server TCP di wadah B dengan Docker Compose?

Saya mencoba menghubungkan klien TCP di wadah A ke server TCP di wadah B. Menjalankan komposisi docker menghasilkan kesalahan ECONNREFUSED di sisi klien. 为什么呢?

Klien TCP terlihat seperti ini:

   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');
});

Dockerfile klien TCP terlihat seperti ini:

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

Server TCP terlihat seperti ini:

var net = require('net');

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

server.listen(1337);

Dockerfile server TCP terlihat seperti ini:

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 terlihat seperti ini:

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

Kesalahan koneksi terlihat seperti ini:

tcpclient_1  | > [email protected] 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

Bantuan akan sangat dihargai


person Wasbeer    schedule 01.02.2018    source sumber
comment
127.0.0.1 akan menunjuk ke localhost container Anda, bukan ke localhost host Anda. Coba sambungkan menggunakan tcpserver:1337 alih-alih 127.0.0.1. Penulisan Docker akan menyebarkan kontainer tersebut secara default di jaringan yang sama yang berarti mereka dapat menyelesaikan satu sama lain dengan menggunakan nama layanan   -  person lvthillo    schedule 01.02.2018
comment
Oke menambahkan 'tcpserver' sebagai host berfungsi seperti sulap. Terima kasih!   -  person Wasbeer    schedule 01.02.2018
comment
Saat ini, klien terhubung ke server: tcpclient_1 | tcpclient_1 | > [email protected] start /app tcpclient_1 | > node tcpclient.js tcpclient_1 | tcpclient_1 | Connected Namun, setelah terhubung, klien tidak menerima data. Kodenya bisa dilihat disini: github.com/wassbeer/docker/tree/networking -dalam-menulis   -  person Wasbeer    schedule 01.02.2018
comment
Saya bukan pengembang node, tetapi ketika saya menghapus komentar client.destroy();, sepertinya node tersebut hancur dan mencetak koneksi ditutup setelah menerima data tetapi mungkin saya salah.   -  person lvthillo    schedule 01.02.2018
comment
Masalahnya ternyata docker-compose up tidak mencatat seluruh output di Docker Toolbox. Saat menjalankan docker-compose logs --follow tcpclient saya dapat melihat seluruh komunikasi server-klien.   -  person Wasbeer    schedule 02.02.2018


Jawaban (1)


Banyak masalah di sini. Saya tidak yakin localhost dari sebuah container akan memiliki antarmuka yang sama dengan host Anda. Selain itu, port yang terikat adalah 8001. Namun, saya akan merekomendasikan pendekatan lain:

Menggunakan link Anda dapat mereferensikan host container lain dengan namanya. Saya akan mencoba untuk:

1) Tambahkan tcpclient definisi wadah: links: - tcpserver 2) Simpan 1337:1337 di server tcp (mengapa klien mengekspos port TCP btw?) 3) gunakan client.connect(1337, 'tcpserver', function(...){...}

person Jean-Adrien    schedule 01.02.2018
comment
1) Terima kasih, menambahkan 'tcpserver' sebagai HOST ke client.connect(1337, ....) membuat klien terhubung! 2) Menambahkan tautan sepertinya tidak mengubah perilaku. Tanpa itu berfungsi juga. 3) Setelah koneksi, klien tidak menerima data, atau tidak mencatatnya. Adakah petunjuk mengapa ia terhubung tetapi tidak menerima data? Terima kasih. - person Wasbeer; 01.02.2018