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

如何将本地Docker中Django项目连接至GCP生产PostgreSQL服务器?

解决Docker容器中Django连接Google Cloud PostgreSQL超时问题

核心排查与修复步骤

1. 检查Google Cloud防火墙规则

Google Cloud默认拦截外部对5432端口的访问,这是最常见的根因:

  • 登录Google Cloud控制台,进入VPC网络 > 防火墙
  • 创建/修改规则:允许入站流量,目标选择你的Ubuntu服务器实例,协议端口指定tcp:5432,来源可临时设为0.0.0.0/0(生产环境建议限制为本地IP段)

2. 开放Ubuntu服务器本地防火墙

Ubuntu默认启用ufw,需手动开放5432端口:

# 查看ufw状态
sudo ufw status
# 开放5432端口
sudo ufw allow 5432/tcp
# 重启ufw生效
sudo ufw reload

3. 重启PostgreSQL服务

修改pg_hba.conf和postgresql.conf后必须重启服务才会生效:

# 重启PostgreSQL
sudo systemctl restart postgresql
# 确认服务运行状态
sudo systemctl status postgresql

4. 验证PostgreSQL端口监听状态

在Google Cloud的Ubuntu服务器上执行,确认服务在5432端口监听所有IP:

# 用netstat检查
sudo netstat -tulpn | grep 5432
# 或用ss命令
sudo ss -tulpn | grep 5432

正常输出应包含0.0.0.0:5432或:::5432,表示已开放全局监听。

5. 测试本地到服务器的端口连通性

在本地主机(非Docker容器内)测试网络连通性:

# telnet测试
telnet 34.159.XX.XX 5432
# 或nc测试
nc -zv 34.159.XX.XX 5432

如果本地主机连不通,说明是网络层面问题(Cloud防火墙或本地防火墙);如果本地能通,再排查Docker容器网络。

6. 检查Docker容器网络配置

若本地能连但容器内连不上:

  • 确认docker-compose使用的网络默认bridge模式(默认允许访问外部)
  • 进入容器内部测试连通性:
# 进入运行中的Django容器
docker exec -it <容器名称> bash
# 在容器内测试端口
telnet 34.159.XX.XX 5432

若容器内仍不通,可临时添加network_mode: host到docker-compose.yml(仅用于测试,生产不推荐),排除容器网络隔离问题。

7. 确认PostgreSQL用户访问权限

即使pg_hba.conf开放了全局访问,用户本身可能限制了登录来源:

-- 登录PostgreSQL执行
SELECT usename, host FROM pg_user;
-- 若用户host为localhost,修改为允许所有IP
ALTER USER <你的数据库用户名> HOST ALL;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 03:21:08