Docker部署Laravel出现SQLSTATE[HY000] [2002]数据库连接错误如何解决?
问题根因
这个报错的核心原因是Docker容器间通信的端口配置错误:
官方MySQL 5.7镜像默认在容器内部监听3306端口,你在docker-compose.yml中配置的33069:3306是宿主机到容器的端口映射,仅用于外部工具(如Navicat、本地MySQL客户端)访问数据库,同一Docker网络内的服务之间通信只能用容器内部端口。
你在.env中配置的DB_PORT=33069会让Laravel尝试访问db服务的33069端口,而db容器根本没有在该端口监听,因此触发连接失败报错。
前期运行正常大概率是因为你初始配置的端口正确,后续修改.env或清理配置缓存后,错误的端口配置生效。
修复步骤
- 修正端口配置
将.env中的DB_PORT改为3306:
DB_PORT=3306
同时在docker-compose.yml的users服务的environment配置中补充DB_PORT,避免.env配置被覆盖不生效:
users: build: context: . dockerfile: Dockerfile environment: DB_HOST: db DB_PORT: 3306 DB_DATABASE: users DB_USERNAME: root DB_PASSWORD: root # 其余原有配置保持不变
- 重建服务生效
执行以下命令重启所有服务:
docker-compose down docker-compose up -d --build
- 验证修复效果
进入Laravel容器执行迁移测试:
docker-compose exec users php artisan migrate
边缘问题排查
如果修改后仍有报错,可按以下顺序排查:
- 执行
docker-compose logs db查看MySQL容器运行日志,若存在启动失败报错,可先备份数据后删除本地./storage/dbdata目录,再重启服务重建数据库 - 确认
users服务的depends_on配置仅保证启动顺序,不保证MySQL完全初始化完成再启动Laravel,可在command中增加等待逻辑,比如改成sh -c "sleep 10 && php artisan serve --host 0.0.0.0"
内容的提问来源于stack exchange,提问作者Nikita
相关产品推荐
相关产品推荐

