Docker y PHP: contenedorización de aplicaciones de nivel avanzado
\n\nLa contenedorización con Docker se ha convertido desde hace tiempo en el estándar para el desarrollo y despliegue de aplicaciones PHP. Conocimientos básicos como ejecutar un contenedor con PHP y Nginx es solo el primer paso. A nivel avanzado, se requiere la configuración de compilación en múltiples etapas, optimización del tamaño de las imágenes, trabajo con múltiples servicios, gestión de variables de entorno, integración con CI/CD y construcción de una arquitectura de microservicios. En este artículo, analizaremos las técnicas clave que le ayudarán a llevar la contenedorización de PHP al siguiente nivel.
\n\n1. Compilación en múltiples etapas (Multi-stage builds) para PHP
\n\nLa compilación en múltiples etapas permite utilizar múltiples instrucciones FROM en un mismo Dockerfile. Esto es ideal para aplicaciones PHP, donde en la etapa de compilación se necesitan Composer, Node.js y otras herramientas, pero en la imagen final solo deben incluirse los archivos compilados y un conjunto mínimo de dependencias.
Ejemplo de Dockerfile para una aplicación Laravel con compilación en múltiples etapas:
\n\n# Etapa 1: Instalación de dependencias y compilación\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# Etapa 2: Imagen final\nFROM php:8.2-fpm-alpine3.18 AS final\nWORKDIR /var/www/html\n\n# Instalación de extensiones PHP necesarias\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 solo los archivos necesarios de las etapas anteriores\nCOPY --from=vendor /app/vendor/ ./vendor/\nCOPY --from=frontend /app/public/build/ ./public/build/\nCOPY . .\n\n# Optimización para producción\nRUN php artisan optimize\n\nEXPOSE 9000\nCMD ["php-fpm"]\n\nVentajas clave:
\n- \n
- La imagen final contiene solo las dependencias de ejecución (PHP-FPM, extensiones, código). \n
- Las herramientas de compilación (Composer, Node.js) no llegan a producción. \n
- Reducción significativa del tamaño de la imagen (de 800-900 MB a 150-200 MB). \n
2. Optimización del tamaño de las imágenes Docker para PHP
\n\nLas imágenes pequeñas se cargan más rápido, requieren menos espacio en disco y reducen la superficie de ataque. Estrategias principales:
\n\n- \n
- Utilice versiones alpine de las imágenes base.
php:8.2-fpm-alpinepesa ~50 MB frente a ~400 MB de la estándarphp:8.2-fpm. \n - Minimice el número de capas. Combine comandos
RUNcon&&. \n - Elimine archivos temporales. Después de instalar extensiones, limpie la caché:
docker-php-source deleteyapk del .build-deps. \n - Utilice
.dockerignore. Excluya.git,node_modules,tests,.envy otros archivos innecesarios. \n
Ejemplo de .dockerignore avanzado:
.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 proyectos PHP complejos
\n\nPara aplicaciones PHP que utilizan bases de datos, colas, caché y servidor web, docker-compose.yml se convierte en el archivo de configuración central. Las configuraciones avanzadas incluyen:
- \n
- Redes (networks): aísle los servicios (por ejemplo, la base de datos no debe ser accesible desde el exterior). \n
- Volúmenes (volumes): <