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的主要内容,如果未能解决你的问题,请参考以下文章

Django 不会连接到 Redis Docker 容器

Spring Boot 应用程序无法连接到 Docker 中的 Redis 副本

无法从 docker 容器内的 Spring Boot 连接到 Redis

无法从外部 docker 连接到 dockerized redis 实例

Docker 容器无法连接到 Redis

无法连接到 docker redis