Laravel Sail Docker迁移时数据库连接失败求助
问题描述
我在Windows 10(已安装WSL)环境下将Laravel 10项目迁移至Sail,其他功能正常,但数据库连接始终失败。执行迁移时出现错误:
SQLSTATE[HY000] [2002] Connection refused (Connection: mysql, SQL: select * from information_schema.tables where table_schema = domainmonitor_db and table_name = migrations and table_type = 'BASE TABLE')
我可以使用用户名sail、密码password登录phpMyAdmin,但尝试手动创建数据库时会提示:
#1044 - Access denied for user 'sail'@'%' to database 'domainmonitor1_db'
我的.env数据库配置:
DB_CONNECTION=mysql DB_HOST=mysql DB_PORT=3307 FORWARD_DB_PORT=3307 DB_DATABASE=domainmonitor_db DB_USERNAME=sail DB_PASSWORD=password
尝试过将DB_HOST修改为127.0.0.1、host.docker.internal、localhost等多种值,但均无效。我的docker-compose.yml内容:
services: laravel.test: build: context: ./vendor/laravel/sail/runtimes/8.1 dockerfile: Dockerfile args: WWWGROUP: '${WWWGROUP}' NODE_VERSION: '18' image: sail-8.1/app extra_hosts: - 'host.docker.internal:host-gateway' ports: - '${APP_PORT:-80}:80' - '${VITE_PORT:-5173}:${VITE_PORT:-5173}' environment: WWWUSER: '${WWWUSER}' LARAVEL_SAIL: 1 XDEBUG_MODE: '${SAIL_XDEBUG_MODE:-off}' XDEBUG_CONFIG: '${SAIL_XDEBUG_CONFIG:-client_host=host.docker.internal}' IGNITION_LOCAL_SITES_PATH: '${PWD}' volumes: - '.:/var/www/html' networks: - sail depends_on: - mailpit - phpmyadmin - mysql mailpit: image: 'axllent/mailpit:latest' ports: - '${FORWARD_MAILPIT_PORT:-1025}:1025' - '${FORWARD_MAILPIT_DASHBOARD_PORT:-8025}:8025' networks: - sail phpmyadmin: image: 'phpmyadmin:latest' ports: - '8080:80' networks: - sail links: - mysql environment: - PMA_ARBITRARY=1 mysql: image: 'mysql/mysql-server:5.7' ports: - '${FORWARD_DB_PORT:-3307}:3306' environment: MYSQL_ROOT_PASSWORD: '${DB_PASSWORD}' MYSQL_ROOT_HOST: '%' MYSQL_DATABASE: '${DB_DATABASE}' MYSQL_USER: '${DB_USERNAME}' MYSQL_PASSWORD: '${DB_PASSWORD}' MYSQL_ALLOW_EMPTY_PASSWORD: 1 volumes: - 'sail-mysql:/var/lib/mysql' - './vendor/laravel/sail/database/mysql/create-testing-database.sh:/docker-entrypoint-initdb.d/10-create-testing-database.sh' networks: - sail healthcheck: test: - CMD - mysqladmin - ping - '-p${DB_PASSWORD}' retries: 3 timeout: 5s networks: sail: driver: bridge volumes: sail-mysql: driver: local
问题分析与解决步骤
1. 修正容器内部数据库端口配置
.env中DB_PORT=3307是错误的:3307是宿主机映射到MySQL容器的端口,而Docker网络内部,MySQL容器本身暴露的端口是3306。
修改.env中的端口配置:
DB_PORT=3306
DB_HOST=mysql是正确配置,Docker内部可通过服务名直接解析,无需修改为127.0.0.1或localhost。
2. 解决MySQL用户权限不足问题
sail用户默认仅拥有domainmonitor_db的操作权限,没有全局创建数据库的权限,导致无法新建domainmonitor1_db。
方法1:授予全局权限
用root用户登录phpMyAdmin(用户名root,密码password),执行以下SQL:
GRANT ALL PRIVILEGES ON *.* TO 'sail'@'%' WITH GRANT OPTION; FLUSH PRIVILEGES;
方法2:单独授权特定数据库
如果不需要全局权限,可仅授权目标数据库:
GRANT ALL PRIVILEGES ON `domainmonitor1_db`.* TO 'sail'@'%'; FLUSH PRIVILEGES;
3. 清理旧数据卷(若上述步骤无效)
如果MySQL容器已初始化过数据卷,修改环境变量可能不生效,需清理旧数据卷重新初始化:
# 停止并删除容器及关联数据卷 sail down -v # 重新启动容器 sail up -d
验证操作
- 重启Sail容器:
sail restart - 执行迁移命令:
sail artisan migrate - 测试数据库连接:
sail artisan db:show
内容的提问来源于stack exchange,提问作者Ryan H

