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
相关产品推荐
相关产品推荐

