我正在尝试使用 docker compose 组合我的服务,但我的 celery 和 celerybeat 服务无法与我的rabbitmq 服务连接。 这是 docker-compose.yml 文件中我的rabbitmq服务
rabbitmq:
container_name: "rabbitmq"
image: rabbitmq:3-management
ports:
- 15672:15672
- 5672:5672
environment:
- RABBITMQ_DEFAULT_USER=guest
- RABBITMQ_DEFAULT_PASS=guest
depends_on:
- server
volumes:
- rabbitmq:/var/lib/rabbitmq
这是 docker-compose.yml 中的我的 celery worker 和 celerybeat 服务
celery_worker:
container_name: celery-worker
build: .
command: celery -A tasks worker -E --loglevel=INFO
environment:
host_server: postgresqldb
db_server_port: 5432
database_name: db
db_username: user
db_password: password
ssl_mode: prefer
networks:
- postgresqlnet
depends_on:
- rabbitmq
celery_beat:
container_name: celery-beat
build: .
command: celery -A tasks beat
environment:
- host_server=postgresqldb
- db_server_port=5432
- database_name=db
- db_username=user
- db_password=password
- ssl_mode=prefer
networks:
- postgresqlnet
depends_on:
- rabbitmq
我还有一个 celeryconfig.py,其中存储了代理 url。其内容如下
broker_url = "amqp://guest:guest@localhost:5672//"
当我运行 docker compose up 时,我从 celery 和 celerybeat 获得此输出。
celery-worker | [2023-02-03 14:24:43,223: ERROR/MainProcess] consumer: Cannot connect to amqp://guest:**@127.0.0.1:5672//: [Errno 111] Connection refused.
celery-worker | Trying again in 32.00 seconds... (16/100)
celery-worker |
celery-beat | [2023-02-03 14:25:10,058: ERROR/MainProcess] beat: Connection error: [Errno 111] Connection refused. Trying again in 32.0 seconds...
我现在意识到我做错了什么。首先,我需要使用 docker 网络连接所有三个服务,然后在我的 celeryconfig 文件中使用“rabbitmq”作为主机名。
我遇到了类似的问题,即我的 Celery Worker 在使用 Docker Compose 编排时无法连接到 RabbitMQ 服务。对我有用的解决方案涉及更改网络模式来托管所涉及的服务。这允许服务通过主机网络进行通信,消除了端口映射的需要,并使服务发现变得简单,因为它们可以通过 localhost 连接。
以下是调整 Docker Compose 配置的方法:
对于您的 RabbitMQ 服务:
rabbitmq:
container_name: "rabbitmq"
image: rabbitmq:3-management
environment:
- RABBITMQ_DEFAULT_USER=guest
- RABBITMQ_DEFAULT_PASS=guest
volumes:
- rabbitmq:/var/lib/rabbitmq
network_mode: "host"
对于您的 Celery 工作人员和 Celery 节拍服务:
celery_worker:
#
network_mode: "host"
celery_beat:
#
network_mode: "host"
确保调整 celeryconfig.py 中的broker_url以指向本地主机或主机的IP地址,因为所有服务现在都位于主机网络上:
broker_url = "amqp://guest:guest@localhost:5672//"
此配置允许您的 Celery Worker 和 Beat 服务使用 localhost 成功连接到 RabbitMQ,因为它们都利用主机的网络。请注意,使用 network_mode: "host" 使您的服务直接使用主机的网络堆栈,这种方法通常更适合 Linux 环境。由于网络实现方式的差异,它在 Windows 或 Mac 版 Docker 上的行为可能有所不同。