PHP应用需先打包为容器镜像才能在Kubernetes运行;使用php:8.2-apache或php-fpm+Nginx镜像,注意权限、环境配置、健康检查路径、Service标签匹配及opcache/autoload预构建。

PHP 应用本身不能直接“实现 Kubernetes 部署”——Kubernetes 不运行 PHP,它运行容器;你需要先将 PHP 应用打包成容器镜像,再通过 YAML 描述其在集群中的运行方式。
怎么写一个能跑 PHP 的 Dockerfile
很多 PHP 开发者卡在第一步:本地能跑的代码,放进容器就 500 或 404。核心是别直接抄 Apache 官方镜像的默认配置,要适配你的项目结构。
- 用
php:8.2-apache基础镜像(带 mod_rewrite,适合 Laravel/ThinkPHP 等)或php:8.2-fpm+ 单独 Nginx 容器(更贴近生产) -
COPY . /var/www/html/后必须执行RUN chown -R www-data:www-data /var/www/html/,否则 Apache 进程无权读取文件 - Laravel 项目要额外加
RUN cp .env.example .env && php artisan key:generate,否则容器启动后报Application key not set - 别在 Dockerfile 里写
EXPOSE 80来“开放端口”——这只是文档说明,真正生效靠的是 Pod 的ports字段
Deployment YAML 怎么写才不挂
常见错误是把本地开发的 docker run -p 8080:80 思维直接搬进 YAML,结果 Service 访问超时、Pod 一直 CrashLoopBackOff。
- 容器内 PHP-Apache 默认监听
0.0.0.0:80,YAML 中containers[].ports[].containerPort必须设为80,不能写成8080 - 健康检查要用
livenessProbe和readinessProbe,但路径别写成/healthz—— PHP 项目没这个路由,改用/index.php或自建/ping路由返回 200 - 如果用了
php-fpm,Deployment 中必须同时定义fpm和nginx两个容器,并用emptyDir共享/var/www/html,否则 Nginx 找不到 PHP 文件 - 环境变量别硬编码进 YAML,用
configMapRef或secretRef引入,比如数据库密码必须走Secret
kubectl apply 之后为什么 curl 不通
90% 的“部署成功但访问不了”问题出在 Service 和 Ingress 配置脱节,不是 PHP 代码或镜像的问题。
- 确认 Service 的
selector标签和 Deployment 的template.metadata.labels完全一致,一个字母都不能错(app: my-php-app≠app: my-phpapp) - Service 类型选
ClusterIP只能在集群内访问;想从外部访问,要么改NodePort(注意端口范围 30000–32767),要么配 Ingress 并确保 Ingress Controller(如 nginx-ingress)已运行 - 用
kubectl get endpoints my-php-service查看后端是否注册成功——如果显示,说明标签不匹配或 Pod 没 ready(看readinessProbe是否通过) - 调试时别只看
kubectl get pods,要kubectl logs -f,Apache 错误日志在/var/log/apache2/error.log,PHP-FPM 日志默认不输出到 stdout,需在www.conf中设catch_workers_output = yes
最易被忽略的一点:Kubernetes 不处理 PHP 的 opcache 清理、session 存储、或 Composer autoload 生成——这些都得在构建镜像时完成,而不是指望容器启动时再跑命令。上线前务必验证镜像内 php -m | grep opcache 和 ls -l vendor/autoload.php 都存在且可读。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











