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

