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

Docker部署Laravel无法连接MySQL问题排查与修复

Docker部署Laravel连接MySQL失败修复方案

你的问题由3个核心配置错误导致,按以下步骤逐一修复即可:

1. 修正docker-compose.yml中MySQL服务配置

现有配置存在三个明显问题:

  • 同时配置MYSQL_ROOT_PASSWORD和MYSQL_ALLOW_EMPTY_PASSWORD: 1,两个环境变量逻辑冲突,会导致MySQL初始化时root密码规则混乱,触发1045权限报错
  • 没有映射MySQL服务的3306端口到宿主机,本地数据库工具(TablePlus)根本无法访问容器内的数据库,触发10060连接超时
  • 缺少MySQL数据持久化配置,容器重建后所有数据库数据会丢失

替换db服务段配置为以下内容:

db:
    image: mysql:8.0
    container_name: travellist-db
    restart: unless-stopped
    ports:
        - 3306:3306
    environment:
        MYSQL_DATABASE: '${DB_DATABASE}'
        MYSQL_ROOT_PASSWORD: '${DB_PASSWORD}'
        MYSQL_USER: '${DB_USERNAME}'
        MYSQL_PASSWORD: '${DB_PASSWORD}'
        SERVICE_TAGS: dev
        SERVICE_NAME: mysql
    volumes:
        - ./docker-compose/mysql:/docker-entrypoint-initdb.d
        - mysqldata:/var/lib/mysql
    networks:
        - travellist

在docker-compose.yml最外层(和networks同级)新增数据卷定义:

volumes:
    mysqldata:
        driver: local

2. 修正Laravel .env数据库连接配置

Docker容器间通过内部网络通信,不能用127.0.0.1/localhost作为数据库地址,必须使用docker-compose中定义的MySQL服务名作为连接host。
打开项目根目录的.env文件,修改数据库配置段:

DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=和你docker-compose中配置的MYSQL_DATABASE一致
DB_USERNAME=root # 或你自定义的MYSQL_USER值
DB_PASSWORD=和你docker-compose中配置的MYSQL_ROOT_PASSWORD一致

3. 清除旧缓存重启服务

你之前已经启动过MySQL容器,初始化生成的系统库数据已经存在,就算修改了环境变量也不会重新生效,必须清除旧数据后重启:
执行以下命令:

# 停止容器并删除关联的匿名数据卷
docker-compose down -v
# 重新构建镜像并后台启动服务
docker-compose up -d --build

注意事项

  • MySQL首次启动初始化需要10~30秒,刚执行完启动命令立刻访问会报连接超时,可通过docker-compose logs -f db查看启动日志,出现ready for connections字样再访问
  • 本地用TablePlus连接时,host填127.0.0.1,端口填3306,用户名密码和.env中配置一致即可,不要填Docker内部网段IP,容器重启后内部IP会变动
  • 如果出现MySQL认证插件不兼容报错,可在db服务的environment段新增MYSQL_DEFAULT_AUTHENTICATION_PLUGIN: mysql_native_password配置,再重复步骤3重启即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 19:31:41