frankenphp容器中应填host.docker.internal(macos/windows)或--add-host指定的宿主机网桥ip(linux),不可用localhost或127.0.0.1;同时需配置mysql监听0.0.0.0、授权'%'用户并开放防火墙3306端口。

FrankenPHP 容器默认无法通过 localhost 或 127.0.0.1 连宿主机 MySQL,因为容器有自己的网络命名空间,localhost 指向的是它自己,不是你的开发机。
FrankenPHP 容器里该填什么 host?
取决于你用的 Docker 环境和操作系统:
- macOS / Windows(Docker Desktop 18.03+):直接用
host.docker.internal—— 这是 Docker 自动注入的 DNS 别名,稳定可靠 - Linux(原生 Docker 引擎):启动容器时必须显式加
--add-host host.docker.internal:host-gateway,否则该域名不可解析 - 所有平台都可用的兜底方案:查宿主机在 Docker 虚拟网桥上的 IP,常见是
172.17.0.1(对应docker0接口),但不同环境可能不同,建议运行ip addr show docker0确认
别硬写 127.0.0.1,它在 FrankenPHP 容器里永远指向容器自身,不是你的 MySQL。
宿主机 MySQL 必须允许外部连接
MySQL 默认只监听 127.0.0.1,且用户权限限制来源主机。不改这两项,FrankenPHP 即便地址填对也会被拒连。
- 检查
/etc/mysql/my.cnf或/etc/my.cnf中[mysqld]段的bind-address,改成0.0.0.0或显式包含宿主机网桥 IP(如172.17.0.1) - 确认 MySQL 用户授权支持远程访问:执行
CREATE USER 'app'@'%' IDENTIFIED BY 'pass'; GRANT ALL ON mydb.* TO 'app'@'%'; FLUSH PRIVILEGES; - 防火墙要放行
3306(或你自定义的端口),例如 Ubuntu 上运行sudo ufw allow 3306
FrankenPHP 启动命令要不要加 --network host?
不推荐。FrankenPHP 是 PHP 运行时,不是 Web 服务器代理;用 --network host 会把整个容器进程暴露到宿主机网络栈,带来端口冲突和安全风险,而且破坏了容器隔离初衷。
- 它解决不了根本问题:MySQL 仍需配置允许外部连接,用户权限也得改
- 反而让 FrankenPHP 和宿主机其他服务(比如本地 Nginx、另一个 MySQL 实例)争抢端口
- 更稳妥的做法是保持默认 bridge 网络 + 正确 host 地址 + 合理 MySQL 配置
如果你用 docker run 启动 FrankenPHP,推荐加上 --add-host host.docker.internal:host-gateway(Linux)或直接依赖 Docker Desktop 的内置支持(macOS/Windows)。
.env 或配置文件里怎么写连接参数?
以 Laravel 或纯 PHP 应用为例,数据库配置应类似:
DB_HOST=host.docker.internal DB_PORT=3306 DB_DATABASE=myapp DB_USERNAME=app DB_PASSWORD=pass
注意:DB_PORT 填的是 MySQL 在宿主机上监听的端口(通常是 3306),不是 Docker 映射出去的端口——FrankenPHP 容器直连宿主机,不经过端口映射层。
最容易被忽略的一点:FrankenPHP 容器启动后,不会自动重载 .env。改完配置必须重启容器,或者在应用内手动触发配置刷新(如 Laravel 的 artisan config:clear)。光改文件不重启,等于没改。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











