frankenphp容器在kubernetes中containerport必须严格匹配其实际监听端口:默认http服务为80,fpm接口为9001;若用--fpm-port自定义,则需同步更新;需在deployment中显式声明name和protocol,并与service的targetport名称对齐,否则流量转发失败。

containerPort 必须和 PHP-FPM 监听端口一致
FrankenPHP 容器在 Kubernetes 中的 containerPort 不是随便填的数字,它必须严格匹配容器内 FrankenPHP 实际监听的端口。默认情况下,FrankenPHP 的 PHP-FPM worker 进程监听的是 9001(不是传统 PHP-FPM 的 9000),这是由其内置运行时决定的。如果你改用 --fpm-port 启动参数自定义了端口,containerPort 就得同步改成那个值。
- 不写
containerPort不报错,但 Service 的targetPort就无法可靠指向——Kubernetes 不会校验它是否真实监听,只当它是文档性声明 - 写错(比如写成
80或9000)会导致流量转发失败:Service 认为能通,实际 Pod 内没进程在听,连接直接被拒绝(connection refused) - FrankenPHP 官方镜像中未设置
EXPOSE,所以 Docker 层面不会自动暴露端口,Kubernetes 更依赖你显式声明containerPort
Deployment YAML 里怎么写 containerPort
在 Deployment 的容器定义段中,containerPort 是一个数组项,需明确指定协议和名称(推荐),便于后续 Service 引用。它不控制端口开放,只用于内部路由标识。
containers:
- name: frankenphp
image: dunglas/frankenphp:1.2
ports:
- name: http
containerPort: 80
protocol: TCP
- name: fpm
containerPort: 9001
protocol: TCP
- FrankenPHP 默认同时提供 HTTP 服务(
80)和 FPM 接口(9001)。若你用 Nginx 做反向代理,通常只暴露80给 Service;若其他 Pod 需直连 FPM(少见),才需暴露9001 -
name字段必须和 Service 的ports[].name对齐,否则targetPort用名字引用会失败 - 不要把
containerPort和宿主机端口混淆——Kubernetes 没有 hostPort 场景下,它完全不涉及节点网络绑定
为什么 targetPort 不能直接写数字而要靠 containerPort 对齐
Service 的 targetPort 支持数字或字符串。当你用字符串(如 targetPort: fpm)时,Kubernetes 会去匹配容器的 ports[].name;当你用数字(如 targetPort: 9001),它其实绕过了 containerPort 声明,直接发包到容器 IP 的该端口。但问题在于:一旦 FrankenPHP 启动参数变了端口,Service 却没改,就断了。
- 用名字引用(
targetPort: fpm)+ 显式声明containerPort+name,是最安全的耦合方式,Kubernetes 能做基础校验 - 如果 Deployment 里漏写了
name: fpm,Service 就没法用名字引用,只能硬编码数字——这会让配置变脆弱,尤其在多环境部署时容易出错 - 注意:Pod 的
containerPort和 Service 的port是两层概念,前者是容器内端口,后者是 ClusterIP 上的服务端口,二者可以不同
容易被忽略的兼容细节
FrankenPHP 的 9001 是 FPM 协议端口,不是 HTTP。如果你在 Service 中把 targetPort: 9001 指向一个本应处理 HTTP 的 Ingress Controller,请求会直接失败——因为协议不匹配。这种错误不会报错,只会返回空响应或 502。
- 绝大多数生产场景下,你应该让 FrankenPHP 自己监听
80并对外提供 HTTP 服务,而不是把它当纯 FPM 后端;此时containerPort: 80是主通道,9001可以不暴露 - 如果你用 Caddy 或 Nginx 做前置代理,且它们和 FrankenPHP 在同一个 Pod(sidecar 模式),那
containerPort: 9001才有意义,且必须确保 sidecar 容器能通过localhost:9001访问到 - 检查是否生效:用
kubectl exec -it <pod-name> -- ss -tlnp | grep :9001</pod-name>确认进程确实在监听,别只信配置
FrankenPHP 的 containerPort 看似只是个数字,但它卡在镜像行为、启动参数、Service 路由、协议语义四者的交界处——少对齐一环,排查时就得翻三遍日志。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











