Docker es una popular plataforma de código abierto para desarrollar, enviar y ejecutar aplicaciones. Encapsula las aplicaciones y sus dependencias en contenedores para promover la coherencia entre distintos entornos. Esta coherencia ayuda a evitar problemas relacionados con conflictos de dependencias y discrepancias del tipo «funciona en mi máquina».

Con Docker, puedes definir las dependencias y extensiones necesarias utilizando Dockerfiles. Esto significa que tus aplicaciones disponen de todas las bibliotecas y herramientas necesarias en un entorno reproducible y aislado.

El Alojamiento de Aplicaciones de Kinsta ofrece soporte dinámico para Dockerfiles personalizados, lo que te permite tener un mayor control del entorno de tu aplicación. Con un Dockerfile, puedes utilizar casi cualquier lenguaje: no estás restringido a los lenguajes soportados por Nixpacks o Buildpacks.

Este artículo práctico te explica cómo instalar y utilizar dependencias y extensiones PHP en Docker.

¿Por qué utilizar Docker para instalar dependencias?

Utilizar Docker para instalar dependencias tiene varias ventajas:

  • Consistencia del entorno — Docker te permite empaquetar tu aplicación, sus dependencias y sus configuraciones en un contenedor. Este enfoque garantiza que el entorno en el que se ejecuta tu aplicación sigue siendo coherente en diferentes configuraciones y sistemas, incluidos los entornos de desarrollo, pruebas y producción.
  • Facilidad de configuración y resolución de dependencias — Docker te permite configurar el entorno de tu aplicación en cualquier máquina que lo admita, especificando todas sus dependencias y configuraciones necesarias. Como resultado, evitas problemas de compatibilidad y la molestia de instalar manualmente las dependencias.
  • Control de versiones y aislamiento — Los contenedores Docker encapsulan todas las dependencias, incluidas sus versiones específicas dentro del contenedor. Esto significa que puedes controlar la versión de tu aplicación y sus dependencias, fomentando la reproducibilidad y eliminando los conflictos entre las distintas versiones de las dependencias.

Además, los contenedores Docker proporcionan aislamiento, lo que ayuda a eliminar conflictos entre dependencias de diferentes aplicaciones que se ejecutan en el mismo sistema.

Configura tu aplicación en Kinsta

Configurar tu aplicación en Kinsta es sencillo. Visita MyKinsta y sigue el proceso de registro. Una vez registrado, podrás acceder a un potente panel de control de alojamiento y a un conjunto de funciones diseñadas para optimizar el rendimiento y la seguridad.

El alojamiento de aplicaciones de Kinsta es compatible con diversos lenguajes de programación, como PHP, Python, Node.js y Ruby. Este amplio soporte de lenguajes garantiza la compatibilidad con diversas aplicaciones, permitiéndote elegir el lenguaje que mejor se adapte a los requisitos de tu proyecto.

Por ejemplo, si estás desarrollando una aplicación web dinámica con PHP, el entorno de alojamiento optimizado de Kinsta garantiza un alto rendimiento y fiabilidad para tus proyectos basados en PHP. O, si estás construyendo una API RESTful con Node.js o una aplicación web basada en datos con Python, Kinsta proporciona la infraestructura y el soporte necesarios para tu aplicación.

Para experimentar cómo desplegar una aplicación utilizando un Dockerfile en Kinsta, utiliza esta aplicación, un sistema básico de autenticación basado en PHP que utiliza MariaDB para almacenar datos. Esta aplicación también aprovecha algunos paquetes composer, como respect/validation para la validación de entradas e ircmaxell/password-compat para el hashing de contraseñas.

Prepara tu entorno Docker

Un Dockerfile es un archivo de texto que contiene todos los comandos, dispuestos en el orden necesario, que necesitas para construir la imagen requerida. Un Dockerfile básico para una aplicación PHP tendría este aspecto:

