Docker环境下Django连接MySQL报(2006)错误求助
解决Docker Compose中Django无法连接MySQL的问题
核心问题修复:修正数据库连接的HOST配置
你的Django容器现在尝试连接127.0.0.1,但在Docker的网络环境里,每个容器都是独立的网络节点,127.0.0.1指向的是Django容器自身,而非MySQL容器。Docker Compose会自动为所有服务创建一个共享网络,每个服务的名称(比如你配置里的db)就是该容器的可解析主机名。
修改settings.py中的数据库配置:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'ProjetDjango', 'USER': 'root', 'PASSWORD': 'root', 'HOST': 'db', # 将127.0.0.1替换为db服务名 'PORT': '3306', } }
额外优化:等待MySQL服务完全就绪
虽然你配置了depends_on: -db,但Docker只会保证db容器先启动,不会等待MySQL服务完成初始化。如果Django在MySQL还没准备好时就尝试连接,依然会抛出连接拒绝的错误。
可以在web服务的启动命令中添加等待逻辑,确保MySQL服务就绪后再执行Django的初始化命令:
修改docker-compose.yml中web服务的command:
command: bash -c "until nc -z db 3306; do sleep 1; done; python3 manage.py makemigrations && python3 manage.py migrate && python3 manage.py collectstatic --noinput && gunicorn hello_django.wsgi -b 0.0.0.0:8000"
注意:如果容器中没有
nc(netcat)工具,需要在Dockerfile中添加安装命令:RUN apt-get install -y netcat
最后检查几个关键点
- 确认
docker-compose.yml中MySQL的环境变量和Django配置完全匹配:MYSQL_DATABASE: ProjetDjango和Django里的NAME一致MYSQL_PASSWORD: root和Django里的PASSWORD一致
- 确保你的
project目录挂载到/src后,Django的manage.py确实在该路径下,避免启动命令找不到文件
完成以上修改后,重新执行docker-compose up --build,应该就能正常连接MySQL了。
内容的提问来源于stack exchange,提问作者Zineb Lazrak
相关产品推荐
相关产品推荐

