Docker Compose部署的Django无法连接本地PostgreSQL,求排查
Django容器连接本地PostgreSQL失败排查方案
问题描述
通过Docker Compose部署Django应用后,无法访问本地主机的PostgreSQL数据库,已执行以下操作:
- 在
pg_hba.conf中添加规则:host all all 172.17.0.1/16 md5 - 在
postgresql.conf中将listen_addresses修改为* - Django的
db_host设置为host.docker.internal - docker-compose.yml的web服务配置了extra_hosts:
services: web: extra_hosts: - "host.docker.internal:host-gateway" - 执行
sudo systemctl restart postgresql重启服务
但仍收到连接超时错误:
could not connect to server: Connection timed out
Is the server running on host "host.docker.internal" (172.17.0.1) and accepting
TCP/IP connections on port 5432?
排查与解决步骤
1. 确认PostgreSQL是否正确监听全网段
执行以下命令检查端口监听状态:
ss -tulpn | grep 5432
如果输出只有127.0.0.1:5432,说明postgresql.conf的修改未生效:
- 确认修改的是PostgreSQL实际使用的配置文件(比如Ubuntu路径为
/etc/postgresql/[版本号]/main/postgresql.conf) - 重启PostgreSQL后再次验证监听状态
2. 检查本地防火墙规则
本地主机的防火墙可能拦截了容器的连接请求,针对Docker网段开放5432端口:
- Ubuntu/Debian(ufw):
sudo ufw allow from 172.17.0.0/16 to any port 5432 sudo ufw reload - CentOS/RHEL(firewalld):
sudo firewall-cmd --add-rich-rule='rule family="ipv4" source address="172.17.0.0/16" port port="5432" protocol="tcp" accept' --permanent sudo firewall-cmd --reload
3. 验证pg_hba.conf规则顺序
pg_hba.conf的规则是从上到下匹配,确保添加的172.17.0.1/16规则在更严格的规则(比如仅允许127.0.0.1)之前。
另外,若自定义了Docker网络,需先通过docker network inspect bridge查看实际子网段,再调整pg_hba.conf的对应规则。
4. 在容器内直接测试连接
进入Django容器,用psql直接测试连接,定位具体错误:
# 进入容器 docker exec -it [你的web容器名称] bash # 安装psql(若容器内未安装) apt update && apt install -y postgresql-client # 测试连接 psql -h host.docker.internal -U [数据库用户名] -d [数据库名]
- 若提示认证失败:检查pg_hba.conf规则或数据库密码
- 若仍超时:重点排查防火墙或PostgreSQL监听配置
5. 确认Docker版本支持(Linux环境)
host.docker.internal在Linux环境需要Docker 20.10及以上版本,执行docker --version确认版本,若版本过低需升级Docker。
内容的提问来源于stack exchange,提问作者mohamed naser
相关产品推荐
相关产品推荐

