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

Docker部署的Django应用无法连接PostgreSQL服务器求助

解决Docker Django应用连接PostgreSQL被拒绝的问题

针对你遇到的django.db.utils.OperationalError: connection to server at "158.160.17.21", port 5432 failed: Connection refused错误,按以下步骤排查解决:

1. 验证基础网络连通性

先确认你的环境(Docker容器或宿主机)能访问目标PostgreSQL服务器:

  • 在宿主机执行:telnet 158.160.17.21 5432 或 nc -zv 158.160.17.21 5432
  • 如果是Docker容器内,先进入容器:docker exec -it <你的容器ID/名称> bash,再执行上述命令
    如果命令返回连接失败,说明网络层面存在阻断,优先处理网络问题。

2. 检查PostgreSQL服务器的TCP/IP配置

登录到158.160.17.21服务器,修改PostgreSQL配置:

  • 编辑postgresql.conf(通常路径是/var/lib/postgresql/<版本>/main/postgresql.conf或/etc/postgresql/<版本>/main/postgresql.conf),确保:
    listen_addresses = '*'
    
    (如果只想允许特定IP访问,可替换为你的Docker宿主机IP或容器网段)
  • 编辑pg_hba.conf,添加允许访问的规则:
    # 允许Docker默认桥接网段访问(示例,根据实际网段调整)
    host    all             all             172.17.0.0/16            md5
    # 或者允许宿主机IP访问
    host    all             all             <你的宿主机公网/内网IP>            md5
    
  • 重启PostgreSQL服务:sudo systemctl restart postgresql

3. 检查防火墙与安全组

  • PostgreSQL服务器端:确保防火墙(ufw/iptables)或云服务商安全组开放了5432端口,允许你的Docker宿主机IP或容器网段访问。例如用ufw开放端口:sudo ufw allow from <你的IP/网段> to any port 5432
  • 本地宿主机:检查是否有防火墙规则禁止出站到5432端口(概率较低,但可排查)

4. 排查Docker容器网络配置

  • 测试容器能否访问外部网络:在容器内执行ping 158.160.17.21,如果ping不通,检查容器网络模式:
    • 若使用默认桥接模式,确认Docker的DNS配置正常;
    • 可临时切换为host网络模式测试:docker run --network host <你的镜像>,再尝试启动Django服务,看是否能连接数据库。

5. 确认Django数据库配置

检查项目的settings.py中数据库配置是否正确:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': '你的数据库名称',
        'USER': '数据库用户名',
        'PASSWORD': '数据库密码',
        'HOST': '158.160.17.21',
        'PORT': '5432',
    }
}

确保HOST、PORT无误,且对应的数据库用户有远程访问权限。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 21:45:37