Laravel/Vue Docker容器中MySQL无法启动及迁移失败求助
Laravel/Vue应用弃用Sail后MySQL连接失败问题解决
问题背景
弃用Sail搭建Laravel/Vue应用,已将环境变量DB_HOST改为Docker Compose中数据库容器名称database,执行docker compose up --build后MySQL服务看似启动正常,但执行php artisan migrate:fresh --seed时出现主机名解析失败的错误。
配置信息
docker-compose.yml配置
version: "3.8" services: laravel-vue-app: build: . ports: - "8080:8080" depends_on: - mysql volumes: - .:/var/www/html - /var/www/html/node_modules - /var/www/html/vendor networks: - app-network mysql: image: "mysql/mysql-server:8.0" container_name: database ports: - "${FORWARD_DB_PORT:-3306}:3306" environment: MYSQL_ROOT_PASSWORD: "${DB_PASSWORD}" MYSQL_DATABASE: "${DB_DATABASE}" MYSQL_USER: "${DB_USERNAME}" MYSQL_PASSWORD: "${DB_PASSWORD}" MYSQL_ALLOW_EMPTY_PASSWORD: "yes" volumes: mysql-data: networks: app-network:
.env配置片段
DB_CONNECTION=mysql DB_HOST=database DB_PORT=3306
报错信息
SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo for database failed: nodename nor servname provided, or not known (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 = 'bigapp' and table_type in ('BASE TABLE', 'SYSTEM VERSIONED') order by table_name)
解决步骤
核心问题
宿主机终端无法直接解析Docker容器的内部主机名database,必须在Laravel应用容器内部执行迁移命令——容器间在同一网络下才能通过容器名互相访问。
具体操作
查看应用容器名称
执行以下命令获取运行中的容器列表,找到laravel-vue-app对应的容器名称:docker ps进入应用容器
替换[容器名]为上一步获取的实际名称,进入容器终端:docker exec -it [容器名] bash执行迁移命令
在容器内部执行数据库迁移和填充:php artisan migrate:fresh --seed
额外排查点
- 验证网络连通性:确认两个容器在同一网络,执行
docker network inspect app-network,检查Containers字段下是否同时存在应用容器和database容器。 - 确认MySQL服务就绪:
depends_on仅保证容器启动顺序,不代表服务已就绪。查看MySQL日志确认服务启动完成:
日志中出现docker logs databaseready for connections字样说明服务可用。 - 检查.env变量加载:进入应用容器后,执行
echo $DB_HOST,确认输出值为database。 - 验证数据库用户权限:若迁移仍失败,可临时将
.env中的DB_USERNAME改为root测试,排除权限问题。
内容的提问来源于stack exchange,提问作者clew-bot
相关产品推荐
相关产品推荐

