You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker部署下NestJS项目2无法连接RabbitMQ问题求助

Docker部署NestJS项目连接RabbitMQ问题排查:ea-receiver连接失败(ECONNREFUSED)

我通过Docker部署两个NestJS项目连接RabbitMQ服务,其中project-1(容器名ea-worker)可正常连接,但project-2(容器名ea-receiver)始终连接失败,报错connect ECONNREFUSED。已尝试直接使用RabbitMQ URL(amqp://rabbit:rabbit@rabbitmq:5672)和IP地址配置,但问题依旧。以下是相关信息,恳请帮忙排查。

容器名称

  • ea-worker(project-1)
  • ea-receiver(project-2)
  • ea-mongodb
  • ea-rabbitmq

报错日志

2023-10-13 11:27:11 [5:27:11 AM] Found 0 errors. Watching for file changes.
2023-10-13 11:27:11 
2023-10-13 11:27:11 [Nest] 31  - 10/13/2023, 5:27:11 AM     LOG [NestFactory] Starting Nest application...
2023-10-13 11:27:11 [Nest] 31  - 10/13/2023, 5:27:11 AM     LOG [InstanceLoader] RabbitmqModule dependencies initialized +7ms
2023-10-13 11:27:11 [Nest] 31  - 10/13/2023, 5:27:11 AM     LOG [InstanceLoader] ClientsModule dependencies initialized +0ms
2023-10-13 11:27:11 [Nest] 31  - 10/13/2023, 5:27:11 AM     LOG [InstanceLoader] AppModule dependencies initialized +0ms
2023-10-13 11:27:11 Error connecting to RabbitMQ (attempt 1): {
2023-10-13 11:27:11   err: Error: connect ECONNREFUSED 172.21.0.4:5672
2023-10-13 11:27:11       at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1495:16) {
2023-10-13 11:27:11     errno: -111,
2023-10-13 11:27:11     code: 'ECONNREFUSED',
2023-10-13 11:27:11     syscall: 'connect',
2023-10-13 11:27:11     address: '172.21.0.4',
2023-10-13 11:27:11     port: 5672
2023-10-13 11:27:11   },
2023-10-13 11:27:11   url: 'amqp://rabbit:rabbit@rabbitmq:5672'
2023-10-13 11:27:11 }

docker-compose.yml配置

version: '3'
services:
  app:
    container_name: ea-worker
    build:
      context: ./project-1
      dockerfile: Dockerfile
    ports:
      - "6000:6000"
    depends_on:
      - mongo
      - rabbitmq
    networks:
      - my_network
    volumes:
      - .:/app
    environment:
      RABBITMQ_URL: "amqp://rabbit:rabbit@rabbitmq:5672"
      MONGO_USERNAME: root
      MONGO_PASSWORD: root
      MONGO_HOST: mongo
      MONGO_PORT: 27017
      MONGO_DB: my_db
      MONGO_URL: "mongodb://root:root@localhost:27017/my_db"

  receiver:
    container_name: ea-receiver
    build: 
      context: ./project-2
      dockerfile: Dockerfile
    ports:
      - "8000:7000"
    depends_on:
      - rabbitmq
    environment:
      RABBITMQ_URL: "amqp://rabbit:rabbit@rabbitmq:5672"
    networks:
      - my_network
    volumes:
      - .:/app

  mongo:
    container_name: ea-mongodb
    image: "mongo:7.0.2"
    ports:
      - "27017:27017"
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: root
    networks:
      - my_network
    volumes:
      - ./mongo_data:/data/db

  rabbitmq:
    container_name: ea-rabbitmq
    image: "rabbitmq:3.11.10-management"
    ports:
      - "5672:5672"
      - "15672:15672"
    environment:
      RABBITMQ_DEFAULT_USER: rabbit
      RABBITMQ_DEFAULT_PASS: rabbit
    networks:
      - my_network
    volumes:
      - ./rabbitmq_data:/var/lib/rabbitmq

networks:
  my_network:
    driver: bridge

project-2的RabbitMQ连接代码

RabbitmqModule

import { Module } from '@nestjs/common';
import { ClientsModule, Transport } from '@nestjs/microservices';
import { RabbitmqService } from './rabbitmq.service';

@Module({
  imports: [
    ClientsModule.register([
      {
        name: 'RABBITMQ_SERVICE',
        transport: Transport.RMQ,
        options: {
          urls: [process.env.RABBITMQ_URL],
          queue: 'my_queue',
          queueOptions: {
            durable: true,
          },
        },
      },
    ]),
  ],
  providers: [RabbitmqService],
})
export class RabbitmqModule {}

RabbitmqService

import { Injectable, OnModuleInit } from '@nestjs/common';
import { ClientProxyFactory, Transport } from '@nestjs/microservices';
import { ClientProxy } from '@nestjs/microservices';
import * as retry from 'retry';

@Injectable()
export class RabbitmqService implements OnModuleInit {

  private readonly client: ClientProxy;

  constructor() {
    this.client = ClientProxyFactory.create({
      transport: Transport.RMQ,
      options: {
        urls: [process.env.RABBITMQ_URL],
        queue: 'my_queue',
        queueOptions: {
          durable: false,
        },
      },
    });
  }

  async onModuleInit() {
    await this.connectWithRetry();
  }

  private async connectWithRetry() {
    const operation = retry.operation({
      retries: 10, // Adjust the number of retries as needed
      factor: 2,
      minTimeout: 1000, // Adjust the timeout as needed
    });

    operation.attempt(async (currentAttempt) => {
      try {
        await this.client.connect();
        console.log('Connected to RabbitMQ');
      } catch (error) {
        console.error(`Error connecting to RabbitMQ (attempt ${currentAttempt}):`, error);
        if (operation.retry(error)) {
          return;
        }
        console.error('Max retries reached. Exiting...');
        process.exit(1);
      }
    });
  }

  async handleMessage(message: any): Promise<any> {
    try {
      console.log(`Received message: ${JSON.stringify(message)}`);
      // Process the message as needed
      return 'Message processed successfully';
    } catch (error) {
      console.error(`Error processing message: ${error.message}`);
      // Handle the error accordingly
      throw error;
    }
  }
}

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 20:05:30