Docker e PHP: conteinerização de aplicações do A ao Z
A conteinerização de aplicações PHP com Docker tornou-se o padrão do desenvolvimento web moderno. Independentemente de você estar criando uma landing page simples ou uma aplicação corporativa complexa, o Docker garante uniformidade de ambiente em todas as etapas: do desenvolvimento local à produção. Neste artigo, abordaremos todas as etapas da criação de uma infraestrutura Docker para uma aplicação PHP — desde o Dockerfile básico até uma stack completa com Nginx e MySQL.
Por que o Docker é importante para o desenvolvedor PHP
O desenvolvimento PHP tradicional frequentemente enfrenta o problema "funciona na minha máquina". Versões diferentes do PHP, extensões, configurações do servidor — tudo isso leva a conflitos. O Docker resolve esse problema de uma vez por todas:
- Isolamento de ambiente — cada aplicação tem seu próprio conjunto de dependências
- Reprodutibilidade — ambiente idêntico em todas as máquinas
- Escalabilidade — fácil adicionar novos serviços (Redis, Elasticsearch)
- Integração CI/CD — contêineres são ideais para pipelines
Vamos passar da teoria à prática e criar um ambiente Docker completo para uma aplicação PHP.
Criação do Dockerfile básico para PHP
Vamos começar pelo mais importante — o Dockerfile. Esta é a instrução para construir a imagem da sua aplicação PHP. Aqui está a configuração ideal para uma aplicação pronta para produção:
# Usamos a imagem oficial PHP com FPMFROM php:8.2-fpm-alpine
# Instalação de dependências do sistemaRUN apk add --no-cache \ git \ unzip \ libpq-dev \ libzip-dev \ && docker-php-ext-install \ pdo_mysql \ zip \ opcache
# Instalação do ComposerCOPY --from=composer:latest /usr/bin/composer /usr/bin/composer
# Configuração do OPcache para produçãoRUN { \ echo 'opcache.memory_consumption=128'; \ echo 'opcache.interned_strings_buffer=8'; \ echo 'opcache.max_accelerated_files=4000'; \ echo 'opcache.revalidate_freq=2'; \ echo 'opcache.fast_shutdown=1'; \ echo 'opcache.enable_cli=1'; \} > /usr/local/etc/php/conf.d/opcache.ini
# Copiamos os arquivos da aplicaçãoWORKDIR /var/www/htmlCOPY . .
# Definimos permissõesRUN chown -R www-data:www-data /var/www/html \ && chmod -R 755 storage bootstrap/cache
# Iniciamos o PHP-FPMCMD ["php-fpm"]
EXPOSE 9000Este Dockerfile usa Alpine Linux — uma imagem mínima que reduz significativamente o tamanho do contêiner final. Instalamos apenas as extensões necessárias: pdo_mysql para trabalhar com banco de dados e zip para o Composer.
Construção e execução do contêiner
# Construção da imagemdocker build -t my-php-app .
# Execução do contêinerdocker run -d -p 9000:9000 --name php-app my-php-appStack completa com Nginx e MySQL via docker-compose
Uma aplicação real raramente consiste em apenas um contêiner PHP. Precisamos de um servidor web e um banco de dados. É aqui que o docker-compose entra em ação — uma ferramenta para orquestrar múltiplos contêineres.
Vamos criar o arquivo docker-compose.yml:
version: '3.8'
services: # Serviço PHP-FPM app: build: context: . dockerfile: Dockerfile container_name: php-app volumes: - ./:/var/www/html networks: - app-network
# Servidor web Nginx nginx: image: nginx:alpine container_name: php-nginx ports: - "8080:80" volumes: - ./:/var/www/html - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf depends_on: - app networks: - app-network
# Banco de dados MySQL db: image: mysql:8.0 container_name: php-mysql ports: - "3306:3306" environment: MYSQL_ROOT_PASSWORD: root_password MYSQL_DATABASE: app_database MYSQL_USER: app_user MYSQL_