必须显式指定-p映射端口,因FrankenPHP默认监听:8080和:9001但Docker不自动暴露;-p左边为宿主机端口、右边为容器内监听端口,须与SERVER_NAME=:端口一致,否则HTTP_HOST异常或服务不可达。

docker run 启动时必须显式指定 -p 映射
FrankenPHP 容器默认监听 :8080(HTTP)和 :9001(FPM),但 Docker 不会自动把容器端口暴露到宿主机。不加 -p,外部根本连不上——哪怕容器里服务已正常启动。
要让多个 FrankenPHP 容器分别用不同宿主机端口,比如一个占 8080、另一个占 8081,就得为每个容器单独写映射:
-
docker run -p 8080:8080 dunglas/frankenphp→ 宿主机8080转发到容器内:8080 -
docker run -p 8081:8080 dunglas/frankenphp→ 宿主机8081也转发到容器内:8080(FrankenPHP 默认端口)
注意:冒号右边是容器内监听端口,不是随便写的;左边才是你真正想对外暴露的宿主机端口。
SERVER_NAME=:端口 必须与容器内监听端口一致
如果你改了容器内监听端口(比如想让它监听 :8081),光靠 -p 8081:8081 不够,还得告诉 FrankenPHP 别按默认 :8080 启动——否则它还是只听 :8080,而你映射的是 :8081,请求就进不去。
立即学习“PHP免费学习笔记(深入)”;
这时必须配合 SERVER_NAME=:8081 环境变量:
docker run -e SERVER_NAME=:8081 -p 8081:8081 dunglas/frankenphp- 不能写
SERVER_NAME=localhost:8081或SERVER_NAME=example.com:8081——Caddy 不认带端口的主机名,会 fallback 到默认行为 -
SERVER_NAME=:8081的作用是关闭 HTTPS 自动申请、强制纯 HTTP 模式、且监听:8081
多个容器共存时,避免端口冲突和环境变量混淆
常见错误是复制粘贴命令后忘了改端口号,导致第二个容器启动失败(port is already allocated)或请求被路由到错误实例。
建议做法:
- 每个容器用唯一
-p组合,如-p 8080:8080、-p 8081:8080、-p 8082:8080……保持右边一致(都用默认:8080),左边递增 - 如果要用非默认端口(如
:8000),则必须同步改SERVER_NAME=:8000和-p 8000:8000,两边端口数字必须完全一致 - 不要混用:比如
SERVER_NAME=:8080却只写-p 8081:8080——虽然能通,但$_SERVER['HTTP_HOST']会变成localhost:8081,可能影响 Laravel 的APP_URL或前端重定向逻辑
Kubernetes 中 containerPort 和 Service targetPort 的对齐要点
在 K8s 里,多个 FrankenPHP Pod 想分别暴露不同端口,关键不在容器本身,而在 Service 的 targetPort 如何指向。
例如两个 Deployment 分别跑在 containerPort: 8080 和 containerPort: 8081,对应 Service 就得分别写:
- Service A:
targetPort: 8080(数字)或targetPort: http-8080(需在容器 ports[].name 中定义) - Service B:
targetPort: 8081或targetPort: http-8081 - 如果用名字引用(推荐),必须确保容器 spec 中
ports[].name唯一且匹配,否则targetPort查不到目标
容易忽略的是:containerPort 在 K8s 中只是声明用途,不绑定宿主机端口;真正决定流量走向的是 Service 的 port + targetPort 组合。没配 Service,Pod 再多端口也没法从集群外访问。



















