AWS部署Docker化Laravel应用遇SQL连接拒绝问题求助
在AWS的Docker环境部署Laravel应用,本地Windows运行正常,但执行docker-compose up -d后myapp容器因SQLSTATE[HY000] [2002] Connection refused报错退出,无法执行php artisan migrate和php artisan db:seed。已开放安全组8000、8080、3306端口,尝试过将DB_HOST设为localhost无效。
相关配置文件
.env文件
APP_NAME=Laravel APP_ENV=local APP_KEY=base64:sKPVZblHmpBF0G5Jgax5aucPYYfm+GPPGZn6DgePymw= APP_DEBUG=true APP_URL=http://proyecto.test LOG_CHANNEL=stack LOG_DEPRECATIONS_CHANNEL=null LOG_LEVEL=debug DB_CONNECTION=mysql DB_HOST=mariadb DB_PORT=3306 DB_DATABASE=wallamotop DB_USERNAME=daniel DB_PASSWORD=
docker-compose.yml文件
version: '2' services: mariadb: image: docker.io/bitnami/mariadb:10.6 environment: - ALLOW_EMPTY_PASSWORD=yes - MARIADB_USER=daniel - MARIADB_DATABASE=wallamotop # 此处已修改 myapp: image: docker.io/bitnami/laravel:10 ports: - '8000:8000' environment: - DB_HOST=mariadb - DB_PORT=3306 - DB_USERNAME=root - DB_DATABASE=wallamotop # 此处已修改 volumes: - './:/app' depends_on: - mariadb command: bash -c "php artisan migrate && php artisan db:seed" phpmyadmin: image: phpmyadmin/phpmyadmin links: - mariadb:db ports: - '8080:80' environment: - PMA_HOST=mariadb - MYSQL_USER=daniel - MYSQL_PASSWORD= - MYSQL_ROOT_PASSWORD=
config/database.php文件(mysql配置段)
'mysql' => [ 'driver' => 'mysql', 'url' => env('DATABASE_URL'), 'host' => env('DB_HOST', 'mariadb'), 'port' => env('DB_PORT', '3306'), 'database' => env('DB_DATABASE', 'wallamotop'), 'username' => env('DB_USERNAME', 'daniel'), 'password' => env('DB_PASSWORD', ''), 'unix_socket' => env('DB_SOCKET', ''), 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci', 'prefix' => '', 'prefix_indexes' => true, 'strict' => true, 'engine' => null, 'options' => extension_loaded('pdo_mysql') ? array_filter([ PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), ]) : [], ],
解决方案
统一数据库用户配置:docker-compose.yml中myapp的
DB_USERNAME设为root,但mariadb容器创建的用户是daniel,且.env、database.php中配置的也是daniel,三者不一致导致权限问题。将myapp环境变量中的DB_USERNAME改为daniel,保持所有配置统一。添加数据库就绪等待逻辑:
depends_on仅保证容器启动顺序,不确保数据库服务完全就绪。修改myapp的command,先等待数据库端口可用再执行迁移和填充:command: bash -c "while ! nc -z mariadb 3306; do sleep 1; done; php artisan migrate && php artisan db:seed && php artisan serve --host=0.0.0.0"若容器内无
nc工具,可替换为mysqladmin ping命令:command: bash -c "while ! mysqladmin ping -h mariadb -u daniel --silent; do sleep 1; done; php artisan migrate && php artisan db:seed && php artisan serve --host=0.0.0.0"检查数据库容器状态:执行
docker-compose logs mariadb查看数据库初始化日志,确认是否有启动失败、权限错误等问题。若数据库未正常初始化,myapp必然无法连接。避免配置冲突:由于myapp挂载了本地
./:/app,确保本地.env文件的配置能正确覆盖容器默认值;或者直接在docker-compose.yml的myapp环境变量中明确所有数据库参数,消除.env与容器环境变量的冲突。
内容的提问来源于stack exchange,提问作者Pedro Daniel Fernndez Guerrero

