为什么celeryworker无法使用docker compose连接到rabbitmq

问题描述 投票:0回答:2

我正在尝试使用 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 docker-compose rabbitmq celery celerybeat
2个回答
0
投票

我现在意识到我做错了什么。首先,我需要使用 docker 网络连接所有三个服务,然后在我的 celeryconfig 文件中使用“rabbitmq”作为主机名。


0
投票

我遇到了类似的问题,即我的 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 上的行为可能有所不同。

© www.soinside.com 2019 - 2024. All rights reserved.