You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Docker Compose搭建Laravel应用遇SQLSTATE[HY000] [2002]连接拒绝问题

解决Laravel + Docker Compose数据库连接拒绝问题

核心问题排查与修复

1. 修正数据库端口配置

你的.env里DB_PORT设为了3307,但Docker容器内部通信时,应该使用数据库容器的内部端口3306,而非映射到主机的3307端口。修改.env:

DB_PORT=3306

容器之间通过服务名db通信时,直接访问容器的原生端口,主机映射端口仅用于外部工具连接。

2. 确保数据库服务完全就绪

depends_on仅保证web在db之后启动,但不确保MySQL完成初始化。给db服务添加健康检查,让web等待数据库就绪:
修改docker-compose.yml的db部分:

db:
  platform: "linux/amd64"
  image: mysql:5.7
  env_file:
    - .env
  environment:
    MYSQL_ROOT_PASSWORD: root
    MYSQL_DATABASE: laravel
    MYSQL_USER: laravel
    MYSQL_PASSWORD: secret
  ports:
    - "3307:3306"
  volumes:
    - dbdata:/var/lib/mysql
  healthcheck:
    test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-proot"]
    interval: 5s
    timeout: 5s
    retries: 5

同时更新web服务的depends_on配置:

web:
  # ... 其他原有配置
  depends_on:
    db:
      condition: service_healthy

3. 容器内清除配置缓存

本地执行的php artisan config:clear不会同步到容器,需进入容器内部执行:

docker-compose exec web php artisan config:clear
docker-compose exec web php artisan cache:clear

4. 调整Dockerfile的依赖安装逻辑

你的Dockerfile在构建阶段就执行了composer install,但本地目录挂载到容器后可能覆盖依赖文件。可修改Dockerfile移除构建时的依赖安装:

# 移除该行,改为容器启动后执行
# RUN composer install

启动容器后执行依赖安装:

docker-compose exec web composer install

验证步骤

  1. 停止并清理现有容器:docker-compose down -v(-v会删除数据卷,仅测试时使用,生产环境请勿添加)
  2. 重新构建并启动服务:docker-compose up --build
  3. 进入web容器测试连接:docker-compose exec web php artisan tinker,执行DB::connection()->getPdo(),无报错则连接正常。

内容的提问来源于stack exchange,提问作者meowmeow

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 03:28:10