如何配置 docker 以将 redis 与 celery 一起使用

Posted

技术标签:

【中文标题】如何配置 docker 以将 redis 与 celery 一起使用【英文标题】:How to configure docker to use redis with celery 【发布时间】:2019-01-09 09:37:13 【问题描述】:

docker-compose.yml

version: '3.1'
services:

  redis:
    image: redis:latest
    container_name: rd01
    ports:
     - '6379:6379'

  webapp:
    image: webapp
    container_name: wa01
    ports: 
      - "8000:8000"
    links:
      - redis
    depends_on:
      - redis


  celery:
    build: .
    container_name: cl01
    command: celery -A server worker -l info
    depends_on:
      - redis

我也不觉得我理解链接和依赖,我尝试了不同的组合。

Celery 无法连接到 redis。我收到以下错误 -

[2018-08-01 13:59:42,249: ERROR/MainProcess] consumer: Cannot connect to amqp://guest:**@127.0.0.1:5672//: [Errno 111] Connection refused.

我相信我已经在我的 django 应用程序的 settings.py 中正确设置了代理 URL(webapp 图像)

CELERY_BROKER_URL = 'redis://redis:6379/0' 
CELERY_RESULT_BACKEND = 'redis://redis:6379/0'

使用 celery 和 redis 对 django 项目进行 dockerize 的正确方法是什么? TIA。

编辑

celery.py

from __future__ import absolute_import, unicode_literals
import os
from celery import Celery
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'server.settings')

app = Celery('server')
app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()


@app.task(bind=True)
def debug_task(self):
    print('Request: 0!r'.format(self.request))

This is my django project 是重现错误的最简单形式。

【问题讨论】:

您可以添加您的celery 配置设置吗? @JerinPeterGeorge:你说的是 celery.py 吗? 是的..请添加它 @JerinPeterGeorge 我已经添加了。 【参考方案1】:

您必须在初始化 Celery 类时添加 redis url

from __future__ import absolute_import, unicode_literals
import os
from celery import Celery

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'server.settings')

app = Celery('server', broker='redis://redis:6379/0') # Change is here <<<<
app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()


@app.task(bind=True)
def debug_task(self):
    print('Request: 0!r'.format(self.request))

更新

[经过长时间的讨论] 将您的docker-compose.yml 更改为

version: '3.1'
services:

  redis:
    image: redis:latest
    container_name: rd01

  webapp:
    build: .
    container_name: wa01
    ports:
      - "8000:8000"
    links:
      - redis
    depends_on:
      - redis


  celery:
    build: .
    volumes:
      - .:/src
    container_name: cl01
    command: celery -A server worker -l info
    links:
      - redis

Dockerfile 一样

FROM python:3.6
RUN mkdir /webapp
WORKDIR /webapp
COPY . /webapp
RUN pip install -r requirements.txt
EXPOSE 8000
CMD ["/start.sh"]

【讨论】:

这并没有解决它。我觉得问题出在我配置docker-compose.yml 的方式上。因为它在本地运行良好。就像,不使用 docker。 您的问题Cannot connect to amqp://guest:**@127.0.0.1:5672//: 中的错误表示您正在尝试连接到ampq brocker。 它仍然给出同样的错误。我觉得 celery 没有使用正确的配置文件或 docker 内的任何内容。如果没有 docker,它能够正确识别 redis 代理 url。 你是如何运行 docker-compose 的? docker-compose up

以上是关于如何配置 docker 以将 redis 与 celery 一起使用的主要内容,如果未能解决你的问题,请参考以下文章

如何使用ssl设置Docker redis容器

Linux 下的 Docker 安装与使用

Docker相关概念与安装(Docker-CE)

Docker相关概念与安装(Docker-CE)

Docker基本操作 安装redis 与 redis 主从配置

docker 安装配置