FROM php:8.3-cli
COPY . /usr/src/myapp
WORKDIR /usr/src/myapp
CMD [ "php", "./your-script.php" ]

Este Dockerfile crea un entorno contenedor para ejecutar un script PHP desde una interfaz de línea de comandos (CLI). Comienza utilizando la imagen oficial de PHP con la variante CLI, asegurándose de que sólo se incluye en el contenedor el tiempo de ejecución de PHP.

A continuación, copia el contenido del directorio local — que contiene el Dockerfile — en el directorio /usr/src/myapp dentro del contenedor. Tras establecer el directorio de trabajo en /usr/src/myapp, especifica el script PHP a ejecutar, tu-script.php, utilizando el comando php.

La imagen contiene muchas extensiones PHP precompiladas. Por tanto, empieza por comprobar si la extensión que necesitas está instalada ejecutando el comando php -m.

Si la extensión que necesitas no está disponible en la imagen base, Docker proporciona los siguientes scripts de ayuda para que puedas instalar extensiones adicionales más fácilmente:

  • docker-php-ext-configure
  • docker-php-ext-install
  • docker-php-ext-enable

Por ejemplo, la aplicación de demostración de este tutorial utiliza la extensión MySQLi para interactuar con la base de datos MariaDB. Esta extensión no está compilada en la imagen por defecto, así que instálala utilizando el siguiente comando en tu Dockerfile:

RUN docker-php-ext-install mysqli

Para escribir un Dockerfile para la aplicación de demostración, crea un nuevo archivo llamado Dockerfile en la carpeta raíz del proyecto. Pega el siguiente código en el archivo:

FROM php:8.3-apache

