Docker y PHP: contenedorización de aplicaciones de nivel avanzado

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: contenedorización de aplicaciones de nivel avanzado

\n\n

La 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\n

1. Compilación en múltiples etapas (Multi-stage builds) para PHP

\n\n

La 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.

\n\n

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\n

Ventajas 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
\n\n

2. Optimización del tamaño de las imágenes Docker para PHP

\n\n

Las 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-alpine pesa ~50 MB frente a ~400 MB de la estándar php:8.2-fpm.
  • \n
  • Minimice el número de capas. Combine comandos RUN con &&.
  • \n
  • Elimine archivos temporales. Después de instalar extensiones, limpie la caché: docker-php-source delete y apk del .build-deps.
  • \n
  • Utilice .dockerignore. Excluya .git, node_modules, tests, .env y otros archivos innecesarios.
  • \n
\n\n

Ejemplo de .dockerignore avanzado:

\n\n
.git\n.gitignore\n.env\n.env.example\nnode_modules\ntests\nstorage/logs/*\n!storage/logs/.gitkeep\ndocker-compose.yml\nMakefile\nREADME.md
\n\n

3. Docker Compose para proyectos PHP complejos

\n\n

Para 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\n
    \n
  • Redes (networks): aísle los servicios (por ejemplo, la base de datos no debe ser accesible desde el exterior).
  • \n
  • Volúmenes (volumes): <

Blogs

Book Recommendations