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

AWS部署Docker化Laravel应用遇SQL连接拒绝问题求助

问题:AWS Docker环境下Laravel容器因数据库连接失败退出

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 09:17:03