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

Docker容器内Laravel应用无法连接宿主机本地MySQL问题排查

问题根因说明

你遇到的连接失败核心是几个配置认知错误:

  • Dockerfile中EXPOSE 3306完全无效:该指令是声明容器自身对外提供服务的端口,你要访问的是宿主机的MySQL服务,不需要在容器侧暴露3306端口
  • 当前报错提示找本地socket文件,说明你Laravel .env中DB_HOST配置为localhost:容器内的localhost指向容器自身,并没有运行MySQL服务,自然找不到对应的sock文件
  • 宿主机MySQL默认只允许本地访问,Docker容器的网段默认属于外部访问,没有授权无法连接

分步修复方案

1. 调整宿主机MySQL配置

  • 打开MySQL配置文件(一般为/etc/mysql/mysqld.cnf或/etc/my.cnf),将bind-address参数修改为0.0.0.0或直接注释该行,修改后重启MySQL服务
  • 登录宿主机MySQL执行授权语句,允许容器网段访问:
GRANT ALL PRIVILEGES ON 你的数据库名.* TO '你的数据库用户名'@'%' IDENTIFIED BY '你的数据库密码';
FLUSH PRIVILEGES;
  • 确认宿主机防火墙放开3306端口的访问权限

2. 调整Laravel .env数据库配置

将DB_HOST修改为宿主机的Docker网关地址,不同系统对应值不同:

  • Windows/macOS宿主机:DB_HOST=host.docker.internal
  • Linux宿主机:先在宿主机执行ip addr show docker0查询网关地址,一般默认是172.17.0.1
    注意必须删掉原来的DB_HOST=localhost配置,避免MySQL默认走socket连接

3. 调整docker-compose.yml配置

不需要修改Dockerfile,在client服务下新增如下配置即可:

extra_hosts:
  - "host.docker.internal:host-gateway"

如果是Linux宿主机,也可以直接使用host网络模式(端口映射会失效,需删除原ports配置):

network_mode: "host"

4. 验证连接

重新构建启动容器:

docker-compose up -d --build

进入容器执行连接命令验证:

mysql -h host.docker.internal -u 你的数据库用户名 -p

输入密码后能正常登录即配置完成,Laravel应用即可正常访问数据库。


内容的提问来源于stack exchange,提问作者MD Nasirul Islam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 02:45:01