Django项目连接MariaDB报错Unknown MySQL server host 'db' 如何解决?
问题描述
使用Django开发项目时,尝试从数据库生成DataFrame遇到以下错误:
(mysql.connector.errors.DatabaseError) 2005 (HY000): Unknown MySQL server host 'db' (8)
相关代码与配置信息如下:
views.py 代码
from sqlalchemy import create_engine, text def user_detail(req, id): engine = create_engine("mysql+mysqlconnector://user:mariadb@db:9051/mariadb") query = "SELECT * FROM LoanParcel" df = pd.read_sql_query(sql=text(query), con=engine.connect()) df = df.drop(["id", "date_add", "start_date", "description"], axis = 1) return render(req,'pages/user_detail.html')
docker-compose.yml 配置
version: '3.7' services: db: image: mariadb:10 command: --default-authentication-plugin=mysql_native_password restart: always environment: - MYSQL_ROOT_PASSWORD=mariadb - MYSQL_DATABASE=mariadb - MYSQL_USER=mariadb - MYSQL_PASSWORD=mariadb - MARIADB_ROOT_PASSWORD=mysecretpassword ports: - 9051:3306 volumes: - "mysqldata:/var/lib/mysql" web: build: . restart: always command: python manage.py runserver 0.0.0.0:8000 environment: - DATABASE_URL=mysql+mysqlconnector://user:mariadb@db:9051/mariadb ports: - "9052:8000" depends_on: - db volumes: mysqldata:
docker-compose ps 输出
NAME COMMAND SERVICE STATUS PORTS myproject-uborrowu-db-1 "docker-entrypoint.s…" db running 0.0.0.0:3306->3306/tcp myproject-uborrowu-web-1 "python manage.py ru…" web running 0.0.0.0:8000->8000/tcp
解决方案
错误核心是web容器无法正常访问db服务,结合配置细节,按以下步骤修复:
修正数据库连接参数
- 从docker-compose配置可知,db服务创建的数据库用户是
mariadb,而非代码中的user;容器间通信需使用数据库内部端口3306,而非映射到宿主机的9051。 - 修改views.py中的连接字符串:
engine = create_engine("mysql+mysqlconnector://mariadb:mariadb@db:3306/mariadb") - 同步修正web服务的环境变量:
- DATABASE_URL=mysql+mysqlconnector://mariadb:mariadb@db:3306/mariadb
- 从docker-compose配置可知,db服务创建的数据库用户是
确保容器在同一网络
Docker Compose默认会为项目创建专属网络,所有服务自动加入该网络。若之前手动修改过网络配置,执行以下命令检查容器网络归属:# 查看db容器网络信息 docker inspect myproject-uborrowu-db-1 | grep -A 10 "Networks" # 查看web容器网络信息 docker inspect myproject-uborrowu-web-1 | grep -A 10 "Networks"若网络不一致,重启docker-compose重建网络:
docker-compose down docker-compose up -d等待数据库服务就绪
depends_on仅保证启动顺序,不确保db服务完全就绪。可在web服务中添加启动等待脚本:web: build: . restart: always # 等待db端口可访问后再启动Django command: sh -c "until nc -z db 3306; do sleep 1; done; python manage.py runserver 0.0.0.0:8000" environment: - DATABASE_URL=mysql+mysqlconnector://mariadb:mariadb@db:3306/mariadb ports: - "9052:8000" depends_on: - db注意:若web镜像无
nc命令,需在Dockerfile中添加安装命令:RUN apt-get update && apt-get install -y netcat测试容器间连通性
进入web容器,测试是否能ping通db服务:docker exec -it myproject-uborrowu-web-1 ping db若ping不通,重启docker-compose重试。
内容的提问来源于stack exchange,提问作者wanx
相关产品推荐
相关产品推荐

