Docker y PHP: Contenerización de aplicaciones — Guía completa

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: 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:

  1. Toma la imagen ligera php:8.2-fpm-alpine.
  2. Instala las extensiones necesarias: pdo_mysql, gd, mbstring y otras.
  3. Copia Composer desde la imagen oficial.
  4. Transfiere el código de la aplicación.
  5. 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: -

Blogs

Book Recommendations