Docker部署Django项目时遭遇django.db.utils.OperationalError数据库连接问题求助
嘿,我之前也碰到过几乎一模一样的问题!别着急,咱们一步步排查:
检查Docker网络是否一致
首先得确保你的Django容器和数据库容器(命名为db的那个)在同一个Docker网络里。如果是用docker-compose管理的,默认会自动创建一个专属网络,但要是你手动启动容器的话,得手动指定同一个网络。
你可以用docker network ls查看现有网络,再用docker inspect <你的Django容器名称>和docker inspect <db容器名称>对比两者的网络配置,确认它们属于同一网络。核对Django数据库配置
打开你的Django项目的settings.py,检查DATABASES里的HOST字段是不是严格写的'db'——这个名称必须和你Docker配置里的数据库服务名完全一致!千万别写成localhost或者127.0.0.1,因为容器内部的localhost指向的是容器自身,不是宿主机或者数据库容器。
举个正确的配置例子:DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', # 换成你实际用的数据库引擎,比如mysql 'NAME': 'your_database_name', 'USER': 'your_db_user', 'PASSWORD': 'your_db_password', 'HOST': 'db', 'PORT': '5432', # 对应数据库的默认端口,mysql是3306 } }确保容器启动顺序合理
有时候Django容器会比数据库容器先启动完成,这时候数据库还没就绪,就会出现主机名解析失败的问题。你可以在docker-compose.yml里给Django服务添加依赖和健康检查,确保数据库完全就绪后再启动Django:services: db: image: postgres:15 # 换成你用的数据库镜像 healthcheck: test: ["CMD-SHELL", "pg_isready -U your_db_user -d your_database_name"] interval: 5s timeout: 5s retries: 5 web: build: . command: python manage.py runserver 0.0.0.0:8000 depends_on: db: condition: service_healthy尝试重置Docker网络缓存
如果上面的方法都没解决问题,可能是Docker的DNS缓存出了小问题。试试重启Docker服务:Linux上用sudo systemctl restart docker,Windows或macOS直接重启Docker Desktop就行。
也可以彻底清理旧的容器和网络,重新构建:docker-compose down -v,然后再执行docker-compose up --build。
要是这些方法都试过还不行,可以把你的docker-compose.yml和settings.py的关键配置(记得隐藏密码等敏感信息)发出来,我再帮你排查细节!
备注:内容来源于stack exchange,提问作者Faizan

