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
и т.д. в вашем случае), а не имя контейнера.