Redis + Docker + Django - 错误111连接被拒绝

时间:2015-09-16 17:48:55

标签: django redis docker

我尝试使用Redis作为Celery的代理,用于我使用Docker Compose的Django项目。我无法弄清楚我究竟做错了什么,但尽管控制台日志消息告诉我Redis正在运行并接受连接(事实上,当我做docker ps时,我可以看到容器正在运行),我仍然收到有关连接被拒绝的错误。我甚至做过

docker exec -it <redis_container_name> redis-cli
ping

并看到回复是PONG

以下是我settings.py中的芹菜设置:

BROKER_URL = 'redis://localhost:6379/0'
BROKER_TRANSPORT = 'redis'
CELERY_RESULT_BACKEND = 'redis://localhost:6379/0'
CELERY_ACCEPT_CONTENT = ['application/json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_ENABLE_UTC = True
CELERY_TIMEZONE = "UTC"

以下是我docker-compose.yml中的Redis容器设置:

redis:
    image: redis
    ports:
        - "6379:6379"

我记得也将redis容器与我的web容器相关联。我可以很好地启动服务器,但是当我尝试将任何内容上传到网站时,我收到连接拒绝错误。究竟出了什么问题?

编辑:我记得使用VBoxManage移植,以便我可以访问我的浏览器并访问我的网站localhost:8000,所以我似乎不需要为我的localhost使用VM的IP而不是settings.py

编辑2 :如果我使用localhost VM的IP地址或Redis容器的IP地址替换设置中的docker-machine,那么会发生什么当我上传文件时,我真的很快在我的网站上得到了一个虚假的成功消息,但实际上并没有上传任何内容。基础上传功能insertIntoDatabase()使用delay

2 个答案:

答案 0 :(得分:3)

由于将Celery从v3.1更新到v4,我遇到了类似的问题,根据此tutorial,需要在BROKER_URL中将CELERY_BROKER_URL更改为settings.py

settings.py部分

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

docker-compose.yml part

version: '2'
services:
  web:
    container_name: django-container
    *******
    other options
    *******

    depends_on:
      - cache
      - db

  cache:
    container_name: redis-container
    restart: always
    image: redis:latest

答案 1 :(得分:2)

Django是否在一个链接到Redis容器的单独容器中运行?如果是这样,你应该有一些带有Ip和端口的环境变量,Django应该使用它来连接到Redis容器。将BROKER_URL设置为使用redis Ip和port env vars,您应该开展业务。同上RESULT_BACKEND。

env vars的参考文档位于:Docker Compose docs

以下是我们如何在OfferUp的某个项目中使用自动添加的env变量的示例代码:

BROKER_TRANSPORT = "redis"
_REDIS_LOCATION = 'redis://{}:{}'.format(os.environ.get("REDIS_PORT_6379_TCP_ADDR"), os.environ.get("REDIS_PORT_6379_TCP_PORT"))
BROKER_URL = _REDIS_LOCATION + "/0"
CELERY_RESULT_BACKEND = _REDIS_LOCATION + "/1"