FrankenPHP容器化部署核心是使用dunglas/frankenphp镜像与Caddy深度集成,无需Nginx或PHP-FPM;关键在于路径映射、端口暴露、HTTPS/HTTP/3启用及环境变量配置,支持docker run快速启动或docker-compose生产部署,并可通过Caddyfile.d自定义行为。

FrankenPHP 容器化部署的核心在于利用其官方镜像(dunglas/frankenphp)与 Caddy 的深度集成,无需额外配 Nginx 或 PHP-FPM。配置重点不在复杂编排,而在正确映射路径、暴露端口、启用 HTTPS/HTTP/3,并按需注入环境变量或自定义 Caddy 行为。
基础 docker run 命令即开即用
对快速验证或开发场景,一条命令即可启动 Laravel 或普通 PHP 项目:
docker run -p 80:80 -p 443:443 -p 443:443/udp -v $PWD:/app dunglas/frankenphp-
$PWD必须是 Laravel 项目根目录(含public/和artisan),镜像默认从/app/public提供静态资源并执行 PHP - 访问
https://localhost即可——Caddy 自动为localhost签发并托管本地证书(浏览器提示自签名,点“继续访问”即可)
docker-compose.yml 推荐写法(生产就绪)
相比裸命令,compose.yaml 更利于持久化、扩展和团队协作。以下是最简但生产可用的配置:
services:
php:
image: dunglas/frankenphp
restart: always
ports:
- "80:80"
- "443:443"
- "443:443/udp"
volumes:
- .:/app
- caddy_data:/data
- caddy_config:/config
environment:
SERVER_NAME: your-domain.com # 替换为真实域名,启用 Let's Encrypt;若仅本地用,可设为 localhost 或省略
<p>volumes:
caddy_data:
caddy_config:-
caddy_data存证书(HTTPS)、caddy_config存动态生成的配置,确保重启后不丢失 -
SERVER_NAME是关键:设为域名时,Caddy 自动向 Let's Encrypt 申请真实证书;设为localhost则走本地签发 - 不需额外定义 network —— 默认 bridge 已满足 FrankenPHP 单容器需求
自定义 Caddy 行为:通过 Caddyfile.d 或环境变量
FrankenPHP 镜像内置的 Caddyfile 支持模块化扩展。推荐在项目根目录建 Caddyfile.d/ 文件夹,放入独立配置片段:
立即学习“PHP免费学习笔记(深入)”;
- 例如添加压缩支持:
Caddyfile.d/compression.caddyfile内容为encode zstd br gzip - 启用 Mercure(服务端推送):
Caddyfile.d/mercure.caddyfile内容参考官方文档开启mercure指令 - 所有
.caddyfile文件会被自动加载,比直接改镜像内主配置更安全、可版本管理
Dockerfile(定制镜像时使用)
若需构建专属镜像(如预装扩展、固定环境变量),Dockerfile 极简:
FROM dunglas/frankenphp ENV SERVER_NAME=prod.example.com ENV APP_ENV=prod COPY . /app RUN mv "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini"
-
COPY . /app覆盖整个项目(Laravel/Symfony 等框架必须完整复制,不只是public/) -
php.ini-production启用生产级 PHP 设置(禁用显示错误、启用 opcache 等) - 避免在 Dockerfile 中硬编码敏感信息,改用
docker-compose.yml的environment或 secrets



















