Django docker container не смог подключиться к серверу redis на порту 6379
У меня есть контейнер redis, работающий на порту 6379, но мое приложение django не может подключиться к этому порту.
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f62c020fec99 sp_ask_dashboard_celery_worker "sh -c 'cd sp_dashbo…" 39 minutes ago Up 39 minutes sp_ask_admin_dashboard-master_celery_worker_1
60089763fd3f ask_webapp "sh -c 'python sp_da…" 39 minutes ago Up 39 minutes 0.0.0.0:8000->8000/tcp, :::8000->8000/tcp ask_dashboard_web
62cde1811827 postgres:14.0-alpine "docker-entrypoint.s…" 39 minutes ago Up 39 minutes 5432/tcp sp_ask_admin_dashboard-master_db_1
24adadf28ba2 redis:6-alpine "docker-entrypoint.s…" 39 minutes ago Up 39 minutes 6379/tcp sp_ask_admin_dashboard-master_redis_1
Когда я вхожу в свой контейнер webapp (ask_webapp). Я попробовал следующее решение, чтобы выяснить, могу ли я подключиться к Redis через "python manage.py shell" внутри моего контейнера. И я получаю эту ошибку:
"OperationalError: Ошибка -3 при подключении к redis:6379. Временный сбой при разрешении имен."
".Мой settings.py включает:
CELERY_BROKER_URL = "redis://redis:6379/0"
CELERY_RESULT_BACKEND = "redis://redis:6379/0"
Эта информация также находится в файле .env.dev
Мой docker-compose.yml выглядит следующим образом:
celery_worker:
build:
context: .
dockerfile: ./sp_dashboard/DockerfileBuild
image: sp_ask_dashboard_celery_worker
command: >
sh -c "cd sp_dashboard ; celery -A settings worker -l INFO"
volumes:
- .:/usr/src/app/
env_file:
- ./.env.dev
environment:
- POSTGRES_USER=hello_django
- POSTGRES_PASSWORD=hello_django
- POSTGRES_DB=hello_django_dev
- "POSTGRES_HOST_AUTH_METHOD=trust"
depends_on:
- redis
- db
- web
Ваш контейнер redis в docker-compose.yml отсутствует djangonetwork
он должен выглядеть примерно так. Вы должны применить ту же логику к Celery worker, если ему нужно подключиться к redis.
redis:
image: redis:6-alpine
networks:
- djangonetwork
Пояснение: Внутренний DNS docker работает только в сетях, определенных пользователем. Вы не можете вызвать другой контейнер в другой сети, определенной пользователем, через Name.