最小可行命令是docker run -p 8080:8080 dunglas/frankenphp,它启动内置服务器监听容器内8080端口,通过端口映射使宿主机可访问,默认返回“hello, frankenphp!”。

docker run 启动 FrankenPHP 的最小可行命令
直接用 docker run 跑 FrankenPHP,不挂卷、不映射端口、不加配置,也能启动并响应 HTTP 请求——但默认只监听 127.0.0.1:8080(容器内),外部访问不到。所以「最简可用」必须包含端口映射。
这条命令就能跑起来并从宿主机访问:
docker run -p 8080:8080 dunglas/frankenphp
它会启动 FrankenPHP 内置服务器,用默认的 index.php 响应 GET /,返回 “Hello, FrankenPHP!”。
- 镜像
dunglas/frankenphp是官方维护的,基于 PHP 8.3 + Swoole,开箱即用 -
-p 8080:8080是必须的,否则容器内服务对外不可达 - 不指定
--entrypoint或命令,默认走frankenphp serve,监听:8080 - 没有
-v挂载时,它用内置的 demoindex.php,不是空目录报错
为什么不用 -d 或 --name 也行,但建议加
上面那条命令是前台运行,终端会被占住。实际调试或长期运行,你大概率要加 -d;如果后续要进容器看日志或文件,--name 能避免每次用随机 ID。
推荐调试用的「稍完整但依然极简」版本:
docker run -d -p 8080:8080 --name frankenphp dunglas/frankenphp
- 加
-d后,容器后台运行,输出的是 container ID - 加
--name frankenphp后,可以用docker logs frankenphp看启动日志 - 如果端口被占,会报错
Bind for 0.0.0.0:8080 failed: port is already allocated,换端口即可(如-p 8081:8080)
想跑自己的 PHP 文件?必须挂载 -v
FrankenPHP 默认不读取当前目录,也不自动扫描 ./public。不挂卷就只能用内置 demo。要跑自己写的 index.php,得明确挂载,并指定文档根目录。
假设你当前目录下有 index.php,内容是 <?php echo "OK"; ?>,那么命令是:
docker run -d -p 8080:8080 -v $(pwd):/app --workdir /app dunglas/frankenphp
-
-v $(pwd):/app把当前目录挂到容器/app,FrankenPHP 默认从工作目录找index.php -
--workdir /app很关键:不加的话,它仍在镜像默认路径(/var/www)找文件,而那里没你的代码 - 也可以用
frankenphp serve --document-root ./public自定义入口,但那就不是「最简命令」了
常见启动失败原因和对应检查点
执行 docker run 后容器秒退,docker logs 显示空白或报错,大概率是下面几个问题之一:
- 端口冲突 → 改
-p后面的宿主机端口,或lsof -i :8080杀掉占用进程 - 挂了空目录且没
index.php→ FrankenPHP 要求文档根下至少存在index.php或router.php,否则直接 exit 1 - 用了 Windows PowerShell 但写了
$(pwd)→ 应该用${PWD}或绝对路径,PowerShell 不识别$()执行语法 - 镜像拉取失败 → 运行前先
docker pull dunglas/frankenphp确认本地有最新版
FrankenPHP 对目录结构比传统 PHP-FPM 更敏感,它不靠配置文件兜底,而是靠约定路径和存在性检查来决定是否启动成功。这点容易被忽略。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











