2015-09-16 2 views
2

Я пытаюсь использовать Redis в качестве брокера для Celery для моего проекта Django, который использует Docker Compose. Я не могу понять, что именно я сделал неправильно, но, несмотря на то, что сообщения в консольном журнале сообщают мне, что Redis работает и принимает соединения (и действительно, когда я делаю docker ps, я вижу, что контейнер работает), Я все еще получаю сообщение об отказе в подключении. Я даже сделалRedis + Docker + Django - Ошибка 111 Connection Refused

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" 

Вот настройки контейнера Redis в моем docker-compose.yml:

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

Я вспомнил связать redis контейнер с моим web контейнера, а также , Я могу запустить сервер просто отлично, но я получаю сообщение об ошибке отказа, когда я пытаюсь загрузить что-либо на сайт. Что именно происходит неправильно?

EDIT: Я вспомнил использовать VBoxManage порт вперед таким образом, что я могу пойти в браузере и получить доступ к своему сайту на localhost:8000, так что это не похоже, мне нужно использовать IP ВМ вместо localhost для моего settings.py.

EDIT 2: Если я заменю localhost в настройках или с IP-адресом docker-machine VM или IP-адрес контейнера Redis, то, что происходит в том, что я очень быстро получить ложное сообщение успеха на моем сайте когда я загружаю файл, но потом ничего не загружается. Основная функция загрузки, insertIntoDatabase(), использует delay.

+1

Вы используете boot2docker?Если да, вы должны использовать команду boot2docker ip для получения IP-адреса VM-сервера докерера и использовать его вместо localhost. –

+0

^У меня была такая же проблема и была описана выше: мне пришлось использовать запись IP-адреса в/etc/hosts /, созданную докер-Compose. – erewok

+0

Вы пытались заменить 'localhost' на' redis' в файле settings.py, потому что у вас уже есть опция '--link', когда вы запускаете веб-контейнер. – BMW

ответ

2

Разве Django работает в отдельном контейнере, который связан с контейнером Redis? Если это так, у вас должны быть переменные среды с Ip и портом, которые Django должен использовать для подключения к контейнеру Redis. Установите BROKER_URL, чтобы использовать redis Ip и port env vars, и вы должны быть в бизнесе. То же для RESULT_BACKEND.

Ссылочные документы для окр Варс здесь: Docker Compose docs

Вот пример кода для того, как мы используем автоматически добавляется окр вары в одном из наших проектов в OfferUp:

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" 
+0

Если я правильно понял, то, что я сделал, это использовать 'docker inspect', чтобы найти IP-адрес контейнера Redis, а затем в моем' settings.py' я изменил localhost на этот IP-адрес. Что это создало для меня странную ошибку, где, если я загружу файл в свою базу данных, он сразу же скажет, что он был успешным, но ничего не загружается. Правильно ли я понял ваш комментарий? –

+0

Не совсем - когда вы связываете контейнеры докеров и запускаете их с помощью компоновки докеров, docker compoot автоматически вставляет переменные среды в каждый запущенный контейнер с ip, портом и протоколом, чтобы использовать для разговора с другими контейнерами. Затем вы можете использовать os.environ.get() в файле settings.py для загрузки соответствующих параметров. Здесь соответствующие справочные документы: https://docs.docker.com/compose/env/ –

+0

Я добавил в свой пример пример кода для того, как вы можете использовать docker для создания env vars, например, для настройки использования сельдерея связанный контейнер redis. –

2

Я только что был похож проблема в связи с обновлением сельдерея от 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' 

докер-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