切换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:
排查与解决步骤
数据库认证配置不匹配
你的DATABASES配置里设置了PASSWORD: 'postgres',但PostgreSQL容器用的是POSTGRES_HOST_AUTH_METHOD=trust(跳过密码验证),两者冲突导致连接失败。- 方案1:在db服务的环境变量中添加
POSTGRES_PASSWORD=postgres,让PostgreSQL启用密码验证,与Django配置匹配 - 方案2:删除DATABASES配置中的
PASSWORD字段,适配trust认证方式
- 方案1:在db服务的环境变量中添加
清理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缓存减小镜像体积检查PostgreSQL依赖
切换到PostgreSQL需要安装适配的驱动,确保requirements.txt中包含:psycopg2-binary>=2.9.0然后重新构建镜像:
docker-compose build web验证容器网络连通性
进入web容器测试与db服务的连通性:docker-compose exec web ping db docker-compose exec web telnet db 5432如果telnet不通,查看db容器日志确认PostgreSQL是否正常启动:
docker-compose logs db清理旧数据卷
旧的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
相关产品推荐
相关产品推荐

