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

Docker容器中Django+Celery+RabbitMQ连接被拒问题求助

解决Docker容器中Celery连接RabbitMQ报错Connection refused的问题

核心排查方向及解决方案

1. 修正RabbitMQ连接地址配置

容器环境中,localhost指向容器自身,而非宿主机或其他容器。必须将Django/Celery配置中的Broker地址改为docker-compose里的RabbitMQ服务名rabbitmq:

在Django的settings.py中修改:

# 替换原有的localhost为rabbitmq
CELERY_BROKER_URL = 'amqp://guest:guest@rabbitmq:5672//'
CELERY_RESULT_BACKEND = 'rpc://'  # 如果用RabbitMQ作为结果后端

2. 等待RabbitMQ完全就绪后启动Celery

depends_on仅保证启动顺序,不确保RabbitMQ服务完全初始化完成。给Celery添加启动前的等待逻辑:

修改docker-compose中celery服务的command:

celery:
  build:
    context: .
  command: >
    sh -c "until nc -z rabbitmq 5672; do echo '等待RabbitMQ启动...'; sleep 2; done; celery -A loan worker --loglevel=info"
  depends_on:
    - rabbitmq
  restart: always

注意:需确保Celery容器中安装了netcat工具,可在Dockerfile中添加:

# Debian/Ubuntu基础镜像
RUN apt-get update && apt-get install -y netcat-openbsd && rm -rf /var/lib/apt/lists/*
# 或Alpine基础镜像
RUN apk add --no-cache nc

3. 处理RabbitMQ用户访问限制

默认guest用户仅允许本地访问,容器间连接属于远程访问,需调整用户配置:

  • 方案一:创建自定义用户
    修改docker-compose的rabbitmq服务,添加环境变量创建新用户:

    rabbitmq:
      image: rabbitmq:3.12.0-management
      container_name: 'rabbitmq'
      ports:
        - 5672:5672
        - 15672:15672
      environment:
        - RABBITMQ_DEFAULT_USER=celeryuser
        - RABBITMQ_DEFAULT_PASS=celerypass
      restart: always
    

    同步更新Django配置中的Broker地址:

    CELERY_BROKER_URL = 'amqp://celeryuser:celerypass@rabbitmq:5672//'
    
  • 方案二:允许guest用户远程访问
    在rabbitmq服务中添加环境变量:

    rabbitmq:
      ...
      environment:
        - RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS="-rabbit loopback_users none"
      ...
    

4. 确认Docker网络连通性

docker-compose默认会创建一个专属网络,所有服务默认加入该网络。若自定义了网络配置,需确保rabbitmq、celery、loan服务都在同一个网络中。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 08:22:35