Ciencias técnicas y aplicadas

Artículo de investigación

 

Virtualización del despliegue del ambiente de desarrollo de OdontoApp de la Universidad Católica de Cuenca

 

Virtualization of the deployment of the OdontoApp development environment of the Catholic University of Cuenca

 

Virtualização da implantação do ambiente de desenvolvimento OdontoApp da Universidade Católica de Cuenca

 

 

Ronald Andrés Espinoza-Urrego I    respinozau@ucacue.edu.ec  https://orcid.org/0000-0002-1622-6915                   

Jorge Cristian Cárdenas-Matute II    jcardenasm@ucacue.edu.ec   https://orcid.org/0000-0003-1136-6107 

   

 


                                                                                                                                                   

 

 

 

Correspondencia: respinozau@ucacue.edu.ec            

 

 

*Recibido: 25 de julio 2021 *Aceptado: 30 de agosto de 2021 * Publicado: 28 de septiembre de 2021

 

        I.            Ingeniero de Sistemas, Programador Senior. Universidad Católica de Cuenca, Cuenca, Ecuador.

     II.            Ingeniero de Sistemas, Docente de Facultad de Odontología, Universidad Católica de Cuenca, Cuenca, Ecuador.

 

 

 

 

 

 

 

 

Resumen

Este trabajo tiene como objetivo el proponer una solución para la virtualización del despliegue del ambiente de desarrollo de OdontoApp, de la Universidad Católica de Cuenca, utilizando los contenedores de Docker. Se ha analizado la madurez de la virtualización de servicios en ambientes de desarrollo, pruebas y producción; estudiando la virtualización de servicios a través de la herramienta Docker y comparándola con el proceso común de despliegue de ambientes de desarrollo, para determinar principalmente las diferencias en: cantidad de operaciones, tiempo de operación y cantidad de recursos de hardware. Finalmente, se detallan los resultados obtenidos que sustentan que la virtualización en contenedores, reduciría el tiempo necesario y automatizaría las tareas de aprovisionamiento que un desarrollador debe ejecutar para desplegar su ambiente de trabajo.

Palabras clave: Contenedores; docker; desarrollo de software; optimización; automatización.

 

Abstract

The objective of this work is to propose a solution for the virtualization of the deployment of the OdontoApp development environment, of the Catholic University of Cuenca, using Docker containers. The maturity of service virtualization in development, test and production environments has been analyzed; studying the virtualization of services through the Docker tool and comparing it with the common process of deployment of development environments, to determine mainly the differences in: number of operations, operation time and amount of hardware resources. Finally, the results obtained are detailed that sustain that virtualization in containers would reduce the necessary time and automate the provisioning tasks that a developer must execute to deploy their work environment.

Keywords: Containers; docker; software development; optimization; automation.

 

Resumo

O objetivo deste trabalho é propor uma solução para a virtualização da implantação do ambiente de desenvolvimento OdontoApp, da Universidade Católica de Cuenca, utilizando containers Docker. A maturidade da virtualização de serviço em ambientes de desenvolvimento, teste e produção foi analisada; estudar a virtualização de serviços através da ferramenta Docker e compará-la com o processo comum de implantação de ambientes de desenvolvimento, para determinar principalmente as diferenças em: número de operações, tempo de operação e quantidade de recursos de hardware. Por fim, detalham-se os resultados obtidos que sustentam que a virtualização em containers reduziria o tempo necessário e automatizaria as tarefas de provisionamento que um desenvolvedor deve executar para implantar seu ambiente de trabalho.

Palavras-chave: Containers; docker; desenvolvimento de software; otimização; automação.

 

Introducción

Definiciones de diccionarios estándar, como el Diccionario Oxford de inglés, establece que el software es: "los programas y otra información operativa que utiliza una computadora". Para Sommerville, probablemente uno de los libros de texto más utilizados en la educación en ingeniería de software: “el software, además de programas de computadora, también es toda la documentación asociada y los datos de configuración que se requieren para que estos programas funcionen correctamente. Puede incluir documentación del sistema, documentación del usuario, y sitios web para que los usuarios descarguen información reciente del producto” (Pfeiffer, 2020).

Sin embargo, en una definición más específica y detallada, Pfeiffer nos dice que el software es: “la colección de código fuente, código fuente específico, código script, código binario, código de compilación, código de infraestructura, imagen, video, música, configuración, base de datos, fuente, archivo, marcado, documento, datos de la aplicación, prosa, jerga legal, entre otros componentes, que los humanos recopilan y almacenan, y que estos artefactos son más que solo código, datos o programas” (Pfeiffer, 2020).

Por lo tanto, el desarrollo de software requiere una estrecha cooperación y colaboración entre los miembros del equipo y todo tipo de actividades de desarrollo. Los miembros de proyectos de software en todos los roles deben comunicarse e interactuar continuamente con otros miembros del proyecto, así como con una variedad de partes interesadas (Mens et al., 2019).

Generalmente, el desarrollador de proyectos de software debe instalar y configurar en su computador un conjunto de programas y servicios necesarios para editar, ejecutar y probar el código del software. Por ejemplo, los componentes interrelacionados de un ambiente de desarrollo para una aplicación web, donde podemos encontrar: intérpretes y compiladores de código, gestores de base de datos y servidores web. Las versiones y configuraciones de estos programas y servicios deben ser idénticos en todos los ambientes donde se ejecuta la aplicación web para garantizar condiciones de ejecución y resultados homogéneos.

