Docker部署Laravel项目时MySQL容器root及普通用户连接失败问题排查求助
解决Docker化Laravel项目中MySQL容器连接失败的问题
我仔细看了你的配置、操作步骤和日志,很快定位到了几个核心问题,咱们一步步来解决:
1. 修复MySQL环境变量的冲突问题
在你的docker-compose.yml里,attendize_db服务的环境变量存在严重冲突:
environment: MYSQL_DATABASE: "preprodica" MYSQL_ROOT_PASSWORD: "Str0ngDBP@ssw0rd" MYSQL_USER: "dhia" MYSQL_PASSWORD: "dhia" MYSQL_ALLOW_EMPTY_PASSWORD: "yes" # 这是导致连接失败的关键!
MySQL官方镜像的规则是:如果MYSQL_ALLOW_EMPTY_PASSWORD设为yes,会直接忽略你设置的MYSQL_ROOT_PASSWORD,强制让root用户的密码为空。这就是你用Str0ngDBP@ssw0rd连接root失败的原因——实际上root密码是空的。
解决方法:
删除MYSQL_ALLOW_EMPTY_PASSWORD: "yes"这一行,或者把它改成MYSQL_ALLOW_EMPTY_PASSWORD: "no",确保MYSQL_ROOT_PASSWORD正常生效。修改后的环境变量如下:
environment: MYSQL_DATABASE: "preprodica" MYSQL_ROOT_PASSWORD: "Str0ngDBP@ssw0rd" MYSQL_USER: "dhia" MYSQL_PASSWORD: "dhia"
2. 清理旧的MySQL数据卷(必须执行的步骤)
你之前已经启动过容器,MySQL的数据卷./storage/db-data里已经保存了旧的用户配置(包括无密码的root用户),即使修改了环境变量,旧数据也会被复用,所以必须清理旧数据:
# 停止并删除容器,同时删除关联的数据卷 docker-compose down -v # 重新构建并启动容器 docker-compose build && docker-compose up -d
3. 修正Laravel .env文件的数据库连接配置
你的项目.env里DB_HOST=127.0.0.1是错误的——在Docker容器网络中,Laravel容器(attendize_app)不能用127.0.0.1访问MySQL容器,必须用服务名attendize_db:
DB_CONNECTION=mysql DB_HOST=attendize_db # 这里改成容器服务名 DB_PORT=3306 DB_DATABASE=preprodica DB_USERNAME=root DB_PASSWORD=Str0ngDBP@ssw0rd
验证连接
现在你可以重新测试连接:
方法1:进入MySQL容器连接
docker exec -it ica-backoffice_attendize_db_1 /bin/bash # 用设置的密码连接root用户 mysql -u root -pStr0ngDBP@ssw0rd # 或者用普通用户dhia连接 mysql -u dhia -pdhia
方法2:从Laravel容器测试连接
docker exec -it ica-backoffice_attendize_app_1 php artisan tinker # 在tinker里验证数据库连接 DB::connection()->getPdo();
额外说明
从你的MySQL日志里可以看到InnoDB: 数据库未正常关闭!,这说明之前的容器可能异常终止过,清理数据卷也能解决这个潜在的数据库损坏问题。
内容的提问来源于stack exchange,提问作者dhia




