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),确保:
(如果只想允许特定IP访问,可替换为你的Docker宿主机IP或容器网段)listen_addresses = '*' - 编辑
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
相关产品推荐
相关产品推荐

