使用FrankenPHP+Laravel+MySQL Docker镜像时连接被拒绝问题排查
Laravel 无法连接Docker中MySQL的问题排查与解决
你的配置存在几个关键问题,导致Laravel无法连接到MySQL:
1. 数据库主机配置错误
在Docker容器环境中,127.0.0.1指向的是Laravel所在的php容器自身,而非MySQL所在的db容器。Docker Compose会自动为每个服务创建内部DNS解析,你需要将.env中的DB_HOST改为服务名db。
2. 未自动初始化目标数据库
当前MySQL容器仅设置了root密码,但没有自动创建Laravel需要的laravel数据库,导致连接时会提示数据库不存在。需要在db服务的环境变量中添加MYSQL_DATABASE=laravel,让MySQL镜像首次启动时自动创建该库。
3. 未等待MySQL服务完全就绪
depends_on仅能保证db容器先启动,但无法确保MySQL服务已经准备好接受连接。添加健康检查并修改depends_on的条件,可让php服务等待MySQL完全就绪后再启动。
修改后的配置文件
compose.yaml
services: db: image: mysql:8.1.0 ports: - "3306:3306" environment: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: laravel # 自动创建laravel数据库 healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-proot"] interval: 5s timeout: 5s retries: 5 php: build: . ports: - "80:80" # HTTP - "443:443" # HTTPS - "443:443/udp" # HTTP/3 volumes: - ./:/app - caddy_data:/data - caddy_config:/config depends_on: db: condition: service_healthy # 等待MySQL服务就绪 tty: true volumes: caddy_data: caddy_config:
.env
DB_CONNECTION=mysql DB_HOST=db # 使用Docker服务名作为数据库主机 DB_PORT=3306 DB_DATABASE=laravel DB_USERNAME=root DB_PASSWORD=root
修改完成后,执行docker-compose down -v清除旧容器和数据卷,再重新启动docker-compose up -d,Laravel就能正常连接到MySQL了。
内容的提问来源于stack exchange,提问作者user15254140
相关产品推荐
相关产品推荐

