如何使用 Docker 设置 Django + RabbitMQ + Celery?
How to setup Django + RabbitMQ + Celery with Docker?
我正在尝试设置我的 Django 应用程序以具有推送通知功能。对于调度通知,我尝试使用 Celery,对于消息代理,我选择了 RabbitMQ。我的应用程序是 运行 在 Docker 容器中,我正在努力让 RabbitMQ 工作。当 运行 docker-compose up
时,我收到一条错误消息 Cannot connect to amqp://guest:**@127.0.0.1:5672//: [Errno 111] Connection refused.
。这是来自 docker-compose.yml
:
的 celery
和 rabbitmq3
服务
celery:
restart: always
build:
context: .
command: celery -A test_celery worker -l info
volumes:
- .:/test_celery
env_file:
- ./.env
depends_on:
- app
- rabbitmq3
rabbitmq3:
container_name: "rabbitmq"
image: rabbitmq:3-management-alpine
ports:
- 5672:5672
- 15672:15672
在我的 test_celery
-app 中,我有一个名为 celery.py
的文件,其中包含以下内容:
import os
from celery import Celery
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'test_celery.settings')
app = Celery('test_celery')
app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()
最后,在我的 settings.py
中,我有这个:CELERY_BROKER_URL = 'amqp://localhost'
。
我应该以某种不同的方式定义 CELERY_BROKER_URL
吗?我的 docker-compose 文件有问题吗?如果您对此有任何帮助,我将不胜感激,我的设置有什么问题吗?
这应该可以解决问题
CELERY_BROKER_URL=amqp://guest:guest@rabbitmq3:5672/
如果你在 rabbit 上有虚拟主机
CELERY_BROKER_URL=amqp://guest:guest@rabbitmq3:5672/vhost
如果它不起作用,请检查 rabbit 容器的控制台以获取线索
在settings.py中定义:
RABBITMQ = {
"PROTOCOL": "amqp", # in prod change with "amqps"
"HOST": os.getenv("RABBITMQ_HOST", "localhost"),
"PORT": os.getenv("RABBITMQ_PORT", 5672),
"USER": os.getenv("RABBITMQ_USER", "guest"),
"PASSWORD": os.getenv("RABBITMQ_PASSWORD", "guest"),
}
CELERY_BROKER_URL = f"{RABBITMQ['PROTOCOL']}://{RABBITMQ['USER']}:{RABBITMQ['PASSWORD']}@{RABBITMQ['HOST']}:{RABBITMQ['PORT']}"
我正在尝试设置我的 Django 应用程序以具有推送通知功能。对于调度通知,我尝试使用 Celery,对于消息代理,我选择了 RabbitMQ。我的应用程序是 运行 在 Docker 容器中,我正在努力让 RabbitMQ 工作。当 运行 docker-compose up
时,我收到一条错误消息 Cannot connect to amqp://guest:**@127.0.0.1:5672//: [Errno 111] Connection refused.
。这是来自 docker-compose.yml
:
celery
和 rabbitmq3
服务
celery:
restart: always
build:
context: .
command: celery -A test_celery worker -l info
volumes:
- .:/test_celery
env_file:
- ./.env
depends_on:
- app
- rabbitmq3
rabbitmq3:
container_name: "rabbitmq"
image: rabbitmq:3-management-alpine
ports:
- 5672:5672
- 15672:15672
在我的 test_celery
-app 中,我有一个名为 celery.py
的文件,其中包含以下内容:
import os
from celery import Celery
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'test_celery.settings')
app = Celery('test_celery')
app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()
最后,在我的 settings.py
中,我有这个:CELERY_BROKER_URL = 'amqp://localhost'
。
我应该以某种不同的方式定义 CELERY_BROKER_URL
吗?我的 docker-compose 文件有问题吗?如果您对此有任何帮助,我将不胜感激,我的设置有什么问题吗?
这应该可以解决问题
CELERY_BROKER_URL=amqp://guest:guest@rabbitmq3:5672/
如果你在 rabbit 上有虚拟主机
CELERY_BROKER_URL=amqp://guest:guest@rabbitmq3:5672/vhost
如果它不起作用,请检查 rabbit 容器的控制台以获取线索
在settings.py中定义:
RABBITMQ = {
"PROTOCOL": "amqp", # in prod change with "amqps"
"HOST": os.getenv("RABBITMQ_HOST", "localhost"),
"PORT": os.getenv("RABBITMQ_PORT", 5672),
"USER": os.getenv("RABBITMQ_USER", "guest"),
"PASSWORD": os.getenv("RABBITMQ_PASSWORD", "guest"),
}
CELERY_BROKER_URL = f"{RABBITMQ['PROTOCOL']}://{RABBITMQ['USER']}:{RABBITMQ['PASSWORD']}@{RABBITMQ['HOST']}:{RABBITMQ['PORT']}"