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

Django+Celery+RabbitMQ Docker环境下celery status连接拒绝问题

问题解决:Docker容器内执行celery status连接RabbitMQ失败

问题描述

Docker部署的Django项目使用RabbitMQ作为Celery Broker,执行docker compose up后所有服务启动正常,但在django容器内运行celery status时出现以下错误:

kombu.exceptions.OperationalError: [Errno 111] Connection refused

而在本地机器运行相同命令却能正常获取worker信息。

相关配置

docker-compose.yml

version: "3"

services:
  db:
    image: postgres
    networks:
      - django
    volumes:
      - postgres_db:/var/lib/postgresql/data
    ports:
      - 5432:5432
    environment:
      - POSTGRES_DB=postgres
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres

  rabbitmq:
    image: rabbitmq:3-management-alpine
    networks:
      - django
    volumes:
      - rabbitmq_data:/var/lib/rabbitmq/
      - rabbitmq_log:/var/log/rabbitmq
    ports:
      - 5672:5672
      - 15672:15672

  celery_worker:
    build: .
    command: celery -A loan_manager worker --loglevel=info
    networks:
      - django
    environment:
      - CELERY_BROKER_TRANSPORT_URL=amqp://guest:guest@rabbitmq:5672//
      - DATABASE_NAME=postgres
      - DATABASE_USER=postgres
      - DATABASE_PASSWORD=postgres
      - DATABASE_HOST=db
    depends_on:
      - rabbitmq

  django_app:
    build: .
    command: > 
      sh -c "python3 manage.py makemigrations --noinput && 
      python3 manage.py migrate --noinput && 
      python3 manage.py shell < ./utils/create_superuser.py && 
      python3 manage.py runserver 0.0.0.0:8000"
    networks:
      - django
    ports:
      - "8000:8000"
    environment:
      - CELERY_BROKER_TRANSPORT_URL=amqp://guest:guest@rabbitmq:5672//
      - DATABASE_NAME=postgres
      - DATABASE_USER=postgres
      - DATABASE_PASSWORD=postgres
      - DATABASE_HOST=db
    depends_on:
      - db
      - rabbitmq

volumes:
  postgres_db:
  rabbitmq_data:
  rabbitmq_log:

networks:
  django:

celery.py

from __future__ import absolute_import

import os

from celery import Celery


os.environ.setdefault("DJANGO_SETTINGS_MODULE", "loan_manager.settings")
app = Celery(
    "loan_manager",
    broker=os.environ.get("CELERY_BROKER_TRANSPORT_URL"),
    backend="rpc://",
    broker_connection_retry_on_startup=True,
)
app.conf.update(
    CELERY_ACCEPT_CONTENT=["application/json"],
    CELERY_TASK_SERIALIZER="json",
    CELERY_RESULT_SERIALIZER="json",
)
app.autodiscover_tasks(["apps"])

Celery Worker日志

2023-06-16 16:09:25 [2023-06-16 19:09:25,296: INFO/MainProcess] Connected to amqp://guest:**@rabbitmq:5672//
2023-06-16 16:09:25 [2023-06-16 19:09:25,303: INFO/MainProcess] mingle: searching for neighbors
2023-06-16 16:09:26 [2023-06-16 19:09:26,318: INFO/MainProcess] mingle: all alone
2023-06-16 16:09:26 [2023-06-16 19:09:26,334: INFO/MainProcess] celery@c9c1728a9b1b ready.
2023-06-16 16:09:18  
2023-06-16 16:09:18  -------------- celery@c9c1728a9b1b v5.3.0 (emerald-rush)
2023-06-16 16:09:18 --- ***** ----- 
2023-06-16 16:09:18 -- ******* ---- Linux-5.10.16.3-microsoft-standard-WSL2-x86_64-with-glibc2.28 2023-06-16 19:09:18
2023-06-16 16:09:18 - *** --- * --- 
2023-06-16 16:09:18 - ** ---------- [config]
2023-06-16 16:09:18 - ** ---------- .> app:         loan_manager:0x7ff2da1b5d10
2023-06-16 16:09:18 - ** ---------- .> transport:   amqp://guest:**@rabbitmq:5672//
2023-06-16 16:09:18 - ** ---------- .> results:     rpc://
2023-06-16 16:09:18 - *** --- * --- .> concurrency: 12 (prefork)
2023-06-16 16:09:18 -- ******* ---- .> task events: OFF (enable -E to monitor tasks in this worker)
2023-06-16 16:09:18 --- ***** ----- 
2023-06-16 16:09:18  -------------- [queues]
2023-06-16 16:09:18                 .> celery           exchange=celery(direct) key=celery
2023-06-16 16:09:18                 
2023-06-16 16:09:18 
2023-06-16 16:09:18 [tasks]
2023-06-16 16:09:18   . apps.loan_proposal.tasks.process_loan_proposals

排查与解决方案

1. 验证容器内环境变量是否正确加载

进入django容器后,先执行以下命令确认Broker地址变量:

echo $CELERY_BROKER_TRANSPORT_URL

如果输出不是amqp://guest:guest@rabbitmq:5672//,说明环境变量未正确传递,检查docker-compose.yml中django_app的environment配置,确保变量拼写无误。

2. 执行celery status时指定完整应用参数

在django容器内执行命令时,必须指定Celery应用名称,否则会使用默认配置导致连接失败:

celery -A loan_manager status

确保命令执行时处于项目根目录(即manage.py所在目录)。

3. 确认RabbitMQ服务完全就绪

depends_on仅保证容器启动顺序,不代表RabbitMQ服务已完全启动。可以在django容器内测试网络连通性:

# 测试ping连通性
ping rabbitmq
# 测试端口是否开放
nc -zv rabbitmq 5672

如果端口不通,等待10-20秒后重试,或者在docker-compose中添加健康检查确保RabbitMQ就绪:

rabbitmq:
  image: rabbitmq:3-management-alpine
  networks:
    - django
  volumes:
    - rabbitmq_data:/var/lib/rabbitmq/
    - rabbitmq_log:/var/log/rabbitmq
  ports:
    - 5672:5672
    - 15672:15672
  healthcheck:
    test: ["CMD", "rabbitmq-diagnostics", "-q", "ping"]
    interval: 30s
    timeout: 30s
    retries: 3

4. 验证Celery配置是否正确读取环境变量

在django容器内运行Python代码验证配置:

import os
from celery import Celery

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "loan_manager.settings")
app = Celery("loan_manager")
app.config_from_object('django.conf:settings', namespace='CELERY')
print("Broker URL:", app.conf.broker_url)

如果输出为空或错误,检查celery.py中是否正确使用os.environ.get("CELERY_BROKER_TRANSPORT_URL"),或者是否有其他配置覆盖了Broker地址。


内容的提问来源于stack exchange,提问作者Augusto S. de O.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 11:27:56