You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用Docker Compose连接容器间Node.js TCP客户端与服务端?连接被拒排查

Ah, that ECONNREFUSED error is such a common gotcha when working with Docker Compose and networked services—let’s break down the most likely causes and fixes for your setup.

1. You’re connecting to localhost instead of the server’s container name

This is the #1 culprit here. When your client code calls client.connect(1337, function() {}), it’s defaulting to connecting to localhost inside the client container. But localhost in a container refers only to that container itself, not the server container running alongside it.

Fix: Update your client code to target the server’s service name from your docker-compose.yml file. For example, if your server service is named tcp-server, modify the connect call like this:

client.connect(1337, 'tcp-server', function() {
    console.log('Connected');
    client.write('Hello, server! Love, Client.');
});

Docker Compose automatically resolves service names to container IPs within its default network, so this will point your client directly to the server container.

2. The server container isn’t ready when the client tries to connect

Docker Compose starts containers in parallel by default. That means your client might be trying to connect to the server before the server’s Node.js process has finished starting up and begun listening on port 1337.

Fixes:

  • Add health checks to your server in docker-compose.yml, so the client waits until the server is actually ready:
    services:
      tcp-server:
        build: ./server
        healthcheck:
          test: ["CMD", "nc", "-z", "localhost", "1337"]
          interval: 1s
          timeout: 3s
          retries: 5
      tcp-client:
        build: ./client
        depends_on:
          tcp-server:
            condition: service_healthy
    
  • Add retry logic to your client code to handle transient connection failures:
    var net = require('net');
    var client = new net.Socket();
    
    function attemptConnection() {
      client.connect(1337, 'tcp-server', function() {
        console.log('Connected');
        client.write('Hello, server! Love, Client.');
      });
    }
    
    client.on('error', (err) => {
      console.log('Connection failed, retrying in 1s...', err.message);
      setTimeout(attemptConnection, 1000);
    });
    
    client.on('data', function(data) {
      console.log('Received: ' + data);
    });
    
    client.on('close', function() {
      console.log('Connection closed');
    });
    
    attemptConnection();
    

3. Your server is only listening on localhost (not 0.0.0.0)

If your server code is listening only on localhost (instead of all network interfaces), it won’t accept connections from outside its own container. Even if your client uses the correct service name, the server won’t respond.

Fix: Ensure your server’s listen call uses 0.0.0.0 to bind to all interfaces:

const net = require('net');
const server = net.createServer((socket) => {
  // Server logic here
});

server.listen(1337, '0.0.0.0', () => {
  console.log('Server listening on port 1337');
});

4. Network misconfiguration in Docker Compose

By default, Docker Compose creates a shared network for all services in your file, letting them communicate freely. If you’ve manually configured separate networks for your client and server, they won’t be able to reach each other.

Fix: Make sure both services are on the same network. You can either use the default network (no extra config needed) or explicitly define a shared network:

services:
  tcp-server:
    build: ./server
    networks:
      - tcp-shared-network
  tcp-client:
    build: ./client
    networks:
      - tcp-shared-network

networks:
  tcp-shared-network:
    driver: bridge

Quick side note

Your client Dockerfile has EXPOSE 1337—this is unnecessary for a client that initiates connections (exposing ports is for services that accept incoming connections). It won’t break anything, but you can safely remove it to clean up the config.

内容的提问来源于stack exchange,提问作者Wasbeer

火山引擎 最新活动