Algunas de las restricciones y conflictos que podemos encontrar con las versiones y configuraciones de estos programas en un ambiente de desarrollo son:

·         Programas exclusivos: los programas se instalan a través de paquetes que son desarrollados para versiones específicas de los sistemas operativos, la disponibilidad y actualizaciones de estos paquetes está estrictamente limitada a la capacidad e interés del fabricante por ofrecer compatibilidad para los sistemas operativos y sus versiones disponibles en el mercado.

·         Procesos únicos: los servicios se instancian sólo una vez, en un puerto específico o en un proceso, impidiendo ejecutar varias veces los mismos servicios en varios proyectos de desarrollo de software.

·         Instalación: instalar y configurar los programas y servicios para desarrollar un proyecto de software requiere tener el conocimiento de los detalles de la instalación y configuración en cada sistema operativo para ajustarse a los requerimientos de cada proyecto.

·         Gestión: iniciar, detener o reiniciar los servicios, requiere tener el conocimiento sobre como interactuar con los programas de administración de cada servicio.

·         Programación: necesitamos conocer cómo interactuar con el sistema operativo y el servicio para programar su ejecución automática al iniciar el computador.

·         Actualizaciones: las actualizaciones dependen mucho de cada sistema operativo, en el caso de que exista el paquete compatible para subir de versión a un programa, se requiere un arduo proceso de reinstalación que comúnmente es más complejo que la instalación, debido a que se reemplaza una versión del servicio por otra en el mismo sistema de archivos, lo que podría provocar conflictos de compatibilidad en sus configuraciones actuales.

Por lo tanto, desplegar ambientes de desarrollo de software para los miembros de un equipo puede conllevar mucho tiempo y esfuerzo por las particularidades de los diversos sistemas operativos y versiones que poseen los computadores personales de trabajo, sin embargo, existen algunas alternativas para tratar de aligerar este proceso para los desarrolladores. Una opción es construir una imagen a partir de un sistema operativo, que contenga todos los servicios necesarios para que el desarrollador lo copie en su disco duro y ejecute como su sistema base. Pero, los desarrolladores acostumbrados a usar un sistema operativo determinado y sus utilidades ofimáticas, difícilmente pueden migrar a este nuevo sistema operativo que contiene dicha imagen. Otra alternativa es usar una máquina virtual (VM) para desplegar la imagen antes mencionada, pero podría disminuir el rendimiento del computador por la gran cantidad de recursos de hardware que necesita, sin contar con la dificultad para el usuario de utilizar dos sistemas operativos a la vez, además que la instalación a partir de la imagen quedará desactualizada y requerirá de intervención humana para actualizarse.

La industria del software tiene un alto nivel de competitividad por lo que optimizar los procesos es fundamental para lograr resultados rentables, un desarrollador de software generalmente está involucrado en varios proyectos y tareas a la vez, utilizando un gran número de programas y servicios, por lo que aprovisionar su computador para realizar su trabajo diario no debería repercutir en pérdidas de tiempo o reducción de productividad.

Han surgido nuevos grupos de herramientas para gestionar la complejidad de la actividad del desarrollo e implementación de software. Una de estas nuevas herramientas es la tecnología de contenedores, llamada también virtualización basada en contenedores, virtualización de SO o contenedorización (Watada et al., 2019). Un contenedor es una unidad estándar de software que empaqueta el código y todas sus dependencias. Las imágenes de contenedores son las plantillas que almacenan estáticamente las instrucciones necesarias para generar una instancia de contenedor, estos se ejecutan como un proceso aislado en el grupo de recursos del usuario. Cada máquina puede ejecutar varios contenedores, todos compartiendo el mismo núcleo del sistema operativo (Zhu & Bayley, 2018).

Los contenedores son una solución liviana que los desarrolladores pueden usar para implementar y administrar aplicaciones, a menudo se consideran una alternativa más liviana que las máquinas virtuales, las cuales incluyen el sistema operativo completo a diferencia de los contenedores, lo que permite que estos últimos proporcionen ventajas en el uso de recursos (Schmitt et al., 2019).

Las imágenes de contenedores se pueden enviar a través de una red más rápidamente e iniciarse casi instantáneamente como un proceso en un sistema operativo, mientras que se tarda mucho más transferir e iniciar una copia de máquina virtual. Los contenedores también brindan separación entre usuarios, logrando así las mismas ventajas de seguridad y privacidad que tienen las máquinas virtuales (Zhu & Bayley, 2018).

La utilidad de los contenedores no se limita a que sean una versión más ligera de las máquinas virtuales. Una característica interesante de los contenedores es que brindan portabilidad y, por lo tanto, modularidad, lo que los hace adecuados para trabajar como componentes de software o como microservicios autónomos. Esto, nos permite mitigar 3 problemas cuando los sistemas de software crecen, los cuales se detallan a continuación (Schmitt et al., 2019):

1.      Mantener el software se vuelve más difícil.

2.      La adición de nuevas funciones al sistema se ralentiza.

3.      Los requisitos de recursos para el software crecen.

