Django Docker run image_芹菜无法检测redis

Django Docker run image_芹菜无法检测redis,django,powershell,docker,redis,celery,Django,Powershell,Docker,Redis,Celery,我有一个django应用程序,我想使用docker run命令运行redis和芹菜 在我使用docker compose文件构建图像之后 我在不同的windows powershell上运行了两个命令 docker run-it-p 6379:6379 redis docker run-it image_芹菜 我的芹菜powershell无法检测到redis [2020-02-08 13:08:44686:错误/主进程]使用者:无法连接到redis://redis:6379/1: 错误-2连接到

我有一个django应用程序,我想使用docker run命令运行redis和芹菜

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

docker run-it-p 6379:6379 redis docker run-it image_芹菜 我的芹菜powershell无法检测到redis

[2020-02-08 13:08:44686:错误/主进程]使用者:无法连接到redis://redis:6379/1: 错误-2连接到redis:6379。名称或服务未知。。 在2.00秒后重试

Dockerfile_芹菜

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

芹菜

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'

这是预期的,因为当您像docker run IMAGE一样启动容器时,容器使用docker的默认桥接网络。 您可以通过检查该网络进行检查:docker network inspect bridge。 默认网桥不接受按容器名称对容器进行的网络解析,就像您使用redis一样。 此外,容器的默认名称不是图像名称,而是docker生成的名称。 这就是为什么在运行时会出现该错误:

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

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

:

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

如果使用docker compose up启动容器,它是否工作得更好?有一些是普通docker运行命令无法复制的。在docker compose的情况下,它工作得很好,但我想使用docker运行。有什么办法吗?您可能还想显式指定容器“-name”。@David Maze当然。感谢您的支持,请记住:
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