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

