Por que a conteinerização de aplicações PHP com Docker é necessária?
O desenvolvimento web moderno em PHP raramente dispensa o uso de conteinerização. O Docker permite empacotar sua aplicação com todas as dependências (servidor web, extensões PHP, banco de dados) em um contêiner isolado. Isso garante que a aplicação funcione da mesma forma na máquina local do desenvolvedor, no servidor de teste e no ambiente de produção. Neste artigo, vamos analisar como configurar corretamente o Docker para PHP, criar um projeto pronto e discutir as melhores práticas.
Vantagens de usar Docker com PHP
- Reprodutibilidade do ambiente: esqueça o problema "funciona na minha máquina".
- Isolamento: cada aplicação vive em seu próprio contêiner com as versões necessárias do PHP e bibliotecas.
- Escalabilidade: fácil executar várias instâncias da aplicação com docker-compose.
- Simplificação de CI/CD: contêineres são ideais para pipelines de build e deploy automáticos.
Criação do Dockerfile para aplicação PHP
Vamos começar pelo mais importante — o arquivo Dockerfile. Ele descreve como a imagem da sua aplicação PHP será construída. Vejamos um exemplo básico para uma aplicação em PHP 8.2 com o servidor web Apache.
# DockerfileFROM php:8.2-apache
# Instalação de extensões PHPRUN docker-php-ext-install pdo pdo_mysql mysqli
# Ativação do mod_rewrite para Apache (útil para frameworks)RUN a2enmod rewrite
# Cópia do código fonte da aplicaçãoCOPY . /var/www/html/
# Alteração do proprietário para permissões corretasRUN chown -R www-data:www-data /var/www/html
# Abrir porta 80EXPOSE 80Este Dockerfile pega a imagem oficial do PHP 8.2 com Apache, instala os drivers para MySQL e copia seu código. Para projetos mais complexos, como Laravel ou Symfony, será necessária configuração adicional.
Exemplo para Laravel com Nginx e PHP-FPM
Para frameworks modernos, frequentemente se usa a combinação Nginx + PHP-FPM. Aqui está um exemplo de Dockerfile para PHP-FPM:
# Dockerfile.php-fpmFROM php:8.2-fpm
# Instalação de dependências do sistema e extensõesRUN apt-get update && apt-get install -y \ libpq-dev \ libzip-dev \ unzip \ git \ && docker-php-ext-install pdo pdo_mysql zip
# Instalação do ComposerCOPY --from=composer:latest /usr/bin/composer /usr/bin/composer
# Cópia do projetoWORKDIR /var/wwwCOPY . .
# Instalação das dependências PHPRUN composer install --no-interaction --optimize-autoloader
# Permissões para LaravelRUN chown -R www-data:www-data /var/www/storage /var/www/bootstrap/cache
CMD ["php-fpm"]E aqui está a configuração do Nginx, que precisará ser colocada em um contêiner separado via docker-compose:
# default.conf (para Nginx)server { listen 80; server_name localhost; root /var/www/public;
add_header X-Frame-Options "SAMEORIGIN"; add_header X-Content-Type-Options "nosniff";
index index.php;
charset utf-8;
location / { try_files $uri $uri/ /index.php?$query_string; }
location = /favicon.ico { access_log off; log_not_found off; } location = /robots.txt { access_log off; log_not_found off; }
error_page 404 /index.php;
location ~ \\.php$ { fastcgi_pass php:9000; fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; include fastcgi_params; }
location ~ /\\.(?!well-known).* { deny all; }}Orquestração com docker-compose
Para gerenciar vários contêineres (PHP, Nginx, MySQL), use o docker-compose.yml. Esta é a ferramenta padrão para desenvolvimento e teste locais.
# docker-compose.ymlversion: '3.8'
services: php: build: co