A pesar de sus bondades, el uso de contenedores para el despliegue de ambientes de desarrollo de software aún no es muy popular entre los desarrolladores en Ecuador, el caso de estudio de este documento se centra específicamente en la Facultad de Odontología de la Universidad Católica de Cuenca, en donde no existía un sistema informático para gestionar los procesos administrativos relacionados con las fichas odontológicas de los estudiantes, sus procesos se gestionaban con archivos físicos, lo que provocaba problemas al perderse, deteriorarse y ser difíciles de encontrar; gracias a esto, tratando de mejorar estos procesos se desarrolló la aplicación OdontoApp, sin embargo, una vez puesta en marcha se detalla que resulta dificultoso para nuevos desarrolladores, preparar el ambiente idóneo para desarrollar la aplicación, dado que se debe conocer como descargar, instalar, configurar y desplegar manualmente los programas adecuados en su computador personal.

Esta investigación estará orientada a proponer una solución para el despliegue del entorno de desarrollo de software de la aplicación OdontoApp basada en contenedores de software para analizar la madurez, ventajas, desventajas y diferencias de los contenedores frente a los mecanismos comunes de despliegue de ambientes de desarrollo en la industria, contribuyendo con una nueva alternativa para el equipo de desarrollo de OdontoApp para optimizar y automatizar el proceso de despliegue de su ambiente de trabajo.

 

Metodología

Proceso de despliegue de ambiente de desarrollo:

Se han propuesto muchos modelos, metodologías y marcos de trabajo involucrados al desarrollo y mantenimiento de productos de software, el objetivo primordial de estas herramientas es establecer un plan integral para el proceso de desarrollo de software. A pesar de los grandes esfuerzos en este campo, aún no existe una receta o fórmula perfecta para gestionar el desarrollo de software a gran escala o sus requisitos siempre cambiantes durante el proceso (Kaur & Sengupta, 2010). Por lo tanto, se ha popularizado entre los desarrolladores de software ambientes de ejecución desiguales, estructurados de acuerdo a preferencias, conocimientos, sistema operativo y tareas individuales de cada desarrollador. Dejando abierta la posibilidad al aparecimiento de brechas de seguridad, compatibilidad y mantenibilidad de un proyecto.

A pesar de las diferencias que pueden llegar a existir entre ambientes de desarrollo de un mismo proyecto de software, se ha procurado establecer componentes comunes de un ambiente de desarrollo de aplicación web, y posteriormente describir el proceso que tiene que realizar el desarrollador para lograr aprovisionar dicho ambiente en su equipo personal.

En la figura 1, se pueden observar los componentes de software básicos que necesita instalar un desarrollador en su equipo personal para poder ejecutar un proyecto de software. En la parte central se ubica el sistema operativo, el cual es la parte medular de este ambiente, debido a que, sobre su grupo de recursos como el almacenamiento, se instalarán todos los programas indispensables del ambiente.

El sistema operativo también será el encargado de gestionar las configuraciones del Firewall y el Administrador de procesos, los cuales nos permitirán abrir puertos como el 80 para ingresar a la aplicación web desde el navegador, y decidir cuándo iniciar o detener servicios como el servidor web o el servidor de base de datos. El sistema operativo también será el encargado de proveer las rutas para el almacenamiento de la persistencia de archivos del servidor de base de datos, archivos de configuración y variables de entorno.

 

 

 

 

 

 

 

 

 

 

 

Figura 1: Componentes de un ambiente de desarrollo común de aplicación web


Fuente: Elaboración propia.

Para obtener el entorno parecido al propuesto, el desarrollador tiene que ejecutar un proceso muy parecido al que describe la figura 2, en donde comienza recibiendo un equipo personal nuevo y limpio, solo con el sistema operativo instalado, y termina con un equipo listo para comenzar a desarrollar y probar las aplicaciones del proyecto.

El proceso de instalación comienza por descargar desde el internet, el código fuente del proyecto y todos los programas indispensables para desplegar la aplicación web del proyecto. Por lo general, dentro de los proyectos de software se mantienen archivos como README.md o CHANGELOG.md, los cuales describen cambios y procedimientos técnicos para establecer configuraciones de los servicios y del propio proyecto que se está desarrollando.

 

 

 

Figura 2: Proceso de aprovisionamiento de un ambiente común para desarrollo web


Fuente: Elaboración propia.

Las configuraciones de servicios, se refiere a las modificaciones de los archivos que usan los servidores para establecer su comportamiento. Cada servidor web y servidor de base de datos, por ejemplo, tiene archivos de configuraciones que se crean en rutas preestablecidas al instalarse, estos archivos deben ser modificados de acuerdo a los requerimientos de cada proyecto de software. Las configuraciones propias del proyecto, puede requerir el establecimiento de variables de entorno a nivel del sistema operativo o también puede requerir copiar archivos con plantillas donde se establecen cadenas de conexión de base de datos, credenciales y secretos para autenticación con tokens, como parte de la parametrización para el despliegue de las aplicaciones.

El desarrollador de aplicaciones web generalmente tiene que realizar todo este proceso para cada proyecto de software para comenzar a desarrollar. Un procedimiento similar

Debe realizar también cuando existen cambios de versiones y configuraciones de los servicios o del proyecto. Todo esto, con el fin de crear las condiciones necesarias para que el proyecto funcione correctamente, en algunos proyectos existen configuraciones muy precisas y relevantes, por lo que a los nuevos desarrolladores se les provee el computador personal listo, previamente aprovisionado por un equipo técnico que tiene manuales o imágenes preparadas, las cuales usan para replicar sobre un único sistema operativo las mismas condiciones de ejecución para cada computador del equipo de desarrollo.

