Por qué tu proyecto PHP merece Docker
\n\n¿Alguna vez has pasado medio día explicando a un nuevo desarrollador cómo configurar el entorno? ¿O te has enfrentado a una situación donde el código funciona en tu localhost, pero falla en el servidor? ¿Te suena familiar? Entonces este artículo es para ti.
Docker no es solo una palabra de moda. Es una herramienta que transforma la frase «en mi máquina funciona» en «funciona para todos». Para un desarrollador PHP, la contenerización es un superpoder: empaquetas la aplicación, el servidor web y la base de datos en contenedores ligeros que se comportan exactamente igual en cualquier máquina.
\n\nEn esta guía no leeremos teoría aburrida. Iremos directo al grano: escribiremos un Dockerfile para PHP, configuraremos el conjunto Nginx + PHP-FPM + MySQL mediante Docker Compose y desplegaremos una aplicación real. ¡Zas, y tu proyecto está listo para el deploy!
\n\n¿Qué es la contenerización y por qué la necesita un desarrollador PHP?
\n\nImagina que te mudas a un nuevo apartamento. En lugar de tener que montar los muebles desde cero cada vez (instalar PHP, configurar Apache, añadir módulos), simplemente coges una caja ya preparada con tu entorno. Docker son esas cajas. Se llaman contenedores.
\n\nPara PHP esto es especialmente relevante. Las versiones de PHP cambian, se requieren diferentes extensiones (gd, mysqli, redis), y en producción todo debe ser estable. La contenerización resuelve tres problemas principales:
\n- \n
- Reproducibilidad — el entorno es el mismo para todos: desarrollador, tester, servidor. \n
- Aislamiento — los proyectos no entran en conflicto (nunca más se te romperá un sitio antiguo por una actualización de PHP). \n
- Simplicidad en el despliegue — ejecución con un solo comando
docker-compose up. \n
Preparando el Dockerfile para la aplicación PHP
\n\nEmpecemos por lo principal: crear la imagen para nuestro proyecto PHP. Supongamos que tenemos una aplicación simple en PHP 8.2 usando PDO para trabajar con MySQL. Así es como se ve un Dockerfile mínimo:
# Usamos la imagen oficial de PHP 8.2 con FPM\nFROM php:8.2-fpm-alpine\n\n# Instalamos los paquetes del sistema necesarios\nRUN apk add --no-cache \\\n nginx \\\n supervisor \\\n libpq-dev \\\n && docker-php-ext-install pdo pdo_mysql\n\n# Copiamos las configuraciones (las crearemos después)\nCOPY ./docker/nginx.conf /etc/nginx/nginx.conf\nCOPY ./docker/supervisord.conf /etc/supervisord.conf\n\n# Copiamos el código de la aplicación\nCOPY . /var/www/html\n\n# Permisos de escritura para logs y caché\nRUN chown -R www-data:www-data /var/www/html/storage /var/www/html/bootstrap/cache\n\n# Abrimos los puertos\nEXPOSE 80\n\n# Iniciamos supervisor (gestionará nginx y php-fpm)\nCMD ["/usr/bin/supervisord", "-c", "/etc/supervisord.conf"]\n\n¿Qué es importante aquí? Usamos la versión alpine — pesa mucho menos. Instalamos solo las extensiones necesarias mediante docker-php-ext-install. Y sí, usamos supervisor para que dentro de un solo contenedor se ejecuten tanto Nginx como PHP-FPM. Esto es conveniente para proyectos pequeños.
Creando la configuración de Nginx
\n\nAhora necesitamos configurar el servidor web. Cree el archivo docker/nginx.conf:
worker_processes auto;\nevents {\n worker_connections 1024;\n}\n\nhttp {\n include /etc/nginx/mime.types;\n default_type application/octet-stream;\n\n server {\n listen 80;\n server_name _;\n root /var/www/html/public;\n index index.php index.html;\n\n location / {\n try_files $uri $uri/ /index.php?$query_string;\n }\n\n location ~ \\.php$ {\n fastcgi_pass 127.0.0.1:9000;\n fastcgi_index index.php;\n fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;\n include fastcgi_params;\n }\n }\n}\n\nTenga en cuenta: PHP-FPM escucha en el puerto 9000 dentro del contenedor.