Docker запустить image_celery не удалось обнаружить перенаправления - PullRequest
0 голосов
/ 08 февраля 2020

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

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

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

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

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

version: '3'
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))

настройки .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 Ответ

1 голос
/ 08 февраля 2020

Ожидается, потому что, когда вы запускаете контейнер, как вы (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 
...