【问题标题】:Docker run image_celery not able to detect redisDocker 运行 image_celery 无法检测到 redis
【发布时间】:2020-05-24 14:24:34
【问题描述】:

我有一个 django 应用程序,我想使用 docker run 命令运行 rediscelery

在我使用 docker-compose 文件构建图像之后 我在不同的 windows powershell 上运行两个命令

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

我的 celery powershell 无法检测到 redis

[2020-02-08 13:08:44,686: ERROR/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

芹菜.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'

【问题讨论】:

  • 如果使用docker-compose up 启动容器,效果会更好吗?有一些 networking setup that Compose will do for you 您的普通 docker run 命令无法复制。
  • 在 docker-compose up 的情况下它可以完美运行,但我想使用 docker-run 运行有什么办法吗?

标签: django powershell docker redis celery


【解决方案1】:

这是意料之中的,因为当您启动容器时(docker run IMAGE),容器使用 Docker 的默认桥接网络。
您可以通过检查该网络来检查它:docker network inspect bridge.
默认网桥不会像您那样接受按容器名称对容器进行网络解析 (redis)。
此外,容器的默认名称不是镜像名称,而是 docker 生成的名称。
这就是您在运行时收到该错误的原因:

无法连接到 redis://redis:6379/1

请注意,您仍然可以通过其 ip 地址引用属于默认网桥的容器,但这通常是不可取的,因为这是从客户端对它们进行硬编码。

That works with Docker compose because

默认情况下,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 

【讨论】:

  • (您可能还想明确指定容器的--name。)
  • @David Maze 当然。感谢您的记住:)
猜你喜欢
  • 2017-10-04
  • 1970-01-01
  • 1970-01-01
  • 2018-07-12
  • 2011-05-27
  • 2022-11-30
  • 1970-01-01
  • 2022-01-07
  • 2023-02-10
相关资源
最近更新 更多