En el caso de estudio, la aplicación web OdontoApp cuenta con varios componentes en su ambiente de producción como lo indica la figura 3, los cuales describiremos a continuación:

·         Servidor de base de datos: El proyecto usa PostgreSQL versión 13 como motor de base de datos para almacenar toda la información persistente de la aplicación, como registros de usuarios, permisos, fichas odontológicas, entre otros.

·         API REST: Esta aplicación es la encargada de ser el backend donde se realizarán todos los procesos del sistema y se conectará con el servidor de base de datos para almacenar la información. Está escrita en NodeJS versión 12 y usa el framework NestJS, para desplegarla en desarrollo se puede usar el servidor interno de NodeJS, pero en producción debe ser controlada por medio de un gestor de procesos como PM2 y servida en modo proxy a través de NINGX.

·         Aplicación Frontend: Es la aplicación que se renderizará finalmente en el navegador del usuario, y se conectará con nuestra API para ejecutar todos los procesos. Está escrita en JavaScript usando NodeJS versión 14 y utiliza el framework VueJS, en desarrollo usa un servidor web propio del framework, pero para producción se debe compilar y comprimir en archivos estáticos los cuales se sirven a través de NGINX.

·         Servidor Web NGINX: NGINX es un servidor web ampliamente usado en la industria del software, no necesariamente requerido en ambientes de desarrollo, pero imprescindible para el ambiente de producción de nuestro caso de estudio, por lo que un ambiente local, de pruebas o certificación que requiera simular el ambiente de producción, necesariamente debe considerarlo como el servicio frontal. Dentro del servidor web tenemos módulos que nos permiten ciertas funcionalidades extras, como es el caso del Proxy de reenvío, el cual se utiliza para reenviar las peticiones de nuestro servidor web frontal hacia el servidor interno que desplegó PM2 para el API REST. De esta forma, nuestro servidor solo tiene expuesto hacia internet, los puertos 80 y 443 para comunicarse con el navegador web.

Figura 3: Componentes del ambiente de producción de la aplicación OdontoApp

Fuente: Elaboración propia.

Los desarrolladores de OdontoApp ejecutan todos los componentes del ambiente porque son programadores completos, es decir, realizan cambios en la Aplicación Cliente y también en el API REST. Los cambios en la base de datos se gestionan por medio de migraciones, soportadas por el framework que ejecuta la aplicación backend.

Por lo tanto, los programas indispensables (conforme la figura 1) que necesita tener instalado un desarrollador de OdontoApp en su equipo personal son:

·         PostgreSQL Server.

·         NodeJS versión 14.

·         NodeJS versión 12.

·         Manejador de Versiones de NodeJS (NVM).

El proceso para implementar todos los componentes del ambiente de desarrollo es similar al de la figura 2, con mínimas diferencias, como que no se requiere copiar archivos plantillas de configuraciones sino solamente establecer variables de entorno.

Tecnología de contenedores

Como se ha descrito antes, existen otras alternativas de despliegue de ambientes de desarrollo. Se ha escogido las herramientas de contenedorización para desarrollar el caso de estudio porque permiten empaquetar  aplicaciones, sus dependencias y configuraciones en imágenes, que luego se ejecutan como contenedores sobre cualquier máquina que ejecute un demonio o un proceso Unix , logrando que la implementación de aplicaciones sea fácil debido a que la imagen es multiplataforma y se construye una sola vez, dándole agilidad extrema al proceso de aprovisionamiento y despliegue de ambientes de desarrollo de software (Kotouza et al., 2020). La contenedorización es la evolución de la virtualización convencional, uno de los conceptos pioneros en el inicio de nubes modernas, en donde ha contribuido con los siguientes beneficios (Watada et al., 2019):

·         Optimizar los recursos de un centro de datos (hardware, software, energía y dinero) al consolidar muchas máquinas infrautilizadas en un solo sistema.

·         Escalar la confiabilidad del proceso y la tolerancia a fallas mediante el aislamiento del desempeño.

·         La migración de procesos y la replicación en ubicaciones geográficas.

Sin embargo, nuestro enfoque de virtualización va más allá de la virtualización convencional. La contenedorización nos ofrece muchas más ventajas en las actividades concernientes al despliegue de software, las cuales se detallan a continuación:

·         Arquitectura de aplicaciones: La virtualización de servicios y aplicaciones en contenedores es más ligera en comparación con máquinas virtuales, esto permite la habilitación de nuevas de arquitecturas como la de microservicios con la creación de unidades de software autónomas (Piedade et al., 2020). Entre los beneficios que provee esta arquitectura está la evolución continua del software, integración de tecnología perfecta, rendimiento óptimo en tiempo de ejecución, escalabilidad horizontal y confiabilidad a través de la tolerancia a fallas. Todas las empresas de éxito de TI han adoptado un enfoque agresivo para implementarla. Ejemplos bien conocidos incluyen NetFlix, Amazon, EBay, Google y Microsoft (con Azure) (Zhu & Bayley, 2018).

 

 

