Docker环境下Django-REST连接MySQL数据库失败,报"Can't connect to MySQL server"错误求助
Docker环境下Django-REST连接MySQL数据库失败,报"Can't connect to MySQL server"错误求助
嗨,我帮你梳理下问题里的几个关键错误点,应该能解决你的连接问题:
1. 端口配置错误(最核心问题)
MySQL的默认端口是3306,但你在docker-compose.yml的Django服务环境变量里写的是SQL_PORT=5432——这是PostgreSQL的默认端口,完全不匹配!
你需要把neura-dbms-backend服务里的环境变量修改为:
- SQL_PORT=3306
2. 数据库启动就绪问题
depends_on字段只是保证MySQL容器先启动,但不保证MySQL服务已经完成初始化、可以接受连接。Django容器启动时,数据库可能还在初始化,就会抛出连接超时错误。
可以用两种方法解决:
方法一:添加等待脚本
修改Django服务的command,先等待MySQL端口开放再启动服务:
command: [sh, -c, "until nc -z db_neura_dbms 3306; do sleep 1; echo Waiting for MySQL to be ready...; done; python manage.py runserver 0.0.0.0:7000"]
同时需要在你的Dockerfile里添加netcat安装命令(因为slim镜像默认没有nc):
RUN apt update \ && apt install -y --no-install-recommends python3-dev \ default-libmysqlclient-dev build-essential default-mysql-client netcat \ && apt autoclean
方法二:使用Docker健康检查
在db_neura_dbms服务中添加健康检查配置,让Django只在MySQL完全就绪后启动:
db_neura_dbms: image: mysql:latest volumes: - mysql_data_db_neura_dbms:/var/lib/mysql/ environment: - MYSQL_DATABASE=db_neura_dbms - MYSQL_USER=neura_dbms_user - MYSQL_PASSWORD=super_secure_password - MYSQL_ROOT_PASSWORD=super_secure_password networks: - docker-network healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p${MYSQL_ROOT_PASSWORD}"] interval: 5s timeout: 5s retries: 5
然后修改Django服务的depends_on:
depends_on: db_neura_dbms: condition: service_healthy
3. 验证其他配置
你的Docker网络配置是正确的(两个服务都在docker-network里),Django的SQL_HOST设置为db_neura_dbms(对应MySQL服务的容器名),这部分没问题,只要上面两个问题修复,连接应该就能正常建立。
备注:内容来源于stack exchange,提问作者Ruben Adriaanse
相关产品推荐
相关产品推荐

