EC2上Django容器连接本地Ubuntu服务器PostgreSQL容器问题咨询
环境部署情况
- EC2实例上运行Django容器、PostgreSQL容器及Nginx代理
- 本地Ubuntu服务器上运行另一个PostgreSQL容器
- 需求:让Django容器连接本地Ubuntu上的PostgreSQL容器读取数据
配置信息
- Django已配置远程数据库参数
- 数据库配置代码(变量均在
.env文件中定义):
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', 'HOST': os.environ.get('DB_HOST'), 'NAME': os.environ.get('DB_NAME'), 'USER': os.environ.get('DB_USER'), 'PASSWORD': os.environ.get('DB_PASS') }, 'nlp_data': { 'ENGINE': 'django.db.backends.postgresql', 'HOST': os.environ.get('NLP_DB_HOST'), 'NAME': os.environ.get('NLP_DB_NAME'), 'USER': os.environ.get('NLP_DB_USER'), 'PASSWORD': os.environ.get('NLP_DB_PASS') } }
遇到的问题
- 本地Ubuntu服务器上的PostgreSQL容器,Django配置里的
NLP_DB_HOST应该填该服务器的公网IP吗? - 当前连接出现超时错误(推测Django容器无法访问本地数据库服务器),有没有高效的网络调试方法?
已尝试操作
- 已将
NLP_DB_HOST设为本地Ubuntu服务器的公网IP,但问题未解决,也未获得有效排查信息
解决方案与调试步骤
关于数据库主机地址的疑问
是的,NLP_DB_HOST需要填本地Ubuntu服务器的公网IP,但需满足两个前提:
- 本地Ubuntu服务器的公网IP可被EC2实例访问(无运营商NAT屏蔽、具备公网出口)
- 本地PostgreSQL容器的默认端口5432已映射到Ubuntu服务器的主机端口(启动容器时需添加
-p 5432:5432参数)
网络超时问题的调试步骤
按以下顺序逐步排查:
1. 从EC2实例主机测试连通性
跳过容器,直接在EC2实例系统上验证网络:
# 测试能否ping通本地Ubuntu公网IP ping <本地Ubuntu公网IP> # 测试能否访问PostgreSQL的5432端口 nc -zv <本地Ubuntu公网IP> 5432 # 无nc的话用telnet telnet <本地Ubuntu公网IP> 5432
若这一步失败,说明问题出在基础网络:
- 检查本地Ubuntu服务器的防火墙(ufw/iptables)是否开放5432端口,允许EC2实例IP访问
- 若为家用网络,需在路由器上配置端口转发,将5432端口指向Ubuntu服务器的内网IP
- 检查EC2实例的安全组是否允许出站访问5432端口
2. 在Django容器内部测试连通性
如果EC2主机能连通,进入Django容器内部再验证:
# 查找Django容器ID/名称 docker ps # 进入容器 docker exec -it <Django容器ID/名称> bash # 若容器无测试工具,先安装 apt update && apt install iputils-ping netcat-traditional # 执行连通测试 ping <本地Ubuntu公网IP> nc -zv <本地Ubuntu公网IP> 5432
若容器内无法连通,排查Docker网络配置:
- 确认Django容器使用默认bridge模式(或自定义网络允许出站)
- 检查Docker主机的iptables规则是否限制了容器出站流量
3. 检查PostgreSQL容器的访问权限
PostgreSQL默认仅允许本地访问,需修改配置:
- 修改
postgresql.conf,设置listen_addresses = '*'(允许所有IP访问) - 修改
pg_hba.conf,添加授权规则:
测试阶段可临时允许所有IP(生产环境禁用):host <NLP_DB_NAME> <NLP_DB_USER> <EC2实例公网IP>/32 scram-sha-256host <NLP_DB_NAME> <NLP_DB_USER> 0.0.0.0/0 scram-sha-256
修改后重启PostgreSQL容器:
docker restart <PostgreSQL容器ID/名称>
4. 验证Django环境变量
确保容器内.env变量正确加载:
# 进入Django容器后执行 echo $NLP_DB_HOST echo $NLP_DB_NAME echo $NLP_DB_USER
确认变量值与预期一致,排除环境变量未正确注入的问题
内容的提问来源于stack exchange,提问作者ddemaria
相关产品推荐
相关产品推荐

