Docker y PHP: guía completa para la contenerización de aplicaciones
El desarrollo web moderno es impensable sin la contenerización. Docker se ha convertido en el estándar de facto para empaquetar, distribuir y ejecutar aplicaciones. Para los desarrolladores de PHP, el uso de Docker resuelve múltiples problemas: desde la incompatibilidad de versiones de PHP hasta las dificultades de configuración del entorno en diferentes máquinas. En este artículo, analizaremos cómo contenerizar una aplicación PHP desde cero, utilizando Docker y docker-compose.
1. Fundamentos de Docker para el desarrollador de PHP
Docker es una plataforma para desarrollar, distribuir y ejecutar aplicaciones en entornos aislados (contenedores). Cada contenedor contiene todo lo necesario para funcionar: código, bibliotecas, utilidades del sistema y configuraciones. Para PHP esto es especialmente relevante, ya que la aplicación a menudo depende de una versión específica del intérprete, extensiones (por ejemplo, pdo_mysql, redis, gd) y del servidor web (Apache o Nginx).
Componentes principales de Docker:
- Dockerfile — archivo de texto con instrucciones para construir la imagen.
- Imagen (Image) — plantilla inmutable para crear contenedores.
- Contenedor (Container) — instancia en ejecución de una imagen.
- docker-compose — herramienta para definir y ejecutar aplicaciones multicontenedor.
2. Creación de un Dockerfile para una aplicación PHP
Empecemos con un ejemplo sencillo. Supongamos que tenemos una aplicación PHP basada en el framework Laravel o Symfony. Crearemos un archivo Dockerfile en la raíz del proyecto:
# Usamos la imagen oficial de PHP 8.2 con FPMFROM php:8.2-fpm-alpine
# Establecemos el directorio de trabajoWORKDIR /var/www/html
# Instalamos dependencias del sistema y extensiones PHPRUN apk add --no-cache \ git \ unzip \ libpng-dev \ libjpeg-turbo-dev \ freetype-dev \ && docker-php-ext-configure gd --with-freetype --with-jpeg \ && docker-php-ext-install -j$(nproc) \ pdo_mysql \ mbstring \ exif \ pcntl \ bcmath \ gd
# Instalamos ComposerCOPY --from=composer:latest /usr/bin/composer /usr/bin/composer
# Copiamos los archivos del proyectoCOPY . .
# Establecemos permisos (para Laravel/Symfony)RUN chown -R www-data:www-data /var/www/html \ && chmod -R 755 storage bootstrap/cache
# Abrimos el puerto 9000 (PHP-FPM)EXPOSE 9000
# Comando de inicioCMD ["php-fpm"]Este Dockerfile hace lo siguiente:
- Toma la imagen ligera
php:8.2-fpm-alpine. - Instala las extensiones necesarias:
pdo_mysql,gd,mbstringy otras. - Copia Composer desde la imagen oficial.
- Transfiere el código de la aplicación.
- Configura los permisos de acceso para caché y registros.
3. Configuración de docker-compose: PHP + Nginx + MySQL
Para un proyecto real necesitaremos un servidor web y una base de datos. Crearemos el archivo docker-compose.yml:
version: '3.8'
services: # Servicio PHP-FPM php: build: context: . dockerfile: Dockerfile container_name: app_php volumes: - .:/var/www/html networks: - app-network
# Servidor web Nginx nginx: image: nginx:alpine container_name: app_nginx ports: - "8080:80" volumes: - .:/var/www/html - ./nginx/default.conf:/etc/nginx/conf.d/default.conf depends_on: - php networks: - app-network
# Base de datos MySQL mysql: image: mysql:8.0 container_name: app_mysql environment: MYSQL_ROOT_PASSWORD: root_password MYSQL_DATABASE: app_db MYSQL_USER: app_user MYSQL_PASSWORD: app_password ports: - "3306:3306" volumes: - mysql_data:/var/lib/mysql networks: -