¿Por qué es necesaria la contenedorización de aplicaciones PHP con Docker?
El desarrollo web moderno en PHP rara vez prescinde del uso de la contenedorización. Docker permite empaquetar tu aplicación con todas sus dependencias (servidor web, extensiones PHP, base de datos) en un contenedor aislado. Esto garantiza que la aplicación funcione igual en la máquina local del desarrollador, en el servidor de pruebas y en el entorno de producción. En este artículo, analizaremos cómo configurar correctamente Docker para PHP, crearemos un proyecto listo y revisaremos las mejores prácticas.
Ventajas de usar Docker con PHP
- Reproducibilidad del entorno: olvídate del problema "en mi máquina funciona".
- Aislamiento: cada aplicación vive en su propio contenedor con las versiones necesarias de PHP y librerías.
- Escalabilidad: es fácil ejecutar varias instancias de la aplicación usando docker-compose.
- Simplificación de CI/CD: los contenedores son ideales para pipelines de compilación y despliegue automáticos.
Creación del Dockerfile para una aplicación PHP
Empecemos por lo más importante: el archivo Dockerfile. Este describe cómo se construirá la imagen de tu aplicación PHP. Veamos un ejemplo básico para una aplicación en PHP 8.2 con el servidor web Apache.
# DockerfileFROM php:8.2-apache
# Instalación de extensiones PHPRUN docker-php-ext-install pdo pdo_mysql mysqli
# Habilitación de mod_rewrite para Apache (útil para frameworks)RUN a2enmod rewrite
# Copia del código fuente de la aplicaciónCOPY . /var/www/html/
# Cambio de propietario para permisos correctosRUN chown -R www-data:www-data /var/www/html
# Abrimos el puerto 80EXPOSE 80Este Dockerfile toma la imagen oficial de PHP 8.2 con Apache, instala los controladores para MySQL y copia tu código. Para proyectos más complejos, como Laravel o Symfony, se necesitará configuración adicional.
Ejemplo para Laravel con Nginx y PHP-FPM
Para frameworks modernos, a menudo se usa la combinación Nginx + PHP-FPM. Aquí tienes un ejemplo de Dockerfile para PHP-FPM:
# Dockerfile.php-fpmFROM php:8.2-fpm
# Instalación de dependencias del sistema y extensionesRUN apt-get update && apt-get install -y \ libpq-dev \ libzip-dev \ unzip \ git \ && docker-php-ext-install pdo pdo_mysql zip
# Instalación de ComposerCOPY --from=composer:latest /usr/bin/composer /usr/bin/composer
# Copia del proyectoWORKDIR /var/wwwCOPY . .
# Instalación de dependencias PHPRUN composer install --no-interaction --optimize-autoloader
# Permisos para LaravelRUN chown -R www-data:www-data /var/www/storage /var/www/bootstrap/cache
CMD ["php-fpm"]Y aquí está la configuración de Nginx, que deberás colocar en un contenedor separado a través de docker-compose:
# default.conf (para Nginx)server { listen 80; server_name localhost; root /var/www/public;
add_header X-Frame-Options "SAMEORIGIN"; add_header X-Content-Type-Options "nosniff";
index index.php;
charset utf-8;
location / { try_files $uri $uri/ /index.php?$query_string; }
location = /favicon.ico { access_log off; log_not_found off; } location = /robots.txt { access_log off; log_not_found off; }
error_page 404 /index.php;
location ~ \\.php$ { fastcgi_pass php:9000; fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; include fastcgi_params; }
location ~ /\\.(?!well-known).* { deny all; }}Orquestación con docker-compose
Para gestionar múltiples contenedores (PHP, Nginx, MySQL) usa docker-compose.yml. Esta es la herramienta estándar para el desarrollo y pruebas locales.
# docker-compose.ymlversion: '3.8'
services: php: build: co