Docker запустил image_celery, не в состоянии обнаружить redis

У меня есть приложение Django, я хочу запустить redis и celery с помощью команды redis docker run

после того, как я создаю образы, используя файл docker-compose, я запускаю две команды на разных Windows PowerShell

  1. docker run -it -p 6379:6379 redis
  2. docker run -it image_celery

мой сельдерей PowerShell не в состоянии обнаружить редис

[2020-02-08 13: 08: 44,686: ОШИБКА / MainProcess] потребитель: не удается подключиться к redis: // redis: 6379/1: ошибка -2 при подключении к redis: 6379. Имя или служба неизвестна .. Повторная попытка через 2,00 секунды ...

version: Ɖ'
services:

  the-redis:
    image: redis:3.2.7-alpine
    ports:
      - "6379:6379"
    volumes:
      - ../data/redis:/data


  celery_5:
    build:
      context: ./mltrons_backend
      dockerfile: Dockerfile_celery
    volumes:
      - ./mltrons_backend:/code
      - /tmp:/code/static

    depends_on:
      - the-redis
    deploy:
      replicas: 4
      resources:
        limits:
          memory: 25g
      restart_policy:
        condition: on-failure

volumes:
  db_data:
    external: true

Dockerfile_celery

FROM python:3.6
ENV PYTHONUNBUFFERED 1


# Install Java
RUN apt-get -y update && 
    apt install -y openjdk-11-jdk && 
    apt-get install -y ant && 
    apt-get clean && 
    rm -rf /var/lib/apt/lists/ && 
    rm -rf /var/cache/oracle-jdk11-installer;

ENV JAVA_HOME /usr/lib/jvm/java-11-openjdk-amd64/

RUN mkdir /code
WORKDIR /code
ADD requirements.txt /code/
RUN pip install -r requirements.txt
ADD . /code
ENV REDIS_HOST=redis://the-redis
ENV REDIS_PORT=6379



RUN pip install --upgrade 'sentry-sdk==0.7.10'
ENTRYPOINT celery -A mlbot_webservices worker -c 10 -l info

EXPOSE 8102

celery.py

from __future__ import absolute_import, unicode_literals
import os
from celery import Celery
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'mlbot_webservices.settings')

app = Celery('mltrons_training')
app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()

@app.task(bind=True)
def debug_task(self):
    print('Request: {0!r}'.format(self.request))

settings.py

CELERY_BROKER_URL = 'redis://the-redis:6379/'
CELERY_RESULT_BACKEND = 'redis://the-redis:6379/'
CELERY_ACCEPT_CONTENT = ['application/json']
CELERY_RESULT_SERIALIZER = 'json'
CELERY_TASK_SERIALIZER = 'json'

Всего 1 ответ


Ожидается, потому что когда вы запускаете контейнер, как вы делаете (Docker docker run IMAGE ), контейнеры используют мостовую сеть по умолчанию Docker.
Вы можете проверить это, проверив эту сеть: docker network inspect bridge .
Мост по умолчанию не принимает сетевое разрешение контейнеров по имени контейнера, как вы ( redis ).
Кроме того, именем контейнера по умолчанию является не имя изображения, а имя, сгенерированное Docker.
Вот почему вы получаете эту ошибку во время выполнения:

Невозможно подключиться к redis: // redis: 6379/1

Обратите внимание, что вы по-прежнему можете ссылаться на контейнеры, принадлежащие мосту по умолчанию, по их IP-адресам, но это, как правило, нежелательно, поскольку это жестко кодирует их со стороны клиента.

Это работает с Docker compose, потому что :

По умолчанию Compose настраивает единую сеть для вашего приложения. Каждый контейнер для службы присоединяется к сети по умолчанию и доступен для других контейнеров в этой сети и может быть обнаружен ими с именем хоста, идентичным имени контейнера .

Чтобы иметь возможность общаться по имени контейнера с docker run , вам необходимо:
- добавить эти контейнеры в той же сети, но не по умолчанию, предоставленной Docker
- дать явное имя контейнеру, на который вы хотите сослаться (в то время как делать это для обоих контейнеров хорошо, чтобы контролировать / управлять им проще) другим.

Например, создайте пользовательскую мостовую сеть и добавьте контейнеры в нее при запуске:

docker network create -d bridge my-bridge-network
docker run -it -p 6379:6379 --network=my-bridge-network --name=redis redis
docker run -it --network=my-bridge-network --name=celery image_celery 

Есть идеи?

10000