·         Interfaz de administración: La gestión de contenedores se realiza explícitamente mediante un sistema distribuido, en lugar de simplemente dejar que el usuario invoque un contenedor desde dentro de cada tarea, existen orquestadores y administradores de clústeres que intercambian tareas entre grandes cantidades de contenedores (Watada et al., 2019). Con enfoque declarativo o con un lenguaje imperativo, las interfaces permiten describir los planos de control y los comandos que el usuario puede especificar para cambiar el estado deseado para un servicio. Esto nos ayuda, por ejemplo, a escalar la aplicación hacia arriba y hacia abajo con reglas preestablecidas (de Guzmán et al., 2018).

·         Utilización de recursos: Los contenedores utilizan menos recursos de CPU, memoria y redes para proporcionar soluciones de gestión de recursos eficientes, escalables y rentables en infraestructuras de nube, que son las principales razones de su creciente uso (Watada et al., 2019). Permiten describir los detalles de cómo crear y coordinar los diferentes recursos, determinar el uso elevado de CPU o memoria, o un incremento en las solicitudes entrantes. Esto permite implementaciones muy flexibles que solo consumen recursos bajo demanda, sin la necesidad de adivinar la capacidad de la infraestructura por adelantado (de Guzmán et al., 2018).

·         Integración y despliegue continuo: DevOps es una práctica que tiene como objetivo integrar el desarrollo de software y los procesos operativos. Se espera que los contenedores reduzcan los ciclos de implementación, mejore la calidad del software y acorte el tiempo para corregir errores. Esto ayuda a aumentar la frecuencia de las implementaciones, lo que ayuda a brindar un servicio más rápido a los clientes. Las organizaciones que practican DevOps pueden implementar cambios de software tan rápido como 500 veces al día (Mohan et al., 2018). Los contenedores aseguran la portabilidad y el balanceo de carga entre muchas instancias y permite su integración con herramientas DevOps como Ansible  que gestiona configuración, aprovisiona y despliega servidores a través de SSH, y Kubernetes  que ofrece una solución de gestión de cargas de trabajo y auto escalabilidad de servicios contenedorizados (Khalyly et al., 2020).

·         Procesos de migración: Los operadores de centros de datos, deben lidiar con problemas de anchos de banda al momento de realizar migraciones. En comparación con el esquema de migración de máquinas virtuales, la técnica de migración basada en contenedores muestra una mejora significativa para el proceso de migración y puede servir como un mecanismo de migración clave para mejorar el rendimiento de un centro de datos en la nube (Bhardwaj & Krishna, 2019).

Sistemas de contenedorización

En virtualización de contenedores existen varias herramientas disponibles en el mercado, con diferentes características y alternativas, a continuación, vamos a conocer cuáles son las principales:

1.      En virtualización de contenedores una de las herramientas más populares entre los desarrolladores es Docker. Es una plataforma de software por etapas que le permite fabricar, probar y enviar aplicaciones rápidamente. Docker agrupa la programación en unidades fundamentales, consideradas el soporte que tienen todo lo que el producto necesita para ejecutarse, incluido el código, las bibliotecas, el tiempo de ejecución, el marco y los dispositivos. Al utilizar Docker, podemos usar y extender aplicaciones rápidamente a cualquier entorno y saber que su código se ejecutará (Marathe et al., 2019).

2.      Rkt es un motor de contenedores de aplicaciones, se introdujo recientemente para superar las limitaciones existentes de los tiempos de ejecución del contenedor. Al ser una tecnología más reciente, se espera que el contenedor Rkt brinde un mejor soporte para las aplicaciones HPC . Las aplicaciones de la generación actual exigen capacidades de alto rendimiento, esencialmente se requiere mejorar el soporte disponible. Los investigadores han estado en la búsqueda de tecnologías que les permitan lograr un rendimiento que se parezca más a los escenarios dónde las aplicaciones se ejecutan directamente en el hardware físico (Yadav et al., 2018).

3.      OpenVZ es una tecnología de virtualización a nivel de sistema operativo, que crea y administra múltiples contenedores Linux aislados, también llamados entornos virtuales (VEs), en un solo servidor físico. Cada VE funciona exactamente como un host independiente con su propio acceso raíz, usuarios y grupos, dirección IP y MAC, memoria, árbol de procesos, sistema de archivos, bibliotecas del sistema y archivos de configuración, pero comparte una sola instancia del sistema operativo Linux (Zheng et al., 2012).

 

 

 

 

Análisis comparativo

Realizamos un análisis comparativo basado en lo que se ha considerado como características fundamentales.

Tabla 1: Análisis comparativo de tecnologías de contenedores.

Fuente: Elaboración propia.

        i.            Adopción: Esta medida se refiere a la acogida que recibe la herramienta de software por parte de los usuarios. Cuando un individuo no está seguro de la calidad de un producto de software, el comportamiento de adopción de los usuarios que proceden se convierte en una fuente clave de información. Un usuario puede inferir la información privada de otros en función de su observación de su comportamiento de adopción (Zhao et al., 2020).

      ii.            Comunidad: Esta métrica se refiere a la cantidad de repositorios de código públicos en GitHub que se relacionan con la herramienta. Donde principalmente es la comunidad que dirige el desarrollo y progreso de las herramientas donde colabora. Las empresas actuales alivian la presión de recursos de sus proyectos de software aprovechando la comunidad, incluidos los estudiantes del campus, los fanáticos de la programación, los aficionados al software, quienes pueden entregar software de alta calidad que varía desde pequeñas utilidades (como log4j, dom4j) hasta productos a gran escala (como Apache, Eclipse) (Zhou & Liu, 2010).

    iii.            Integración: Se refiere a la compatibilidad con herramientas de terceros. Es decir, que puede estar, funcionar o coexistir sin impedimento con otra. Por ejemplo, con orquestadores de contenedores y nubes públicas.

    iv.            Soporte: Esta métrica se refiere al soporte o respaldo comercial de empresas importantes del campo tecnológico para que el proyecto se mantenga y evolucione adecuadamente con el pasar del tiempo.

 

 

 

