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

切换PostgreSQL后Django+Docker遇连接重置及超时问题求助

Django+PostgreSQL Docker连接问题排查与解决

问题现象

  • 执行curl 127.0.0.1:8000返回curl: (56) Recv failure: Connection reset by peer
  • Docker日志显示Django无法连接PostgreSQL,报错:connection to server at "db" (172.19.0.2), port 5432 failed: Connection timed out
  • 执行数据库查询Book.objects.all()无响应,退出后再次出现连接重置错误

当前配置文件

Django settings.py 数据库配置

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'postgres',
        'USER': 'postgres',
        'PASSWORD': 'postgres',
        'HOST': 'db',
        'PORT': 5432,
    }
 }

Dockerfile

FROM python:3.10.4-slim-bullseye

ENV PIP_DISABLE_PIP_VERSION_CHECK 1
ENV PYTHONDONTWRITEBYTECDE 1
ENV PYTHONUNBEFFERED 1

WORKDIR /code

COPY ./requirements.txt .
EXPOSE 8000
EXPOSE 5432
RUN pip install -r requirements.txt
RUN apt-get update && apt-get -y install --no-install-recommends postgresql inetutils-ping
COPY . .

docker-compose.yml

version: "3.9"

services:
  web:
    build: .
    command: python /code/manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - 8001:8000
    extra_hosts:
      - "host.docker.internal:host-gateway"
    depends_on:
      db:
        condition: service_healthy
    environment:
      - "DJANGO_SECRET_KEY=django-insecure-9)blabla&zwcao=10k^^g!8u%^&dnr07&t0p&-i005xt7gocns"
      - "DEFAULT_FROM_EMAIL=my@gmail.com"
      - "EMAIL_HOST=smtp.gmail.com"
      - "EMAIL_PORT=465"
      - "EMAIL_USE_SSL=True"
      - "EMAIL_HOST_USER=my@gmail.com"
      - "EMAIL_HOST_PASSWORD=passwd"
      - "DJANGO_DEBUG=True"
  db:
    image: postgres:13
    healthcheck:
      test: [ "CMD-SHELL", "pg_isready -U postgres -d postgres" ]
      interval: 10s
      timeout: 10s
      retries: 5
      start_period: 30s
    ports:
      - 5432:5432
    volumes:
      - postgres_data:/var/lib/postgresql/data/
    environment:
      - "POSTGRES_HOST_AUTH_METHOD=trust"

volumes:
  postgres_data:

排查与解决步骤

  1. 数据库认证配置不匹配
    你的DATABASES配置里设置了PASSWORD: 'postgres',但PostgreSQL容器用的是POSTGRES_HOST_AUTH_METHOD=trust(跳过密码验证),两者冲突导致连接失败。

    • 方案1:在db服务的环境变量中添加POSTGRES_PASSWORD=postgres,让PostgreSQL启用密码验证,与Django配置匹配
    • 方案2:删除DATABASES配置中的PASSWORD字段,适配trust认证方式
  2. 清理Dockerfile冗余依赖
    Django容器不需要安装PostgreSQL服务器端包,这会占用资源且可能引发冲突,修改Dockerfile中的安装命令:

    RUN apt-get update && apt-get -y install --no-install-recommends inetutils-ping && rm -rf /var/lib/apt/lists/*
    

    仅保留inetutils-ping用于连通性测试,同时清理apt缓存减小镜像体积

  3. 检查PostgreSQL依赖
    切换到PostgreSQL需要安装适配的驱动,确保requirements.txt中包含:

    psycopg2-binary>=2.9.0
    

    然后重新构建镜像:

    docker-compose build web
    
  4. 验证容器网络连通性
    进入web容器测试与db服务的连通性:

    docker-compose exec web ping db
    docker-compose exec web telnet db 5432
    

    如果telnet不通,查看db容器日志确认PostgreSQL是否正常启动:

    docker-compose logs db
    
  5. 清理旧数据卷
    旧的postgres_data卷可能存在配置残留,清理后重新启动:

    docker-compose down -v
    docker-compose up --build
    

验证步骤

修改配置后执行以下操作确认修复:

  • 启动容器:docker-compose up --build
  • 执行数据库迁移:docker-compose exec web python manage.py migrate
  • 访问http://127.0.0.1:8001(注意端口映射为8001→8000),或执行curl 127.0.0.1:8001
  • 进入Django shell测试查询:docker-compose exec web python manage.py shell,执行from yourapp.models import Book; Book.objects.all()

内容的提问来源于stack exchange,提问作者xralf

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 01:40:01