Docker Compose部署Django无法连接PostgreSQL数据库问题
问题根因
报错日志已经定位到核心错误:web容器尝试连接127.0.0.1:5432的PostgreSQL服务,必然会失败。
Docker Compose默认会为所有服务创建单独的桥接网络,每个容器拥有独立的网络命名空间,容器内的127.0.0.1/localhost只会指向容器自身,不会指向同网络下的其他容器。当前Django配置里的数据库地址填了回环地址,请求根本到不了db容器。
修复步骤
- 修改Django数据库连接配置
打开Django项目的settings.py,找到DATABASES配置段,将HOST参数的值从127.0.0.1/localhost改为db。Docker Compose内置DNS解析,会自动把服务名db解析为PostgreSQL容器的内部IP,数据库端口保持默认5432即可,无需修改。
正确配置参考:DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', 'NAME': 'more_energy_db', 'USER': 'dmitriy', 'PASSWORD': '你的.env文件中配置的PostgreSQL密码', 'HOST': 'db', 'PORT': '5432', } } - 补充服务就绪等待逻辑(可选但推荐)
现有配置里的depends_on字段只会控制容器启动顺序,不会等待PostgreSQL服务真正完成初始化。如果db容器刚启动、数据库还没准备好接收连接时web就发起请求,依然会报连接错误。
首先修改Dockerfile,在apk安装依赖的步骤里加入netcat工具用于端口检测:
再修改RUN apk update \ && apk add postgresql-dev gcc python3-dev musl-dev netcat-openbsddocker-compose.yml里web服务的启动命令,加端口检测循环,等数据库端口通了再启动Django服务,顺便可以自动执行迁移:command: > sh -c "while ! nc -z db 5432; do sleep 1; done && python MoreEnergy/manage.py migrate && python MoreEnergy/manage.py runserver 0.0.0.0:8000" - 重启服务生效
所有配置修改完成后,在项目根目录执行以下命令重建并启动服务:docker compose down docker compose up --build
连通性验证
服务启动后可以直接进入web容器测试数据库连通性,执行命令:
docker compose exec web sh nc -z db 5432 && echo "数据库连接正常"
如果输出“数据库连接正常”,说明容器间网络通了,Django服务可以正常访问数据库。
内容的提问来源于stack exchange,提问作者Dmitriy Lunev
相关产品推荐
相关产品推荐

