Docker e PHP: conteinerização de aplicações de nível avançado
\n\nA conteinerização com Docker há muito se tornou o padrão para desenvolvimento e implantação de aplicações PHP. Conhecimentos básicos — executar um contêiner com PHP e Nginx — é apenas o primeiro passo. No nível avançado, é necessário configurar a construção em múltiplos estágios, otimizar o tamanho das imagens, trabalhar com vários serviços, gerenciar variáveis de ambiente, integrar com CI/CD e construir uma arquitetura de microsserviços. Neste artigo, abordaremos as principais técnicas que o ajudarão a elevar a conteinerização PHP a um novo nível.
\n\n1. Construção em múltiplos estágios (Multi-stage builds) para PHP
\n\nA construção em múltiplos estágios permite usar várias instruções FROM em um único Dockerfile. Isso é ideal para aplicações PHP, onde na fase de construção são necessários Composer, Node.js e outras ferramentas, mas na imagem final devem entrar apenas os arquivos compilados e um conjunto mínimo de dependências.
Exemplo de Dockerfile para uma aplicação Laravel com construção em múltiplos estágios:
\n\n# Estágio 1: Instalação de dependências e construção\nFROM composer:2.5 AS vendor\nWORKDIR /app\nCOPY composer.json composer.lock ./\nRUN composer install --no-dev --optimize-autoloader --no-interaction\n\nFROM node:18 AS frontend\nWORKDIR /app\nCOPY package.json package-lock.json ./\nRUN npm ci --only=production\nCOPY resources/ ./resources/\nRUN npm run production\n\n# Estágio 2: Imagem final\nFROM php:8.2-fpm-alpine3.18 AS final\nWORKDIR /var/www/html\n\n# Instalação das extensões PHP necessárias\nRUN apk add --no-cache \\\n libpng-dev \\\n libjpeg-turbo-dev \\\n freetype-dev \\\n libzip-dev \\\n oniguruma-dev \\\n && docker-php-ext-configure gd --with-freetype --with-jpeg \\\n && docker-php-ext-install -j$(nproc) \\\n pdo_mysql \\\n mbstring \\\n gd \\\n zip \\\n opcache\n\n# Copiar apenas os arquivos necessários dos estágios anteriores\nCOPY --from=vendor /app/vendor/ ./vendor/\nCOPY --from=frontend /app/public/build/ ./public/build/\nCOPY . .\n\n# Otimização para produção\nRUN php artisan optimize\n\nEXPOSE 9000\nCMD ["php-fpm"]\n\nPrincipais vantagens:
\n- \n
- A imagem final contém apenas dependências de runtime (PHP-FPM, extensões, código). \n
- As ferramentas de construção (Composer, Node.js) não entram em produção. \n
- Redução significativa do tamanho da imagem (de 800-900 MB para 150-200 MB). \n
2. Otimização do tamanho das imagens Docker para PHP
\n\nImagens pequenas carregam mais rápido, exigem menos espaço em disco e reduzem a superfície de ataque. Principais estratégias:
\n\n- \n
- Use versões alpine das imagens base.
php:8.2-fpm-alpinepesa ~50 MB contra ~400 MB daphp:8.2-fpmpadrão. \n - Minimize o número de camadas. Combine comandos
RUNcom&&. \n - Remova arquivos temporários. Após instalar extensões, limpe o cache:
docker-php-source deleteeapk del .build-deps. \n - Use
.dockerignore. Exclua.git,node_modules,tests,.enve outros arquivos desnecessários. \n
Exemplo de .dockerignore avançado:
.git\n.gitignore\n.env\n.env.example\nnode_modules\ntests\nstorage/logs/*\n!storage/logs/.gitkeep\ndocker-compose.yml\nMakefile\nREADME.md\n\n3. Docker Compose para projetos PHP complexos
\n\nPara aplicações PHP que utilizam bancos de dados, filas, cache e servidor web, o docker-compose.yml se torna o arquivo central de configuração. Configurações avançadas incluem:
- \n
- Redes (networks): isole os serviços (por exemplo, o banco de dados não deve estar acessível externamente). \n
- Volumes:<