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

Docker部署Django+PostgreSQL连接失败:连接拒绝问题排查

Django + Docker 容器连接PostgreSQL拒绝问题排查与修复

你通过Docker部署Django与PostgreSQL容器组合时,PostgreSQL日志显示已正常启动监听5432端口,但Django侧出现连接拒绝错误:

django.db.utils.OperationalError: connection to server at "127.0.0.1", port 5432 failed: Connection refused
        Is the server running on that host and accepting TCP/IP connections?

核心错误原因

在Docker Compose的默认网络环境中,每个容器都是独立的网络节点。127.0.0.1在web容器内指向容器自身,而非db容器,这是导致连接被拒绝的根本原因。

具体修复步骤

1. 修正.env文件的数据库主机配置

将.env文件中的POSTGRES_HOST=127.0.0.1修改为POSTGRES_HOST=db——Docker Compose会自动为每个service分配对应的主机名,db服务的主机名就是db。

修正后的.env文件:

POSTGRES_DB=my_db
POSTGRES_USER=my_admin
POSTGRES_PASSWORD=my_api
POSTGRES_HOST=db
POSTGRES_PORT=5432

2. 确认Django配置读取环境变量

确保Django项目settings.py中的数据库配置正确读取环境变量,示例配置如下:

import os

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': os.getenv('POSTGRES_DB'),
        'USER': os.getenv('POSTGRES_USER'),
        'PASSWORD': os.getenv('POSTGRES_PASSWORD'),
        'HOST': os.getenv('POSTGRES_HOST'),
        'PORT': os.getenv('POSTGRES_PORT'),
    }
}

3. 补充说明:depends_on的局限性

虽然你配置了depends_on: - db,但该选项仅保证web容器在db容器之后启动,不确保PostgreSQL服务已完全就绪。如果遇到db服务未初始化完成web就尝试连接的情况,可以添加健康检查或使用wait-for-it脚本辅助,但修改主机名已能解决当前的连接拒绝问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 14:55:27