使用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
验证步骤
- 停止并清理现有容器:
docker-compose down -v(-v会删除数据卷,仅测试时使用,生产环境请勿添加) - 重新构建并启动服务:
docker-compose up --build - 进入web容器测试连接:
docker-compose exec web php artisan tinker,执行DB::connection()->getPdo(),无报错则连接正常。
内容的提问来源于stack exchange,提问作者meowmeow
相关产品推荐
相关产品推荐