# Install MySQL client, server, and other dependencies
RUN apt-get update && \
	apt-get install -y \
	default-mysql-client \
	default-mysql-server \
	git \
	&& apt-get clean \
	&& rm -rf /var/lib/apt/lists/*

# Install mysqli PHP extension for MySQL support
RUN docker-php-ext-install mysqli

Este código especifica la imagen oficial de PHP — concretamente la versión 8.3 — con Apache instalado como imagen base para el contenedor. Esta imagen proporciona un entorno preconfigurado para ejecutar aplicaciones PHP con Apache como servidor web.

A continuación, instala las dependencias adicionales que requiere la aplicación de demostración, incluyendo default-mysql-client y default-mysql-server, que crean e interactúan con la base de datos MariaDB.

Por último, el fragmento anterior instala la extensión PHP mysqli utilizando docker-php-ext-install, que permite a la aplicación de demostración establecer una conexión y realizar operaciones en la base de datos MariaDB.

Gestionar dependencias con Docker

Gestionar las dependencias de PHP con Docker implica utilizar Composer, un popular gestor de dependencias para PHP. Instalando Composer en un contenedor Docker, puedes agilizar el proceso de instalación, actualización y gestión de las dependencias de PHP, facilitando al mismo tiempo la coherencia y reproducibilidad en distintos entornos.

Sigue los pasos que se indican a continuación para utilizar Composer para la gestión de dependencias dentro de la aplicación de demostración. Añade el código de cada uno de los pasos a tu archivo Dockerfile.

  1. Instala Composer en la imagen Docker utilizando el siguiente comando:
    # Install Composer
    COPY --from=composer/composer:latest-bin /composer /usr/bin/composer

    Este comando copia un archivo binario precompilado de Composer del repositorio Docker Hub en tu imagen. --from=composer/composer:latest-bin especifica la imagen de origen desde la que copiar los archivos.

    La ruta /composer de la imagen de origen contiene los archivos a copiar, mientras que la ruta /usr/bin/composer de tu imagen Docker es el destino de estos archivos.

  2. A continuación, establece el directorio de trabajo ejecutando lo siguiente:
    # Set working directory
    WORKDIR /var/www/html
  3. Copia los archivos composer.json y composer.lock en la imagen.
    # Copy composer.json and composer.lock
    COPY composer.json composer.lock ./
  4. Instala las dependencias de Composer que aparecen en composer.json.
    # Install Composer dependencies
    RUN composer install --no-dev --optimize-autoloader

    --no-dev indica a Composer que omita las dependencias específicas del desarrollo. --optimize-autoloader indica a Composer que optimice el cargador automático para mejorar el rendimiento.

Puedes actualizar y gestionar las dependencias a lo largo del tiempo modificando el archivo composer.json según sea necesario, añadiendo nuevas dependencias, actualizando las restricciones de versión y eliminando las dependencias que ya no sean necesarias.

Tras realizar los cambios necesarios, ejecuta composer install o composer update dentro del contenedor Docker para instalar o actualizar las dependencias en consecuencia.

Aplica las configuraciones finales

Antes de que la aplicación funcione con Docker, debes crear la base de datos y el usuario de la base de datos, establecer las variables de entorno y copiar los archivos del proyecto en la imagen Docker.

Para ello, sigue los pasos que se indican a continuación y copia cada fragmento de código en tu archivo Docker.

  1. Establece las variables de entorno que la aplicación PHP utilizará para conectarse a la base de datos MariaDB. Puedes sustituir DB_USER, DB_PASSWORD, y DB_NAME por tus credenciales preferidas.
    # Set environment variables
    ENV DB_HOST=localhost \
    	DB_USER=kinsta_user \
    	DB_PASSWORD=your_password_here \
    	DB_NAME=kinsta_docker_auth \
    	# Path to the Unix socket file used for connecting to the MariaDB server.
    	DB_SOCKET=/var/run/mysqld/mysqld.sock
  2. Copia los archivos de la aplicación PHP en la imagen Docker:
    # Copy PHP application files into the image
    COPY . .
  3. Copia el script de inicio en la imagen:
    # Copy the startup script
    COPY scripts/start.sh /usr/local/bin/start.sh

    Este script se ejecuta cuando se inicia el contenedor y es responsable de iniciar el servidor de base de datos, crear una base de datos, una tabla y un usuario, e iniciar el servidor Apache. Crearás este script más adelante.

  4. Haz que el script sea ejecutable utilizando el comando chmod:
    # Make the script executable
    RUN chmod +x /usr/local/bin/start.sh
  5. Por último, ejecuta el script utilizando el siguiente comando:
    # Execute the startup script
    CMD ["/usr/local/bin/start.sh"]

Ahora que el Dockerfile está completo, crea el script de inicio del que hemos hablado antes.

Crea un nuevo archivo llamado scripts/start.sh en la carpeta raíz del proyecto y añade el siguiente código. Asegúrate de utilizar las credenciales de la base de datos que definiste en el Dockerfile.

#!/bin/bash

# Start MariaDB server
service mariadb start

# Wait for MariaDB to be fully initialized (retry up to 30 times, waiting 1  second between each attempt)
attempt=0
while [ $attempt -lt 30 ]; do
		if mysqladmin ping &>/dev/null; then
    		echo "MariaDB is up and running."
    		break
		else
    		echo "MariaDB is not yet available. Retrying..."
    		attempt=$((attempt+1))
    		sleep 1
		Fi
done

# If MariaDB failed to start within the specified attempts, exit with an error
if [ $attempt -eq 30 ]; then
		echo "Error: MariaDB failed to start within the specified time."
		exit 1
fi

# Set the database name, username, and password
dbname="kinsta_docker_auth"
dbuser="kinsta_user"
dbpassword="your_password_here"

# Create the database if it does not exist
mysql -u root -e "CREATE DATABASE IF NOT EXISTS $dbname;"

# Create a database user and assign privileges to the database
mysql -u root -e "CREATE USER '$dbuser'@'localhost' IDENTIFIED BY '$dbpassword';"
mysql -u root -e "GRANT ALL PRIVILEGES ON $dbname.* TO '$dbuser'@'localhost';"
mysql -u root -e "FLUSH PRIVILEGES;"

# Create users table if it does not exist
mysql -u root -e "USE $dbname; CREATE TABLE IF NOT EXISTS users (
		id INT AUTO_INCREMENT PRIMARY KEY,
		username VARCHAR(20) UNIQUE NOT NULL,
		password_hash VARCHAR(255) NOT NULL
);"

# Start Apache server
apache2ctl -D FOREGROUND

Este script Bash inicia el servidor MariaDB. Después, cuando el servidor está totalmente inicializado, crea una base de datos, un usuario con los privilegios adecuados y una tabla dentro de la base de datos. Por último, inicia el servidor Apache.

Despliegue en Kinsta

Antes de desplegar tu aplicación en Kinsta, debes establecer algunas configuraciones para el servidor Apache. El servicio de Alojamiento de Aplicaciones de Kinsta tiene abiertos los puertos 80 y 443, pero te recomendamos que utilices el puerto 8080 si tu aplicación expone algún puerto.

Por defecto, el servidor Apache escucha conexiones en el puerto 80, por lo que debes configurarlo para que escuche conexiones en el puerto 8080. Para ello, sigue estos pasos:

  1. Crea una carpeta llamada apache-conf en la carpeta raíz del proyecto.
  2. En la carpeta recién creada, crea un archivo llamado apache-config.conf. Añade el código siguiente para configurar Apache para que escuche conexiones en el puerto 8080:
    <VirtualHost *:8080>
    	ServerAdmin webmaster@localhost
    	DocumentRoot /var/www/html
    
    	ErrorLog ${APACHE_LOG_DIR}/error.log
    	CustomLog ${APACHE_LOG_DIR}/access.log combined
    </VirtualHost>
  3. En la carpeta apache-conf, crea un nuevo archivo llamado apache-ports.conf y añade el código que aparece a continuación.
    # Change the Listen directive to listen on port 8080
    Listen 8080
    
    # Keep the existing configuration for port 443
    <IfModule ssl_module>
    	Listen 443
    </IfModule>
    
    <IfModule mod_gnutls.c>
    	Listen 443
    </IfModule>

    La directiva Listen 8080 indica a Apache que escuche las conexiones entrantes en el puerto 8080.

  4. Ahora, tienes que modificar el Dockerfile para aplicar esta configuración al servidor Apache. En el Dockerfile, añade estos comandos justo después del comando para establecer el directorio de trabajo (WORKDIR /var/www/html). Éstos se encargan de copiar los archivos de configuración personalizados en los directorios apropiados.
    # Set up Apache virtual host
    COPY apache-conf/apache-config.conf /etc/apache2/sites-available/000-default.conf
    
    # Set up Apache ports
    COPY apache-conf/apache-ports.conf /etc/apache2/ports.conf
  5. Por último, crea un archivo .dockerignore en la carpeta raíz del proyecto. Este archivo contiene una lista de carpetas y archivos que no deben copiarse en la imagen Docker. Añade vendor para excluir la carpeta vendor.

Con todas las configuraciones hechas, puedes desplegar en Kinsta. Sube los archivos de tu proyecto a tu proveedor Git preferido (Bitbucket, GitHub o GitLab) y sigue los pasos que se indican a continuación.

  1. En tu panel MyKinsta, selecciona Aplicaciones en la barra lateral y haz clic en el botón Añadir aplicación.
  2. En la página Añadir aplicación, selecciona tu repositorio Git y tu rama, proporciona un nombre para la aplicación, elige una ubicación para el centro de datos y haz clic en Continuar.
  3. En la página Entorno de construcción , selecciona Utilizar Dockerfile para configurar la imagen del contenedor. Proporciona «Dockerfile» como ruta Dockerfile y un período («.») como Contexto. Haz clic en Continuar.

    Las opciones del entorno de construcción, selecciona la opción Dockerfile y especifica su ruta de archivo
    Sección Entorno de construcción del formulario Añadir aplicación.

  4. Deja todo en la página Configura tus procesos y haz clic en Continuar. Nota: La base de datos perderá datos cuando reinicies o vuelvas a desplegar la aplicación. Si necesitas solucionar este problema, consulta el almacenamiento persistente de Kinsta y aplícalo en esta página. Esta guía no revisará la configuración del almacenamiento persistente.
  5. Confirma los detalles del pago en la página Resumen y haz clic en Desplegar ahora.
  6. Una vez completado el despliegue, abre el dominio de tu aplicación para ver el sitio en producción.
    La página de inicio de sesión del sitio en producción con campos para el nombre de usuario y la contraseña
    Página de inicio de sesión en el sitio web en producción.

    Regístrate para obtener una cuenta, inicia sesión con tus datos y comprueba que puedes acceder a la página protegida y que todo funciona como se espera.

    La página de inicio de la aplicación del usuario conectado se abre con un mensaje de bienvenida personalizado
    La página de inicio de la aplicación una vez iniciada la sesión.

Monitoriza y optimiza tu aplicación

Una vez que tu aplicación esté en funcionamiento en Kinsta, es esencial supervisar y optimizar su rendimiento. Garantiza que tu aplicación funcione sin problemas y utilice los recursos de forma eficiente.

Optimizar el rendimiento de tu aplicación es crucial para ofrecer una experiencia de usuario rápida y receptiva.

Kinsta siempre está buscando formas de optimizar el rendimiento de tu aplicación. Ofrecemos completas herramientas de monitorización para ayudarte a realizar un seguimiento de diversas métricas de rendimiento, como el ancho de banda, el tiempo total de compilación, el uso de la CPU, el consumo de memoria, el tráfico de red y los tiempos de respuesta. Puedes ver toda esta información navegando a la sección Analíticas de tu aplicación en el panel de control de Kinsta.

Si te encuentras con un problema o un comportamiento inesperado de la aplicación, puedes ir a la sección Registros del panel de control de Kinsta. Su visión detallada del rendimiento y comportamiento de tu aplicación incluye registros de errores y accesos.

Al revisar meticulosamente estos registros, puedes obtener información valiosa sobre lo que podría estar causando el problema, como mensajes de error, stack traces o patrones de comportamiento anormal. Esta información puede ayudarte a diagnosticar la causa raíz del problema y a tomar las medidas adecuadas para resolverlo.

Además, puedes aprovechar las técnicas de optimización del rendimiento en tu entorno Docker, como la optimización de las imágenes Docker y la aplicación de las mejores prácticas para la arquitectura de aplicaciones y la optimización del código.

Resumen

Los contenedores ligeros y portátiles de Docker facilitan el empaquetado y despliegue de aplicaciones con todas las dependencias necesarias, independientemente de la infraestructura subyacente. Al contenerizar tu aplicación y sus dependencias, fomentas la coherencia entre distintos entornos, agilizas los procesos de configuración y obtienes un mejor control de las versiones.

Aprovechar Docker con Kinsta mejora el proceso de despliegue de tu aplicación. Su compatibilidad con archivos Docker personalizados y una amplia gama de lenguajes de programación, incluido PHP, garantiza la compatibilidad y flexibilidad de tus proyectos.

Con la infraestructura del Alojamiento de Aplicaciones y la tecnología de contenedorización de Docker, puedes conseguir un despliegue optimizado, escalabilidad y fiabilidad para tus aplicaciones.

¿Has utilizado antes Docker para tu proyecto? ¿Tienes alguna experiencia o idea sobre Docker? ¡Compártelas en los comentarios más abajo!

Jeremy Holcombe Kinsta

Editor de Contenidos y Marketing en Kinsta, Desarrollador Web de WordPress y Redactor de Contenidos. Aparte de todo lo relacionado con WordPress, me gusta la playa, el golf y el cine. También tengo problemas con la gente alta ;).