Docker部署Laravel+Vue遇MySQL连接错误SQLSTATE[HY000][2006]求助
解决Laravel+Vue Docker化的MySQL连接问题(SQLSTATE[HY000] [2006] MySQL server has gone away)
问题根源分析
从你的配置来看,存在几个关键错误导致连接失败:
- MySQL端口映射与内部端口不匹配
- 数据库权限配置冲突(
--skip-grant-tables与密码设置矛盾) .env中数据库密码与Docker配置不一致- 未确保MySQL服务完全就绪就尝试连接
步骤1:修正Docker Compose配置(docker-compose.yml)
修改db服务的端口映射、移除跳过权限验证的命令:
services: web: image: app-name:latest build: target: web context: . env_file: - .env ports: - "8000:80" volumes: - .:/var/www/html depends_on: - db # 可选:添加等待MySQL就绪的脚本,避免启动时连接失败 command: sh -c "while ! nc -z db 3306; do sleep 1; echo 'Waiting for MySQL...'; done; apache2-foreground" # 若使用nginx/php-fpm需调整对应启动命令 db: image: mysql:8.0 ports: - "3307:3306" # 主机3307映射到容器默认的3306端口 expose: - "3306" # 暴露容器内默认的3306端口 cap_add: - SYS_NICE # 移除--skip-grant-tables,让MySQL正常启用权限验证 volumes: - ./cache/mysql:/var/lib/mysql - ./conf-mysql.cnf:/etc/mysql/conf.d/mysql.cnf environment: - MYSQL_ROOT_PASSWORD=root - MYSQL_DATABASE=chat restart: unless-stopped volumes: dbdata:
步骤2:修正.env数据库配置
确保数据库参数与Docker配置完全匹配:
DB_CONNECTION=mysql DB_HOST=db # 使用Docker Compose服务名作为内部主机地址 DB_PORT=3306 # 容器内MySQL默认端口 DB_DATABASE=chat DB_USERNAME=root DB_PASSWORD=root # 与db服务的MYSQL_ROOT_PASSWORD一致
步骤3:验证MySQL配置文件(conf-mysql.cnf)
确保自定义配置文件没有破坏基础连接设置,可添加参数避免超时:
[mysqld] max_allowed_packet=64M wait_timeout=28800 interactive_timeout=28800
步骤4:重新部署服务
执行以下命令重启所有服务:
# 停止并删除现有容器 docker-compose down # 重新构建并启动服务 docker-compose up --build -d # 查看MySQL服务日志,确认正常启动 docker-compose logs db
额外排查点
- 若仍连接失败,进入web容器测试MySQL连通性:
docker-compose exec web bash # 安装mysql客户端(若容器未预装) apt update && apt install -y mysql-client # 测试连接 mysql -h db -P 3306 -u root -proot chat - 查看Laravel日志(
storage/logs/laravel.log)获取更详细错误信息,排查是否为权限、端口或数据库初始化问题。
内容的提问来源于stack exchange,提问作者Hamza ALi Bhatti
相关产品推荐
相关产品推荐

