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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 21:46:17