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

Docker环境下Laravel数据库迁移失败的排查解决求助

Docker+Laravel迁移报错:SQLSTATE[HY000] [2002] 主机名无法解析

问题背景

所有Docker容器已正常启动,但执行php artisan migrate命令时出现数据库连接错误,错误提示无法解析主机名database。相关配置信息如下:

docker-compose.yml

services:
  laravel:
    restart: unless-stopped
    container_name: laravelapp
    build:
      context: ../
      dockerfile: ./deploy/Dockerfile
    volumes:
      - ../:/var/www/html
      - ../storage/app:/var/www/html/storage/app
    environment:
      APP_NAME: ${APP_NAME}
      APP_ENV: ${APP_ENV}
      APP_DEBUG: ${APP_DEBUG}
      APP_KEY: ${APP_KEY}
      APP_VERSION: ${APP_VERSION}
      APP_URL: ${APP_URL}
      DB_CONNECTION: mysql
      DB_HOST: mysql
      DB_DATABASE: ${DB_DATABASE}
      DB_USERNAME: ${DB_USERNAME}
      DB_PASSWORD: ${DB_PASSWORD}
      MAIL_MAILER: ${MAIL_MAILER}
      MAIL_HOST: ${MAIL_HOST}
      MAIL_PORT: ${MAIL_PORT}
      MAIL_USERNAME: ${MAIL_USERNAME}
      MAIL_PASSWORD: ${MAIL_PASSWORD}
      MAIL_ENCRYPTION: ${MAIL_ENCRYPTION}
      MAIL_FROM_ADDRESS: ${MAIL_FROM_ADDRESS}
      MAIL_FROM_NAME: ${MAIL_FROM_NAME}
    ports:
      - "8080:80"
    networks:
      - n-laravel
    depends_on:
      - mysql

  mysql:
    restart: unless-stopped
    image: mysql:8.0
    volumes:
      - v-mysql:/var/lib/mysql
    environment:
      MYSQL_DATABASE: ${DB_DATABASE}
      MYSQL_USER: ${DB_USERNAME}
      MYSQL_PASSWORD: ${DB_PASSWORD}
      MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
    networks:
      - n-laravel
    ports:
      - 3307:3306

.env文件

DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3307
DB_DATABASE=shitdate
DB_USERNAME=admin
DB_PASSWORD=password
DB_ROOT_PASSWORD=root

错误信息

/var/www/html # php artisan migrate

   Illuminate\Database\QueryException 

   Illuminate\Database\QueryException 

   Illuminate\Database\QueryException 

  SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo for database failed: Name does not resolve (Connection: mysql, SQL: select table_name as `name`, (data_length + index_length)  SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo for database failed: Name does not resolve (Connection: mysql, SQL: select table_name as `name`, (data_length + index_length) as `size`, table_comment as `comment`, engine as `engine`, table_collation as `collation` from information_schema.tables where table_schema = 'shitdate' and table_type in ('BASE TABLE', ' as `size`, table_comment as `comment`, engine as `engine`, table_collation as `collation` from information_schema.tables where table_schema = 'shitdate' and table_type in ('BASE TABLE', 'SYSTEM VERSIONED') order by table_name)

SYSTEM VERSIONED') order by table_name)

  at vendor/laravel/framework/src/Illuminate/Database/Connection.php:825
  at vendor/laravel/framework/src/Illuminate/Database/Connection.php:825
    821▕                     $this->getName(), $query, $this->prepareBindings($bindings), $e
    822▕                 );
    821▕                     $this->getName(), $query, $this->prepareBindings($bindings), $e
    822▕                 );
    823▕             }
    823▕             }
    824▕
  ➜ 825▕             throw new QueryException(
    824▕
  ➜ 825▕             throw new QueryException(
    826▕                 $this->getName(), $query, $this->prepareBindings($bindings), $e
    827▕             );
    828▕         }
    829▕     }
    826▕                 $this->getName(), $query, $this->prepareBindings($bindings), $e
    827▕             );
    828▕         }
    829▕     }
    827▕             );
    828▕         }
    829▕     }
    829▕     }

      +41 vendor frames 

  42  artisan:13
      Illuminate\Foundation\Application::handleCommand(Object(Symfony\Component\Console\Input\ArgvInput))

解决方案

1. 检查Laravel数据库配置文件

打开config/database.php,确认mysql连接的host字段是读取环境变量,而非硬编码值:

'mysql' => [
    'driver' => 'mysql',
    'host' => env('DB_HOST', '127.0.0.1'), // 确保此处为env('DB_HOST', ...),而非硬编码的'database'
    'port' => env('DB_PORT', '3306'),
    'database' => env('DB_DATABASE', 'forge'),
    'username' => env('DB_USERNAME', 'forge'),
    'password' => env('DB_PASSWORD', ''),
    // 其他配置项...
],

若此处写死'host' => 'database',会导致Laravel忽略.env配置,尝试解析错误的主机名。

2. 修正数据库端口配置

容器间通信使用容器内部端口,而非宿主机映射端口。mysql容器内部端口为3306,修改.env文件:

DB_PORT=3306

3. 清理Laravel配置缓存

若之前生成过配置缓存,需清除缓存以加载新配置:

# 进入laravel容器内部
docker exec -it laravelapp bash
# 执行清理命令
php artisan config:clear

4. 在容器内部执行迁移命令

确保php artisan migrate在laravel容器内执行,而非宿主机(宿主机环境未配置正确的数据库连接):

docker exec -it laravelapp php artisan migrate

5. 验证数据库权限(可选)

确认admin用户拥有shitdate数据库的全部权限:

# 进入mysql容器
docker exec -it <mysql容器名> mysql -u root -p
# 输入root密码后执行SQL
GRANT ALL PRIVILEGES ON shitdate.* TO 'admin'@'%';
FLUSH PRIVILEGES;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 08:43:13