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

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

 docker exec -it <redis_container_name> redis-cli ping 

看到回应是PONG

这是我的settings.py中的芹菜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 ,所以它似乎并不需要使用虚拟机的IP而不是我的settings.py localhost

编辑2 :如果我用置换docker-machine虚拟机的IP地址或Redis容器的IP地址的设置replacelocalhost ,那么会发生什么是我真的很快在我的网站上得到一个错误的成功消息,当我上传文件,但实际上没有上传。 底层上传函数insertIntoDatabase()使用delay

Django是否运行在与Redis容器相链接的独立容器中? 如果是这样,你应该有一些环境variables与Django应该用来连接到Redis容器的Ip和端口。 设置BROKER_URL使用redis IP和端口环境variables,你应该做生意。 同上RESULT_BACKEND。

env vars的参考文档在这里: Docker Compose文档

以下是我们如何在OfferUp的一个项目中使用自动添加的envvariables的一些示例代码:

 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" 

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

settings.py部分

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

docker-compose.yml部分

 version: '2' services: web: container_name: django-container ******* other options ******* depends_on: - cache - db cache: container_name: redis-container restart: always image: redis:latest