Django +docker-compose + Celery + redis - Как использовать Redis, развернутый на моем собственном удаленном сервере?

У меня есть приложение Django, развернутое в контейнерах Docker.

У меня есть 3 окружения: dev, preprod и prod. dev - это мое локальное окружение (localhost), а preprod/prod - это удаленные окружения linux. Все работает при использовании "публичного" сервера Redis и стандартного конфига.

Но мне нужно использовать наш собственный Redis, развернутый в контейнере Docker на удаленном сервере (192.168.xx.xx) с именем 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
    },
}

Поскольку контейнеры не создаются через один и тот же docker-compose, они не будут использовать одну и ту же сеть. redis_cont просто не существует для сервисов, созданных в изолированной сети вашей docker-compose.

Если контейнер Redis опубликован на удаленном сервере и доступен с помощью ip:port, вы должны иметь возможность использовать его непосредственно в вашем settings.py. Нет необходимости добавлять новый сервис в ваш compose файл.


Примечание

Для установления связи между сервисами в одном docker-compose необходимо использовать имя сервиса (web, celery-beat и т.д. в вашем случае), а не имя контейнера.

Вернуться на верх