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
相关产品推荐
相关产品推荐