Docker como herramienta base

Por lo tanto, para los desarrolladores, Docker podría ser la mejor herramienta que le ayude a estandarizar sus programas y automatizar el despliegue de los mismos en el ambiente de desarrollo de su sistema operativo preferido.

Figura 4: Componentes del ambiente contenedorizado de una aplicación web.

 

Fuente: Elaboración propia.

Docker ofrece una utilidad llamada Docker Compose, la cual juega un papel importante al permitir orquestar múltiples servicios y definir configuraciones a través de archivos YAML, estas configuraciones especifican desde cómo se construyen las aplicaciones, las imágenes correspondientes y como se relacionan entre sí, hasta los volúmenes para la persistencia de datos y las redes para las conexiones entre servicios (Piedade et al., 2020).

En un ambiente virtualizado con Docker podemos delegarle la responsabilidad de buscar, descargar, instalar y desplegar por nosotros los programas (imágenes) en las versiones que deseemos. Así mismo, a través de Docker Compose, podemos definir las variables de entorno necesarias para la ejecución de la aplicación, puertos de servicios internos y externos que serán abiertos en el firewall del computador y los volúmenes para la persistencia de datos. Como podemos observar en la figura 4, el sistema operativo no se encarga de todo como en el proceso común, sino que ahora es Docker que lo hará automáticamente. El desarrollador no debe preocuparse de instalar manualmente algún programa para desarrollar, solo debe tener instalado en su computador Docker Desktop para Windows y Mac o Docker y Docker Compose para Linux. La instalación se realiza una sola vez y los beneficios se replican cada vez que instale un nuevo proyecto.

Benchmarking entre el Proceso Común de Despliegue y Docker aplicado al caso de estudio

Se ha analizado las implicaciones de la ejecución del proceso común para el despliegue del ambiente de desarrollo de OdontoApp, en comparación al proceso de despliegue del mismo ambiente en contenedores Docker. A continuación, se muestran los parámetros que se considerarán para evaluar ambos procesos:

        i.            Cantidad de operaciones que necesita realizar para el aprovisionamiento: Se trata de la cantidad de procesos que realiza el desarrollador para instalar, configurar y desplegar un nuevo ambiente de trabajo.

      ii.            Tiempo de operación para el aprovisionamiento: Hace referencia al tiempo necesario para cumplir con todas las operaciones de la instalación de un nuevo ambiente de desarrollo; aquí se considerarán dos variables medidas en minutos, el tiempo de trabajo (TT) y el tiempo de espera (TE).

    iii.            Cantidad de recursos de hardware que consume el despliegue: Se refiere a la cantidad de uso de almacenamiento, porcentaje de CPU y de memoria RAM que utiliza el equipo para la ejecución del ambiente de desarrollo de OdontoApp.

Cantidad de operaciones

La siguiente tabla comparativa expone las fases de la instalación vista en la figura 2. Se ha establecido un puntaje basado en la ponderación de acuerdo a la cantidad de servicios o programas que intervengan en cada fase. La ponderación propone asignar 0 al no requerimiento de intervención humana y 1 por cada tarea necesaria en un programa o servicio.

El puntaje total equivale a la suma de los puntajes, siendo el mejor el de menor puntaje debido a que requerirá de menor intervención humana para su ejecución.

 

Tabla 2: Comparación de cantidad de operaciones para desplegar OdontoApp.

Fuente: Elaboración propia.

Tiempo de operación

Esta comparativa se basa en los datos obtenidos de un experimento propio, en el que se ejecutaron las operaciones para desplegar el ambiente de desarrollo de OdontoApp conforme al proceso común y paralelamente conforme al proceso con Docker. El computador utilizado para este experimento tiene características promedio en el entorno de desarrollo local. En cuanto a sus recursos tenemos los siguientes datos relevantes:

        i.            Hardware: 8 CPU Core i7 3.5 GHz, Disco de estado sólido de 256 GB y 12 GB de memoria RAM.

      ii.            Sistema Operativo: Windows 10 Pro 21H1.

    iii.            Conectividad: Descarga de internet a 26 Mbps, subida a 27 Mbps y latencia promedio de 83 ms.

En cuanto a las variables de tiempo consideradas, hacen referencia al tiempo de trabajo o tiempo utilizado en las actividades que se realizan de forma manual en la estación de trabajo para cumplir con la tarea y procesos necesarios, denominada TT, y el tiempo de espera que es el tiempo en el cual el computador realiza actividades autónomas como descargas o instalaciones, en el cual el operario solo puede espera hasta que estas actividades terminen, denominado TE.

 

 

 

 

Tabla 3: Comparación de tiempos de operación necesarios para desplegar OdontoApp.

Fuente: Elaboración propia.

Cantidad de recursos de hardware

