官方 Docker 镜像更稳妥省事,预装 PHP、Caddy、OPcache 及常用扩展,支持自动 HTTPS 和多架构;本地二进制仅适合无 Docker 环境或强定制需求场景。

frankenphp 二进制本身足够轻量、开箱即用,但绝大多数场景下,直接用官方 Docker 镜像更稳妥、更省事——尤其当你不是在管理一台长期运行的裸机服务器。
docker run 启动是最小认知负担的落地方式
- 官方镜像
dunglas/frankenphp已预装 PHP 运行时、Caddy、OPcache、常用扩展(如pdo_mysql),还内置了默认Caddyfile和自动 HTTPS 支持 - 你不需要手动处理:
-
/etc/frankenphp/frankenphp.yaml的路径权限问题 -
php.ini与 FrankenPHP 内置 PHP 的版本对齐问题 - Caddy 自动证书申请所需的 80/443 端口暴露和域名可访问性调试
-
- 挂载项目只需一条命令:
docker run -v $PWD:/app -p 80:80 dunglas/frankenphp,Laravel/Symfony 项目根目录下直接跑通 - 镜像支持
arm64和amd64,Mac M系列、Intel 服务器、树莓派都能无缝运行
本地安装 frankenphp 二进制只适合特定需求
- 你明确需要:
- 在无 Docker 环境的生产服务器上部署(比如某些受限的云主机或嵌入式设备)
- 对进程 UID/GID、信号处理、systemd 服务文件有强控制欲
- 要把
frankenphp打包进自己的发行版或嵌入式系统(例如 Koel 的 standalone binary 就是这么做的)
- 但要注意:
- Ubuntu/Debian 的
apt install frankenphp包依赖系统 PHP 版本,可能和你的项目要求不一致(比如项目需 PHP 8.3,而仓库只提供 8.2) - macOS 上用 Homebrew 安装目前不稳定,容易遇到
libphp符号缺失或CGO_ENABLED=1环境未生效的问题 - 手动配置
workers模式时,max_requests设太低会导致频繁重启,设太高又可能积累内存泄漏——Docker 镜像里默认关闭 worker 模式,反而更稳
- Ubuntu/Debian 的
别忽略镜像里藏的配置钩子
官方镜像不是黑盒,它预留了多个环境变量接口,能覆盖大部分定制需求:
-
SERVER_NAME=localhost:改成本地域名或线上域名,Caddy 就会自动申请 Let’s Encrypt 证书 -
FRANKENPHP_CONFIG=/app/frankenphp.yaml:挂载自定义 YAML 配置,启用 worker 模式或调优count -
CADDY_GLOBAL_OPTIONS="log {level warn}":直接注入全局 Caddy 日志级别 -
Caddyfile.d/*.caddyfile目录支持片段式配置叠加,比硬改主Caddyfile更安全
这些能力让镜像既“开箱即用”,又不牺牲可扩展性。
真正容易被忽略的点是:FrankenPHP 的价值不在“能不能跑”,而在减少配置漂移和链路故障点。用 Docker 镜像,你锁定的是一个完整、可复现的运行时环境;本地装二进制,等于重新拾起 Nginx+PHP-FPM 时代那些散落各处的配置责任——只是换了个名字而已。
立即学习“PHP免费学习笔记(深入)”;



















