【问题标题】:Django +docker-compose + Celery + redis - How to use Redis deployed in my own remote server?Django +docker-compose + Celery + redis - 如何使用部署在我自己的远程服务器中的 Redis?
【发布时间】:2022-01-07 12:52:04
【问题描述】:

我有一个部署在 Docker 容器中的 Django 应用程序。

我有 3 个配置环境:dev、preprod 和 prod。 dev 是我的本地环境(localhost),preprod/prod 是远程 linux 环境。 它在使用“公共”Redis 服务器和标准配置时有效。

但我需要使用我们自己的 Redis 部署在远程服务器 (192.168.xx.xx) 中的 Docker 容器中,名称为 container redis_cont。

而且我真的不知道如何配置。不知道有没有可能? 我将不胜感激。

docker-compose

version: '3.7'

services:
    web:
        restart: always
        build: 
            context: ./app
            dockerfile: Dockerfile.dev
        restart: always
        command: python manage.py runserver 0.0.0.0:8000
        volumes:
            - ./app:/usr/src/app
        ports:
            - 8000:8000
        env_file:
            - ./.env.dev
        entrypoint: [ "/usr/src/app/entrypoint.dev.sh" ]
        depends_on: 
            - redis
        healthcheck:
            test: ["CMD", "curl", "-f", "http://localhost:8000/"]
            interval: 30s
            timeout: 10s
            retries: 50
    redis:
        container_name: redis_cont          <= container running in remote linux server
        image: "redis:alpine"
    celery:
        build: 
            context: ./app
            dockerfile: Dockerfile.dev
        command: celery -A core worker -l info
        volumes:
            - ./app:/usr/src/app
        env_file:
            - ./.env.dev
        depends_on:
            - web
            - redis
    celery-beat:
        build: 
            context: ./app
            dockerfile: Dockerfile.dev
        command: celery -A core beat -l info
        volumes:
            - ./app:/usr/src/app
        env_file:
            - ./.env.dev
        depends_on:
            - web
            - redis

settings.py

CELERY_BROKER_URL = 'redis://redis:6379'
CELERY_RESULT_BACKEND = 'redis://redis:6379'
CELERY_ACCEPT_CONTENT = ['application/json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_BEAT_SCHEDULE = {
    'hello': {
        'task': 'project.tasks.hello',
        'schedule': crontab()  # execute every minute
    },
}

【问题讨论】:

    标签: django docker redis django-celery


    【解决方案1】:

    由于容器不是通过同一个docker-compose 创建的,它们不会共享同一个网络。 redis_cont 只是在您的 docker-compose 的隔离网络中构建的服务不存在。

    如果 Redis 容器在远程发布并且可以使用ip:port 访问,您应该可以直接在您的settings.py 中使用它。无需在您的撰写文件中添加新服务。


    注意

    要在同一个docker-compose 中的服务之间建立通信,您应该使用服务 名称(在您的情况下为webcelery-beat 等),而不是容器名称。 p>

    【讨论】:

    • 为您解答。现在可以了。为什么要添加此注释?
    • 我很高兴它有效。该注释与问题无关。只是说即使所有容器都是通过相同的docker-compose.yml 构建的,您也不能使用 container name (正如您在问题“with name container redis_cont”中提到的那样)在它们之间建立通信.它应该是一个服务名称。
    猜你喜欢
    • 1970-01-01
    • 2020-04-29
    • 2021-03-13
    • 1970-01-01
    • 2013-05-08
    • 1970-01-01
    • 2017-01-25
    • 2019-07-26
    • 1970-01-01
    相关资源
    最近更新 更多