Implantação de PHP no Kubernetes: guia prático passo a passo

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Introdução: Por que implantar PHP no Kubernetes?

\n\n

Muitos desenvolvedores ainda veem o PHP como uma linguagem para hospedagem "clássica" com FTP e phpMyAdmin. No entanto, na cultura DevOps moderna, as aplicações PHP estão cada vez mais sendo executadas em contêineres, e o gerenciamento delas fica a cargo do Kubernetes (K8s). Isso proporciona não apenas escalabilidade automática e tolerância a falhas, mas também uniformidade de ambiente em todas as etapas — do desenvolvimento à produção.

\n\n

Neste guia, vamos abordar na prática como preparar um projeto PHP para implantação no Kubernetes: desde a criação da imagem Docker até a escrita de manifestos e execução no cluster. Você aprenderá como tornar o contêiner leve, como configurar corretamente o php-fpm e como conectar tudo ao Nginx. Vamos lá!

\n\n

Passo 1: Preparação da aplicação PHP e da imagem Docker

\n\n

Antes de enviar o código para o K8s, é necessário empacotá-lo em uma imagem Docker. Vamos considerar um projeto PHP típico em PHP puro (sem framework) — um script simples que exibe uma saudação e o phpinfo.

\n\n

1.1. Estrutura do projeto

\n\n

Vamos criar uma estrutura mínima:

\n\n
my-php-app/\n├── src/\n│   └── index.php\n├── docker/\n│   ├── php.Dockerfile\n│   └── nginx.conf\n└── k8s/\n    ├── deployment.yaml\n    └── service.yaml\n
\n\n

1.2. Código da aplicação PHP

\n\n

Arquivo src/index.php:

\n\n
<?php\necho "<h1>Olá, Kubernetes!</h1>";\necho "<p>Versão do PHP: " . phpversion() . "</p>";\necho "<p>Servidor: " . gethostname() . "</p>";\n?>\n
\n\n

1.3. Dockerfile para PHP-FPM

\n\n

Criando docker/php.Dockerfile:

\n\n
FROM php:8.2-fpm-alpine\n\n# Instala dependências (se necessário)\nRUN docker-php-ext-install pdo pdo_mysql\n\n# Copia o código da aplicação\nCOPY ./src /var/www/html\n\n# Permissões (importante para FPM)\nRUN chown -R www-data:www-data /var/www/html\n\nWORKDIR /var/www/html\n\nEXPOSE 9000\nCMD ["php-fpm"]\n
\n\n

Por que alpine? Ele fornece uma imagem de ~30 MB em vez de 200+ MB no Debian. Isso é crítico para carregamento rápido no cluster.

\n\n

1.4. Configuração do Nginx

\n\n

O PHP-FPM não consegue servir arquivos estáticos diretamente — é necessário um servidor web. Vamos criar docker/nginx.conf:

\n\n
server {\n    listen 80;\n    server_name _;\n    root /var/www/html;\n\n    index index.php index.html;\n\n    location / {\n        try_files $uri $uri/ /index.php?$query_string;\n    }\n\n    location ~ \\.php$ {\n        fastcgi_pass 127.0.0.1:9000;\n        fastcgi_index index.php;\n        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;\n        include fastcgi_params;\n    }\n}\n
\n\n

No Kubernetes, executaremos o Nginx e o PHP-FPM em um único Pod (como contêineres sidecar) ou como serviços separados. Para simplificar, usaremos um Pod com dois contêineres.

\n\n

Passo 2: Criação e publicação das imagens

\n\n

Vamos criar a imagem PHP-FPM e a imagem Nginx com nossa configuração. Em um projeto real, você pode usar uma única imagem combinando Nginx e PHP com supervisord, mas faremos "corretamente" — separando.

\n\n

Criação da imagem PHP:

\n
docker build -t my-php-app:latest -f docker/php.Dockerfile .\n
\n\n

Criação da imagem Nginx:

\n

Vamos criar um Dockerfile separado para o Nginx:

\n
FROM nginx:alpine\nCOPY docker/nginx.conf /etc/nginx/conf.d/default.conf\nCOPY ./src /var/www/html\n
\n\n
docker build -t my-nginx:latest -f docker/nginx.Dockerfile .\n
\n\n

Em seguida, envie as imagens para um registry (Docker Hub, GitLab Container Registry, etc.):

\n
docker tag my-php-app:latest seu-registry/my-php-app:latest\ndocker push seu-registry/my-php-app:latest\n
\n\n

Passo 3: Manifestos do Kubernetes

\n\n

Agora a parte mais interessante — vamos descrever como o Kubernetes executará nossa aplicação.

\n\n

3.1. Deployment (manifesto principal

Blogs

Book Recommendations