从Django连接Docker化PostgreSQL数据库超时问题求助
解决思路
1. 配置Docker容器端口映射
你的docker-compose.yml未将PostgreSQL容器的5432端口映射到宿主机,导致宿主机上的Django无法访问容器内的数据库。修改配置如下:
db: image: postgres:13-alpine volumes: - dev-db-data:/var/lib/postgresql/data environment: - POSTGRES_DB=devdb - POSTGRES_USER=devuser - POSTGRES_PASSWORD=pass123 ports: - "5432:5432" # 新增端口映射,绑定容器端口到宿主机对应端口
修改后重启容器:docker-compose down && docker-compose up -d
2. 允许PostgreSQL接受远程连接
默认PostgreSQL仅允许本地访问,需调整配置开放远程连接:
- 开发环境临时方案:在docker-compose的environment中添加
POSTGRES_HOST_AUTH_METHOD=trust(仅开发用,生产环境禁用):
environment: - POSTGRES_DB=devdb - POSTGRES_USER=devuser - POSTGRES_PASSWORD=pass123 - POSTGRES_HOST_AUTH_METHOD=trust
- 生产级正规方案:
- 创建自定义
pg_hba.conf文件,添加允许远程连接的规则:host all all 0.0.0.0/0 md5 - 在docker-compose的volumes中挂载该文件到容器内的
/var/lib/postgresql/data/pg_hba.conf,确保PostgreSQL启动时加载该配置。同时确认postgresql.conf中listen_addresses = '*'(部分postgres镜像默认已设置,若未设置可挂载自定义配置文件)。
- 创建自定义
3. 调整Django数据库配置
将settings.py中的数据库HOST改为localhost(依赖端口映射,无需使用容器内部IP):
'default': { 'ENGINE': 'django.db.backends.postgresql', 'HOST': 'localhost', 'PORT': '5432', 'NAME': 'devdb', 'USER': 'devuser', 'PASSWORD': 'pass123', }
4. 验证连接有效性
先用宿主机的psql测试数据库连通性:psql -h localhost -p 5432 -U devuser devdb,输入密码后若能正常进入数据库,说明配置没问题,再重启Django服务测试连接。
内容的提问来源于stack exchange,提问作者HodA
相关产品推荐
相关产品推荐

