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

Docker化Laravel项目中控制器查询数据库连接被拒绝问题

问题解决:Laravel容器中控制器MySQL连接拒绝,tinker/migrate正常

问题根源

核心问题是执行环境差异:

  • 你在宿主机运行php artisan tinker或php artisan migrate时,用的是宿主机网络环境,127.0.0.1:4306能正确映射到Docker中的MySQL容器,所以连接正常。
  • 但Laravel应用在main容器内部运行,此时容器里的127.0.0.1指向容器自身而非宿主机,无法连接到宿主机映射的4306端口,导致SQLSTATE[HY000] [2002] Connection refused错误。

解决方案

1. 修改Laravel的.env配置

将数据库连接的主机和端口改为Docker内部服务的配置:

DB_CONNECTION=mysql
# 使用docker-compose中定义的MySQL服务名作为主机
DB_HOST=db
# 使用MySQL容器的内部端口,而非宿主机映射的4306
DB_PORT=3306
DB_DATABASE=main
DB_USERNAME=admin
DB_PASSWORD=admin

2. 修正docker-compose.yml中的MySQL环境变量(可选但建议)

你的配置里MYSQL_ROOT是无效变量,MySQL官方镜像的正确根用户变量是MYSQL_ROOT_USER,修正后更规范:

db:
  platform: linux/x86_64
  image: mysql:8.0
  environment:
    MYSQL_DATABASE: main
    MYSQL_USER: admin
    # 修正为正确的变量名
    MYSQL_ROOT_USER: admin
    MYSQL_PASSWORD: admin
    MYSQL_ROOT_PASSWORD: root
  volumes:
    - ./storage/dbdata:/var/lib/mysql
  ports:
      - 4306:3306

3. 重启容器并清除配置缓存

执行以下命令:

# 重启所有服务
docker-compose down && docker-compose up -d
# 进入main容器清除配置缓存
docker-compose exec main php artisan config:cache

完成后,容器内的Laravel应用就能通过Docker内部网络连接到db服务对应的MySQL容器。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 02:45:35