En este experimento, se ha tomado cierta cantidad de recursos como referencia para la comparativa. Los recursos destinados al ambiente de desarrollo fueron los siguientes: En cuando a la CPU toda la capacidad existente, de la memoria RAM el 50% y del almacenamiento 2 Gigabytes (GB). Con base en esto se obtienen los siguientes resultados.

Almacenamiento: El almacenamiento se trata de la cantidad de espacio con la que cuenta el disco duro del computador del desarrollador para almacenar archivos. En sistemas de producción los discos duros pueden llegar a ocupar Terabytes de información, en el caso de ambientes de desarrollo el espacio en disco es limitado y compartido entre proyectos e información personal del desarrollador. Por lo tanto, es fundamental que los ambientes sean óptimos para que solo contengan los archivos necesarios para desarrollar. Las métricas a continuación están en megabytes, y se refiere a los programas o imágenes que se necesita descargar e instalar para desplegar el ambiente de desarrollo.

Tabla 4: Comparación de consumo de almacenamiento entre procesos de despliegue de OdontoApp.

Fuente: Elaboración propia.

Memoria RAM: El computador del desarrollador comparte su espacio total de memoria RAM entre los procesos del sistema operativo y los procesos de las aplicaciones que ejecuta el usuario, entre las cuales pueden estar navegadores Web, editores de código, terminales, programas utilitarios, entre otros. Por tal motivo, se ha considerado solamente el 50% de la memoria RAM total (6 GB) para que el desarrollador ejecute el ambiente de desarrollo de OdontoApp. El ambiente necesita de 3 servicios para el desarrollo, las métricas del consumo de cada uno se detallan a continuación en megabytes (MB):

Tabla 5: Comparación de consumo de memoria RAM entre procesos de despliegue de OdontoApp.

Fuente: Elaboración propia.

Procesamiento: La última comparativa de recursos, pero no menos importante, es la de los porcentajes de uso de CPU de los procesos de despliegue común y con Docker. El proceso común instala los programas directamente en el sistema operativo, lo que permite darle acceso directo sin límite a los recursos de hardware como CPU. Esto no solo pone en riesgo la estabilidad del sistema operativo completo al poder tomar indefinidamente toda la capacidad de procesamiento, sino que también pone en riesgo el computador por algún virus debido a que los procesos no están aislados. Por otro lado, los servicios en Docker Compose pueden establecer límites individuales de acceso a los recursos de hardware como CPU, y de llegar a superarlos eliminar los contenedores sin poner en riesgo la estabilidad del sistema operativo. Otra ventaja importante es que todos los contenedores son procesos aislados, lo que evita que algún virus infecte el computador por completo. A continuación, presentamos las métricas del uso de núcleos (hilos) de CPU en porcentajes para la ejecución de los servicios del ambiente de desarrollo.

 

 

 

 

Tabla 6: Comparación de consumo de CPU entre procesos de despliegue de OdontoApp.

Fuente: Elaboración propia.

Una vez analizado el uso de los recursos más importantes del computador de un desarrollador, se define la siguiente tabla comparativa resumen que establece el porcentaje general de consumo de recursos de hardware por cada proceso de aprovisionamiento.

Tabla 7: Comparación de uso de recursos total entre procesos de despliegue de OdontoAp.

Fuente: Elaboración propia.

 

Resultados y discusión

La investigación ha permitido determinar que es posible virtualizar en contenedores los servicios del ambiente de desarrollo de OdontoApp para estandarizar su aprovisionamiento, permitiendo optimizar los recursos de hardware de los computadores y el tiempo que los desarrolladores invierten en desplegar sus ambientes de trabajo.

En la tabla 8 podemos resumir que el proceso de aprovisionamiento y despliegue del ambiente de desarrollo en contenedores con Docker, resulta más eficiente con el uso de recursos de hardware del computador, requiere menos intervención del desarrollador para ejecutarlo, además de optimizar uno de los recursos más importantes, el tiempo de aprovisionamiento.

 

 

 

Tabla 8: Resumen comparativo del proceso de despliegue común de OdontoApp y el proceso con Docker.

Fuente: Elaboración propia.

Esta investigación además quiere exponer a la comunidad científica que el aislamiento de procesos en contenedores y la optimización de recursos de hardware y tiempo del desarrollador, puede habilitar la posibilidad de implementar en un mismo computador varios proyectos de software, aumentado la productividad del desarrollador. También permitiría, a través del registro de imágenes de las aplicaciones, la integración y despliegue continuo, la estandarización del ambiente de producción y su integración con orquestadores de contenedores para su escalamiento horizontal.

 

Conclusiones

Se ha evidenciado que la virtualización en contenedores de los servicios para el proceso de despliegue del ambiente de desarrollo, sí reducen el tiempo necesario de aprovisionamiento y sí automatiza las tareas que comúnmente el desarrollador tiene que ejecutar para instalar su ambiente de trabajo.

También se ha expuesto que los beneficios de la contenedorización no solo están en los ambientes de desarrollo. Los contenedores pueden estar presentes en todo el ciclo de vida y distribución del software; permitiendo a las áreas de desarrollo, DevOps, QA, entre otras, ser más eficientes en su trabajo diario.

Por último, podemos concluir que la popularidad, el aporte comunitario, el soporte y la integración con herramientas de terceros que disponen los contenedores de Docker, tienen un nivel muy alto y que hoy en día en la industria del software los contenedores son un estándar de facto para el despliegue de aplicaciones nativas en la nube.

 

