You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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'
错误原因分析
  1. 连接目标不匹配:错误中的localhost:49157/49153是Docker随机映射端口,但配置里Redis固定映射6379:6379,说明代码中存在硬编码或未正确读取配置的Redis连接逻辑,导致尝试连接本地随机端口而非容器网络内的Redis服务。
  2. Redis服务未就绪:depends_on仅保证Redis容器先启动,不保证服务完全初始化,Django启动时Redis可能还未就绪,引发连接失败。
  3. 密码配置冲突: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工具:
    1. 在Dockerfile中安装工具:
    RUN apt-get update && apt-get install -y wait-for-it
    
    1. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 03:16:06