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

Devilbox:如何将Docker内的Laravel连接至宿主机MySQL

解决Docker容器内Laravel连接宿主机MySQL的问题

核心问题分析

容器内的127.0.0.1指向容器自身,而非宿主机。当你启动bind服务、不启动Devilbox自带的MySQL容器时,Laravel配置的DB_HOST=127.0.0.1会尝试连接容器内部的MySQL,自然失败。

分步解决方案

1. 修改Laravel的.env配置

将Laravel的数据库连接地址替换为MacOS Docker专用的宿主机地址,同时修正端口为宿主机MySQL的实际端口3307:

DB_CONNECTION=mysql
DB_HOST=host.docker.internal
DB_PORT=3307
DB_DATABASE=hanger
DB_USERNAME=root
DB_PASSWORD=

2. 确保宿主机MySQL允许外部连接

宿主机的MySQL默认可能只允许本地连接,需要修改配置:

  • 找到MySQL的配置文件(通常是/etc/my.cnf或/usr/local/etc/my.cnf)
  • 将bind-address改为0.0.0.0(允许所有IP访问),或者保留127.0.0.1但添加Docker子网的IP段(比如172.17.0.0/16)
  • 重启MySQL服务:brew services restart mysql(如果是brew安装的)

3. 给MySQL用户授予远程访问权限

进入宿主机的MySQL终端,执行以下命令给root用户授予从任意地址访问的权限:

GRANT ALL PRIVILEGES ON hanger.* TO 'root'@'%' IDENTIFIED BY '';
FLUSH PRIVILEGES;

注意:生产环境不建议用%,可以指定Docker容器所在的子网IP,比如172.17.0.0/16

4. 验证容器内的网络连通性

进入Laravel所在的PHP容器,测试能否ping通宿主机并连接MySQL:

# 进入容器
docker exec -it <php-container-name> bash
# ping宿主机地址
ping host.docker.internal
# 测试MySQL连接
mysql -h host.docker.internal -P 3307 -u root

5. 清理缓存(可选)

如果修改.env后仍无法连接,清理Laravel的配置缓存:

# 容器内执行
php artisan config:clear
php artisan cache:clear

额外说明

  • Devilbox的HOST_PORT_MYSQL=3306是启动自带MySQL容器时宿主机的映射端口,和连接宿主机MySQL无关,无需修改该配置
  • MacOS下Docker的host.docker.internal是官方提供的宿主机别名,无需手动配置IP

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 15:30:43