Docker容器中Laravel 11无法连接MySQL及服务访问问题求助
解决Laravel 11 Docker部署的三个核心问题
1. Laravel服务无法访问localhost:8000
- 核对
docker-compose.yml中Laravel服务的端口映射配置,确保本地端口8000正确映射到容器内的服务端口。比如用artisan serve启动的话,配置应为ports: ["8000:8000"];用Nginx+PHP-FPM的话,需映射到Nginx的80端口:ports: ["8000:80"]。 - 执行
docker compose ps查看Laravel容器状态,若显示Exit或Restarting,进入容器排查服务启动失败原因:docker compose exec laravel bash,手动运行启动命令(如php artisan serve或nginx -t)查看报错。 - 检查本地防火墙是否拦截了8000端口,临时关闭防火墙测试,或添加端口放行规则。
2. MySQL连接错误:SQLSTATE[HY000] [2002] getaddrinfo failed
- 修改Laravel
.env中的DB_HOST值,不能用localhost,要替换成docker-compose.yml中MySQL服务的名称(比如你的MySQL服务定义为mysql,则DB_HOST=mysql)。Docker容器间通过服务名称解析地址,localhost会指向容器自身而非MySQL容器。 - 确认MySQL服务的环境变量配置正确,确保
MYSQL_DATABASE、MYSQL_USER、MYSQL_PASSWORD与Laravel.env中的对应参数一致:mysql: image: mysql:8.0 environment: MYSQL_DATABASE: laravel_db MYSQL_USER: laravel_user MYSQL_PASSWORD: laravel_pass MYSQL_ROOT_PASSWORD: root_pass volumes: - mysql_data:/var/lib/mysql - 为Laravel服务添加依赖等待,确保MySQL完全启动后再启动Laravel,避免连接时序问题:
laravel: build: . depends_on: mysql: condition: service_healthy mysql: image: mysql:8.0 healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost"] timeout: 20s retries: 10
3. 重复docker compose up --build触发'ContainerConfig' KeyError
- 彻底清理旧容器与网络:执行
docker compose down(若需保留MySQL数据卷,不要加-v参数),避免残留异常状态。 - 清理Docker缓存:运行
docker system prune -a,删除无用的镜像、容器和网络,解决缓存导致的配置冲突。 - 验证
docker-compose.yml语法正确性:执行docker compose config,排查配置文件中的语法错误。 - 更新Docker与Docker Compose到最新稳定版本,旧版本存在的已知bug可能引发此错误。
内容的提问来源于stack exchange,提问作者crawlingdev
相关产品推荐
相关产品推荐