Referencias

1.      Bhardwaj, A., & Krishna, C. R. (2019). A Container-Based Technique to Improve Virtual Machine Migration in Cloud Computing. IETE Journal of Research, 0(0), 1–16. https://doi.org/10.1080/03772063.2019.1605848

2.      Guzmán, P. C., Gorostiaga, F., & Sánchez, C. (2018). i2kit: A Deployment Tool with the Simplicity of Containers and the Security of Virtual Machines. Lecture Notes in Computer Science (Including Subseries Lecture Notes in Artificial Intelligence and Lecture Notes in Bioinformatics), 11233 LNCS, 81–95. https://doi.org/10.1007/978-3-030-02922-7_6

3.      Kaur, R., & Sengupta, J. (2010). Phased model for component driven approach in software development lifecycle. ICCET 2010 - 2010 International Conference on Computer Engineering and Technology, Proceedings, 4, 113–116. https://doi.org/10.1109/ICCET.2010.5485696

4.      Khalyly, B. El, Belangour, A., Erraissi, A., & Banane, M. (2020). Devops and microservices based internet of things meta-model. International Journal of Emerging Trends in Engineering Research, 8(9), 6254–6266. https://doi.org/10.30534/ijeter/2020/217892020

5.      Kotouza, M. T., Psomopoulos, F. E., & Mitkas, P. A. (2020). A dockerized framework for hierarchical frequency-based document clustering on cloud computing infrastructures. Journal of Cloud Computing, 9(1). https://doi.org/10.1186/s13677-019-0150-y

6.      Marathe, N., Gandhi, A., & Shah, J. M. (2019). Docker swarm and kubernetes in cloud computing environment. Proceedings of the International Conference on Trends in Electronics and Informatics, ICOEI 2019, 2019-April(Icoei), 179–184. https://doi.org/10.1109/icoei.2019.8862654

7.      Mens, T., Cataldo, M., & Damian, D. (2019). The social developer: The future of software development [guest editors’ introduction]. IEEE Software, 36(1), 11–14. https://doi.org/10.1109/MS.2018.2874316

8.      Mohan, V., Ben Othmane, L., & Kres, A. (2018). BP: Security concerns and best practices for automation of software deployment processes: An industrial case study. Proceedings - 2018 IEEE Cybersecurity Development Conference, SecDev 2018, 21–28. https://doi.org/10.1109/SecDev.2018.00011

9.      Pfeiffer, R. H. (2020). What constitutes Software?: An Empirical, Descriptive Study of Artifacts. Proceedings - 2020 IEEE/ACM 17th International Conference on Mining Software Repositories, MSR 2020, 481–491. https://doi.org/10.1145/3379597.3387442

10.  Piedade, B., Dias, J. P., & Correia, F. F. (2020). An empirical study on visual programming docker compose configurations. Proceedings - 23rd ACM/IEEE International Conference on Model Driven Engineering Languages and Systems, MODELS-C 2020 - Companion Proceedings, 403–412. https://doi.org/10.1145/3417990.3420194 

11.  Schmitt, A., Theobald, S., & Diebold, P. (2019). Comparison of Agile Maturity Models. In Lecture Notes in Computer Science (including subseries Lecture Notes in Artificial Intelligence and Lecture Notes in Bioinformatics): Vol. 11915 LNCS. https://doi.org/10.1007/978-3-030-35333-9_52

12.  Watada, J., Roy, A., Kadikar, R., Pham, H., & Xu, B. (2019). Emerging Trends, Techniques and Open Issues of Containerization: A Review. IEEE Access, 7, 152443–152472. https://doi.org/10.1109/ACCESS.2019.2945930

13.  Yadav, R. R., Sousa, E. T. G., & Callou, G. R. A. (2018). Performance comparison between virtual machines and docker containers. IEEE Latin America Transactions, 16(8), 2282–2288. https://doi.org/10.1109/TLA.2018.8528247

14.  Zhao, X., Tian, J., & Xue, L. (2020). Herding and Software Adoption: A Re-Examination Based on Post-Adoption Software Discontinuance. Journal of Management Information Systems, 37(2), 484–509. https://doi.org/10.1080/07421222.2020.1759941

15.  Zheng, Y., Jin, D., & Nicol, D. M. (2012). Validation of application behavior on a virtual time integrated network emulation testbed. Proceedings - Winter Simulation Conference. https://doi.org/10.1109/WSC.2012.6465240

16.  Zhou, X., & Liu, Y. (2010). Toward proactive knowledge protection in community-based software development. Proceedings - International Conference on Software Engineering, 76–83. https://doi.org/10.1145/1833310.1833323

17.  Zhu, H., & Bayley, I. (2018). If Docker is the Answer, What is the Question? Proceedings - 12th IEEE International Symposium on Service-Oriented System Engineering, SOSE 2018 and 9th International Workshop on Joint Cloud Computing, JCC 2018, 152–163. https://doi.org/10.1109/SOSE.2018.00027

 

 

©2021 por los autores.  Este artículo es de acceso abierto y distribuido según los términos y condiciones de la licencia Creative Commons Atribución-NoComercial-CompartirIgual 4.0 Internacional (CC BY-NC-SA 4.0)

(https://creativecommons.org/licenses/by-nc-sa/4.0/).