Docker y PHP: técnicas avanzadas de contenerización de aplicaciones

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Docker y PHP: contenerización de aplicaciones a nivel avanzado



La contenerización de aplicaciones PHP con Docker hace tiempo que dejó de ser solo una herramienta conveniente para el desarrollo. A nivel avanzado, es la clave para crear entornos escalables, seguros y reproducibles. En este artículo, analizaremos técnicas que te ayudarán a pasar de la ejecución básica de un contenedor PHP a la orquestación profesional: compilación multi-etapa, optimización de imágenes, trabajo con Docker Compose para arquitectura de microservicios y almacenamiento en caché avanzado.



1. Compilación multi-etapa: imagen final mínima



Uno de los principales problemas de las imágenes Docker estándar es su tamaño. La imagen base php:8.2-apache pesa más de 400 MB, y con la instalación de extensiones, supera los 600 MB. Para producción, esto es inaceptable: una imagen grande se carga más lentamente, ocupa espacio en el registro y aumenta la superficie de ataque.



La compilación multi-etapa (multi-stage build) permite dividir el proceso en fases: una para la compilación e instalación de dependencias (con el conjunto completo de herramientas), y otra para el tiempo de ejecución mínimo. La imagen final contiene solo los artefactos compilados y las bibliotecas necesarias.



Ejemplo de Dockerfile para una aplicación Laravel:



# Etapa 1: Compilación e instalación de dependenciasFROM composer:latest AS vendorWORKDIR /appCOPY composer.json composer.lock ./RUN composer install --no-dev --optimize-autoloader --no-interaction

# Etapa 2: Compilación de recursos Node (si hay frontend)FROM node:18-alpine AS frontendWORKDIR /appCOPY package.json package-lock.json ./RUN npm ci --productionCOPY resources/ ./resources/RUN npm run production

# Etapa 3: Imagen PHP finalFROM php:8.2-fpm-alpine AS productionRUN docker-php-ext-install pdo_mysql opcacheCOPY --from=vendor /app/vendor /var/www/html/vendorCOPY --from=frontend /app/public/build /var/www/html/public/buildCOPY . /var/www/html

RUN chown -R www-data:www-data /var/www/html/storage /var/www/html/bootstrap/cacheEXPOSE 9000CMD ["php-fpm"]


Este enfoque reduce el tamaño de la imagen de más de 500 MB a aproximadamente 120 MB. composer:latest y node:18-alpine se utilizan solo en las etapas de compilación y no llegan a la capa final.



2. Optimización del almacenamiento en caché de capas de Docker



Cada instrucción en un Dockerfile crea una capa. Para acelerar las compilaciones repetidas, es necesario colocar las capas que raramente cambian lo antes posible. Para un proyecto PHP, esto significa:



  • Copiar composer.json y composer.lock antes de copiar el código.
  • Ejecutar composer install antes de copiar los archivos fuente.
  • Copiar el código al final.


Ejemplo de orden optimizado de instrucciones:



FROM php:8.2-fpm-alpine AS baseWORKDIR /var/www/html

# Instalamos dependencias del sistema una vezRUN apk add --no-cache $PHPIZE_DEPS \ && docker-php-ext-install pdo_mysql opcache bcmath

# Copiamos solo los archivos de dependenciasCOPY composer.json composer.lock ./RUN composer install --no-dev --no-interaction --no-scripts --prefer-dist

# Copiamos el resto del códigoCOPY . .

# Generamos la autocarga y optimizamosRUN composer dump-autoload --optimize


Consejo: usa .dockerignore para excluir vendor, .git, node_modules y otros archivos temporales del contexto de compilación. Esto acelerará la transferencia del contexto al demonio de Docker.



3. Docker Compose para arquitectura de microservicios



Las aplicaciones PHP modernas rara vez consisten en un solo servicio. Una arquitectura típica incluye PHP-FPM, Nginx, Redis, una cola de tareas (RabbitMQ/Beanstalkd) y una base de datos. Docker Compose permite describir toda la infraestructura en un solo docker-compose.yml.



Ejemplo de configuración para un microservicio en PHP:



version: '3.8'services:  app:    build:      context: .      target: production                

Blogs

Book Recommendations