Docker部署Django+Redis项目时出现无法分配请求地址错误
问题描述
部署Django+Redis+React容器化项目时,访问localhost:8000触发如下错误:
Error 99 connecting to localhost:49157. Cannot assign requested address.
也曾出现同类错误:Error 99 connecting to localhost:49153
相关配置文件
docker-compose.yml
version: "3.8" services: redis: restart: always image: redis:latest ports: - "6379:6379" pairprogramming_be: restart: always depends_on: - redis command: bash -c "python manage.py makemigrations && python manage.py migrate && python manage.py runserver 0.0.0.0:8000" env_file: - ./signup/.env - ./payments/.env - ./.env build: context: ./ dockerfile: Dockerfile ports: - "8000:8000" container_name: "pairprogramming_be" ...
.env文件
DEBUG=1 DJANGO_ALLOWED_HOSTS=0.0.0.0
Dockerfile
FROM python:3 ENV PYTHONUNBUFFERED 1 WORKDIR django-project/peerplatform COPY requirements.txt ./ RUN pip install --upgrade pip RUN pip install -r requirements.txt COPY . ./ EXPOSE 8000 CMD ["python", "./manage.py", "runserver", "0.0.0.0:8000", "--settings=signup.settings"]
settings.py相关配置
CACHES = { "default": { "BACKEND": "django_redis.cache.RedisCache", "LOCATION": "redis://redis:6379", # "TIMEOUT": 5 * 60, "OPTIONS": { "CLIENT_CLASS": "django_redis.client.DefaultClient" }, "KEY_PREFIX": "pairprogramming" } } ... CHANNEL_LAYERS = { "default": { "BACKEND": "channels_redis.core.RedisChannelLayer", "LOCATION": "redis://redis:6379", }, } ... REDIS_HOST = 'redis://redis:6379' REDIS_PORT = 6379 REDIS_PASSWORD = 'redispw'
错误原因分析
- 连接目标不匹配:错误中的
localhost:49157/49153是Docker随机映射端口,但配置里Redis固定映射6379:6379,说明代码中存在硬编码或未正确读取配置的Redis连接逻辑,导致尝试连接本地随机端口而非容器网络内的Redis服务。 - Redis服务未就绪:
depends_on仅保证Redis容器先启动,不保证服务完全初始化,Django启动时Redis可能还未就绪,引发连接失败。 - 密码配置冲突:settings.py设置了
REDIS_PASSWORD = 'redispw',但Redis容器未配置密码,认证失败可能被包装为地址连接错误。
解决办法
1. 修正代码中的Redis连接逻辑
- 全局搜索代码,排查是否有直接使用
localhost或随机端口连接Redis的硬编码,替换为读取settings.py中的REDIS_HOST和REDIS_PORT配置。 - 确认缓存、Channels等所有依赖Redis的模块,均使用统一配置的连接地址。
2. 对齐Redis密码配置
- 若不需要密码,删除settings.py中的
REDIS_PASSWORD = 'redispw';若需要密码,修改docker-compose.yml给Redis添加密码:
redis: restart: always image: redis:latest command: redis-server --requirepass redispw ports: - "6379:6379"
3. 等待Redis就绪后启动Django
- 在Django启动命令前添加等待逻辑,比如使用
wait-for-it工具:- 在Dockerfile中安装工具:
RUN apt-get update && apt-get install -y wait-for-it- 修改docker-compose.yml的command:
command: bash -c "wait-for-it redis:6379 -- python manage.py makemigrations && python manage.py migrate && python manage.py runserver 0.0.0.0:8000"
4. 验证容器网络连通性
- 进入Django容器,执行以下命令确认Redis连通性:
docker exec -it pairprogramming_be bash ping redis redis-cli -h redis ping
若redis-cli ping返回PONG,说明网络和服务正常;若提示认证错误,检查密码配置是否一致。
内容的提问来源于stack exchange,提问作者Emm
相关产品推荐
相关产品推荐

