Django无法连接到docker中的redis
Posted
技术标签:
【中文标题】Django无法连接到docker中的redis【英文标题】:Django cant connect to redis in docker 【发布时间】:2019-01-08 03:26:43 【问题描述】:对不起我的英语。我在 django 中有项目,在我的项目中我想使用 celery 来执行后台任务,现在我需要在 docker 中为这个库设置设置。这是我的 docker 文件:
FROM python:3
MAINTAINER Alex2
RUN apt-get update
# Install wkhtmltopdf
RUN curl -L#o wk.tar.xz https://downloads.wkhtmltopdf.org/0.12/0.12.4/wkhtmltox-0.12.4_linux-generic-amd64.tar.xz \
&& tar xf wk.tar.xz \
&& cp wkhtmltox/bin/wkhtmltopdf /usr/bin \
&& cp wkhtmltox/bin/wkhtmltoimage /usr/bin \
&& rm wk.tar.xz \
&& rm -r wkhtmltox
RUN apt-get install -y cron
# for celery
ENV APP_USER user
ENV APP_ROOT /src
RUN groupadd -r $APP_USER \
&& useradd -r -m \
--home-dir $APP_ROOT \
-s /usr/sbin/nologin \
-g $APP_USER $APP_USER
# create directory for application source code
RUN mkdir -p /usr/django/app
COPY requirements.txt /usr/django/app/
WORKDIR /usr/django/app
RUN pip install -r requirements.txt
这是我的docker-compose.dev
version: '2.0'
services:
web:
build: .
container_name: api_dev
image: img/api_dev
volumes:
- .:/usr/django/app/
- ./static:/static
expose:
- "8001"
env_file: env/dev.env
command: bash django_run.sh
nginx:
build: nginx
container_name: ng_dev
image: img/ng_dev
ports:
- "8001:8001"
volumes:
- ./nginx/dev_api.conf:/etc/nginx/conf.d/api.conf
- .:/usr/django/app/
- ./static:/static
depends_on:
- web
links:
- web:web
db:
image: postgres:latest
container_name: pq01
ports:
- "5432:5432"
redis:
image: redis:latest
container_name: rd01
command: redis-server
ports:
- "8004:8004"
celery:
build: .
container_name: cl01
command: celery worker --app=myapp.celery
volumes:
- .:/usr/django/app/
links:
- db
- redis
我有这个错误:
cl01 | User information: uid=0 euid=0 gid=0 egid=0
cl01 |
cl01 | uid=uid, euid=euid, gid=gid, egid=egid,
cl01 | [2018-07-31 16:40:00,207: ERROR/MainProcess] consumer: Cannot connect to redis://redis:8004/0: Error 111 connecting to redis:8004. Connection refused..
cl01 | Trying again in 2.00 seconds...
cl01 |
cl01 | [2018-07-31 16:40:02,211: ERROR/MainProcess] consumer: Cannot connect to redis://redis:8004/0: Error 111 connecting to redis:8004. Connection refused..
cl01 | Trying again in 4.00 seconds...
cl01 |
cl01 | [2018-07-31 16:40:06,217: ERROR/MainProcess] consumer: Cannot connect to redis://redis:8004/0: Error 111 connecting to redis:8004. Connection refused..
cl01 | Trying again in 6.00 seconds...
我不明白为什么它无法连接。我的设置文件项目
CELERY_BROKER_URL = 'redis://redis:8004/0'
CELERY_RESULT_BACKEND = 'redis://redis:8004/0'
一切看起来都不错,但也许在某些文件中我没有添加一些设置。请帮我解决这个问题
【问题讨论】:
你确定redis在8004端口上运行吗? @JerinPeterGeorge 在我的docker-compose.dev
我设置端口redis ports: - "8004:8004"
【参考方案1】:
我认为是端口映射导致问题,所以,将docker-compose.dev
文件中的redis
设置更改为(删除ports
选项)
redis:
image: redis:latest
container_name: rd01
command: redis-server
在你的settings.py
CELERY_BROKER_URL = 'redis://redis:6379/0'
CELERY_RESULT_BACKEND = 'redis://redis:6379/0'
除非您在本地环境中使用它们,否则您不必映射端口
【讨论】:
感谢您的回答。但是当我设置端口6379
我有错误ERROR: for redis Cannot start service redis: driver failed programming external connectivity on endpoint rd01 (0b881a6f5a52d4bc815eeeba532e9589689a1d13abacc2e19f327914f1d48582): Error starting userland proxy: listen tcp 0.0.0.0:6379: bind: address already in use
更新了端口映射...立即尝试
我有同样的错误[2018-07-31 17:43:02,630: ERROR/MainProcess] consumer: Cannot connect to redis://redis:6378/0: Error 111 connecting to redis:6378. Connection refused.. cl01 | Trying again in 2.00 seconds...
在此路径上,端口映射被忽略并使用内部端口。也就是说,除非您想从 Docker 空间外部访问 Redis,否则您不需要 ports:
块,而在 Docker 空间内您应该连接到 redis:6379
。以上是关于Django无法连接到docker中的redis的主要内容,如果未能解决你的问题,请参考以下文章
Spring Boot 应用程序无法连接到 Docker 中的 Redis 副本
无法从 docker 容器内的 Spring Boot 连接到 Redis