Aproximación a Docker para Desarrollo en Drupal

Docker

(Foto de @thkelley)

Buenas, tras una temporada en silencio vuelvo a la carga con un nuevo post esta vez sobre Docker y cómo usarlo para el desarrollo con Drupal.

En primer lugar cuando comencé a trabajar con Drupal, me tuve que familiarizar con el stack de tecnologías que lo rodea y sin el cual no sería posible su existencia: SO - Servidor - Cliente BBDD - PHP - Git

De este modo, de entre los stacks disponibles para trabajar con PHP: LAMP, WAMP, XAMPP; comencé a adentrarme en el mundo de Drupal utilizando LAMP. Configurando cada parte y comprobando su interacción con el resto.

Tras los primeros contactos con Drupal llega el momento en que te encuentras en la tesitura de trabajar en varios sitios web al mismo tiempo. Para esto la solución suele ser la utilización de Virtual Host dentro de nuestro servidor web local para de esta manera acceder a varios proyectos a través del mismo “localhost”.

Pero todo desarrollador se enfrenta antes o después a la situación de perder el entorno de trabajo total o parcialmente. Ya sea un error en cualquiera de los elementos del stack o un problema hardware que nos fuerza a construir de nuevo o cambiar nuestro entorno de desarrollo. Esto se convierte en un tedioso proceso que puede llevar horas hasta permitirnos volver a desarrollar con normalidad.

Cuando comencé a oír hablar acerca de Docker y su filosofía, lo que me resultó más llamativo fue la idea cambiar la forma de configurar y levantar entornos de desarrollo. En lugar de utilizar un stack centralizado fuerte que cargué con todas nuestras aplicaciones Drupal, utilizar entornos independientes creados específicamente para cada site y que se configuren rápidamente.

En ese momento recuerdo que me explicaron que a día de hoy existen 2 tipos de desarrolladores, los que utilizan un único entorno de desarrollo donde añaden más y más proyectos; y los que cuentan con un entorno de desarrollo particular para cada proyecto.

Docker viene a dar respuesta a estas cuestiones y otras muchas que aún no hemos mencionado y que iremos ampliando durante este artículo.

En primer lugar vamos a introducir los conceptos básicos que utilizaremos a partir de ahora:

¿Que es Docker?

Durante una primera investigación encontraremos definiciones como “Docker es una plataforma de software que le permite crear, probar e implementar aplicaciones rápidamente” o “Docker es una tecnología de creación de y uso de contenedores”

Para las personas que ya conocen Docker la principal respuesta a esta pregunta suele ser:

“Docker es un gestor de contenedores”

¿Pero, qué quiere decir eso?, para responder a esta pregunta debemos partir del concepto de “Contenedor”.

Contenedor Software

Bueno, en primer lugar tenemos que reparar en el concepto de contenedor. Según la propia web de Docker, un Contenedor es un “paquete software en forma de unidades estandarizadas desarrollo, envío e implementación”. Es decir, un elemento software (con sus dependencias) lo más simplificado e independiente posible para poder trabajar con él y gestionarlo.

Los contenedores se definen a partir de una “imagen de contenedor” como si de una “imagen ISO” de un CD se tratase. Por lo que una imagen de contenedor ejecutada por Docker Engine se convierte en un contendor “en tiempo de ejecución”.

En este punto debemos detenernos en el concepto de Virtualización de Sistema Operativo (SO Virtualization).

Tradicionalmente, una máquina virtual realiza una virtualización Hardware; en cambio un Contenedor constituye una virtualización de SO.

Los contendores Docker comparten el kernel del SO por lo que no necesitan un SO por cada aplicación como funcionaría una máquina virtual tradicional. Esta estructura puede entenderse mejor a partir de la siguiente imagen:

Container-Structure (Foto procedente de Docker.com)

Para que todo esto funcione los contenedores tienen una copia de la Tabla de Procesos, la Interfaz de Red y el Punto de montaje del sistema de ficheros (File System Mount Point), de este modo pueden coexistir varios contenedores.

¿Porque utilizar Docker?

Docker al utilizar contenedores nos permite tener varios entornos de desarrollo independientes sobre los que poder cambiar. Esto tiene múltiples ventajas como:

  • En caso de que ocurra algún error en un contenedor, el resto seguirán funcionando a la perfección ya que son completamente independientes.
  • Nos permite trabajar en varios proyectos con dependencias o necesidades que entren en conflicto. (Por ejemplo, si uno de mis proyectos necesita utilizar PHP 4 y otro PHP 7, podemos separarlos en dos contenedores y trabajar simultáneamente en ambos.)
  • La reconstrucción de nuestro entorno de desarrollo será muchísimo más rápida.
  • Ofrece una gran portabilidad, ya que únicamente necesitaremos un SO sobre el que ejecutar Docker.
  • Ligereza, al virtualizar únicamente lo necesario el consumo de recursos es mínimo.

Docker Compose

Como se aprecia en la imagen anterior, el objetivo final de un contenedor es la ejecución de una aplicación. Pero como hemos visto Drupal necesita varios elementos (aplicaciones) para su funcionamiento. ¿Cómo podemos interconectar los elementos que necesitamos para dar vida a nuestro Drupal?

Para esto utilizaremos Docker Compose que es una herramienta para la integración de contenedores. De esta forma mantendremos las aplicaciones independientes y modularizadas. Esto nos permitirá su sustitución en cualquier momento y en caso de error el resto de aplicaciones no se verán afectadas.

Docker Compose

Docker Compose utiliza un archivo docker-compose.yml donde se describe la relación entre contenedores a fin de proporcionar una aplicación multi-contenedor (en nuestro caso, Drupal).

En próximos post ahondaremos en la filosofía que existe detrás de Docker y repasaremos el proceso de instalación de un site Drupal mediante Docker Compose.

Enlaces de interés

Instalación de Drupal 8 (Apache, MYSQL, PHP) - https://riloto8.github.io/install/

What is a Container? - https://www.docker.com/resources/what-container

Docker Hub - https://www.docker.comm/products/docker-hub

Despliegue de aplicaciones con Docker Compose - https://colaboratorio.net/davidochobits/sysadmin/2018/despliegue-de-aplicaciones-con-docker-compose

Development Environments for Drupal wiht DDEV - https://davidjguru.github.io/blog/creating-development-environments-for-drupal-with-ddev

Written on April 7, 2020