Contenedores de Software: ¿Qué, Por Qué y Para Qué?

Juan Diego Echeverri Mesa
Director de Operaciones

Software de Calidad

Como bien lo dice el título de este artículo, su propósito es exponer, un poco, acerca de los tan afamados contenedores de software y el por qué de su bien ganada fama. Sin embargo, antes de adentrarnos en el mundo de los contenedores, quiero traer a colación y recordar algunos de los aspectos bajo los cuales se ha considerado, a lo largo del tiempo, el software de calidad.

El primero de ellos es la Flexibilidad, la cual se define como la capacidad del software para agregar, modificar o quitar funcionalidad sin dañar el sistema. Sabemos que el cambio es inevitable en el desarrollo de software, los requisitos cambiantes y el incremento iterativo de las soluciones de software así lo establecen, por lo tanto, esta es una de las propiedades de mayor relevancia para el software de calidad. Muy cerca del concepto de Flexibilidad se encuentra el de Mantenibilidad, aunque este último se centra más en la solución de incidentes que en los cambios del producto.

Por otro lado, nos encontramos con el concepto de Rendimiento, el cual se define en función del tiempo de respuesta del software, lo cual a su vez debe considerar el costo de recursos, por lo cual debe estar apoyado en el aprovechamiento apropiado de los mismos. De la mano con el Rendimiento, aparece la Escalabilidad, es decir, la capacidad del software para adaptarse a las necesidades de rendimiento a medida que su carga crece (usuarios y/o transacciones). Puede darse solución a este aspecto mediante el incremento de hardware (escalamiento vertical), el cual generalmente brinda una solución temporal, o en un escenario ideal, establecer una red de nodos trabajando como un todo (escalamiento horizontal).

Adicionalmente, la Disponibilidad, según la cual, como su nombre mismo lo dice, el software debe permanecer disponible y estar en capacidad de recuperarse incluso si alguno de sus componentes falla (Tolerancia a Fallos), además de que su información y comportamiento deben continuar siendo consistentes (Fiabilidad).

Finalmente, aparecen la Compatibilidad y la Portabilidad, las cuales básicamente apuntan a que un software de calidad debe funcionar en tantas plataformas como sea posible. El software de calidad requiere ser certificado y la posibilidad de ser puesto a prueba bajo condiciones cercanas a ambientes productivos debe ser lo más alta posible (Testabilidad), ambientes en los que el software debe ser administrable y fácilmente configurable después del despliegue (Gestión).

Al igual que los aspectos antes mencionados, existen algunas otras características para el software de calidad, sin embargo, he decidido omitirlas, dado que no aplican tanto al mundo de los contenedores. Más adelante veremos y entenderemos el por qué, de dar inicio a este artículo desde esta visión.

¿Qué son los Contenedores de Software?

Para explicar qué son los contenedores de software desde un nivel más simple de abstracción, la analogía más clara con el mundo real es, de hecho, la de los contenedores de mercancía que normalmente vemos que son transportados en barco de un sitio a otro. En principio, para esta analogía, lo más importante es su forma modular para ser almacenados y transportados de un sitio a otro, ¿te imaginas cuál sería el costo de llevar todo el contenido que normalmente viaja dentro de un contenedor, de un barco a otro ante una posible eventualidad? ¡Altísimo, seguro que sí!

Actualmente, en el mundo de la informática, y puntualmente en el del desarrollo de software, se habla mucho de contenedores de software. El concepto de contenedor de software básicamente es el de un paquete lógico de elementos (archivos, variables, librerías e incluso código), que permite que una aplicación se ejecute correctamente independientemente del sistema operativo sobre el cual se despliegue, esto incluye el escenario en el que su entorno de ejecución cambie.

Todo lo anterior se logra mediante un archivo de configuración, el cual contiene una descripción liviana de las característica de ejecución del contenedor, lo cual además, tiene como ventajas el poder ser versionado, reutilizado y replicado fácilmente. El archivo de configuración del contenedor es suficiente para adecuar el entorno de ejecución y configurar el servidor dónde va a ser desplegado, y a partir de él, se puede generar una imagen que puede ser desplegada en un servidor en cuestión de segundos.

Como verás, es un concepto muy similar al de virtualización, aunque no idéntico, cuenta con unas diferencias muy significativas. Las máquinas virtuales permiten la virtualización de la infraestructura de cómputo (recursos), mientras que los contenedores habilitan la infraestructura de software para las aplicaciones. Por otro lado, los contenedores hacen uso del sistema operativo de la máquina sobre la cual se ejecuta, en lugar de proporcionar un sistema operativo propio, lo cual los hace más eficientes, livianos y versátiles.

Un vistazo rápido desde la Arquitectura del Software

Hasta hace algunos años, el mundo de las aplicaciones era dominado por los monolitos, un conjunto de elementos (UI, capa de negocio, acceso a datos, etc.) que tenían que ser desarrollados, desplegados y administrados como un único componente, es decir, estaban completamente acoplados. Esto dificultaba, o incluso, imposibilitaba la escalabilidad, además, un desarrollador tenía que instalar y probar toda la solución por un cambio mínimo y una salida a producción era inevitablemente un dolor de cabeza.

Hace poco menos de una década, apareció el concepto de la Arquitectura de Software basada en microservicios. Conjuntos de aplicaciones pequeñas, con responsabilidades particulares, que se comunican entre sí para ofrecer una solución completa, permitiendo una configuración de ambiente, desarrollo y despliegue más liviana, así como aportar mayor fiabilidad y disponibilidad, ya que cuando se requieren modificaciones al software, se interviene y despliega únicamente el microservicio particular responsable de lo que se encuentra sujeto de modificación. Esto nos acerca al concepto de contenedores que ya hemos venido tratando.

Te preguntarás, ¿acaso qué tienen que ver los microservicios y los contenedores?, ¡Mucho! Los diferentes componentes que conforman una aplicación de software implementada bajo la arquitectura de microservicios deben ser orquestados, es decir, relacionados entre sí para que, como es su propósito, puedan actuar como un todo.

La forma de desarrollar y liberar las aplicaciones naturalmente cambió con la entrada de los microservicios, lo cual a su vez trajo consigo un cambio en la administración de la infraestructura requerida para cada uno de los diferentes componentes. Por ejemplo, anteriormente un único componente accedía a la información de la base de datos, la procesaba, se integraba con otras aplicaciones, la presentaba al usuario, etc., ahora son varios los componentes encargados de realizar cada una, o varias, de esas tareas. Ante lo anterior, los contenedores brindaron la posibilidad de encapsular los microservicios, facilitando la configuración, parametrización, mantenimiento y administración de la infraestructura de diferentes componentes y aplicaciones con características similares. En resúmen, los contenedores permiten crear plantillas de infraestructura y minimizar el esfuerzo en configuración para cada grupo de aplicaciones, incluso mediante la automatización de algunas tareas.

Como ves, los contenedores, hoy en día, juegan un papel importantísimo en la evolución arquitectónica del software y la manera en que ha evolucionado su desarrollo y despliegue.

¿Por qué contenedores?

El concepto de contenedores no es nuevo, aunque en nuestro medio aún así parezca. Ahora, ¿por qué ha cogido tanto auge este concepto en los últimos años? Básicamente porque los contenedores de software resultan muy útiles desde el punto de vista del desarrollo mismo de aplicaciones, pero no se limita a esto, tiene además un impacto enormemente positivo desde la eficacia en procesos de migración de un desarrollo de una plataforma a otra; su administración antes, durante y después del despliegue, y su transición de ambiente de desarrollo a ambiente productivo.

Bajo un marco de trabajo de desarrollo de software alejado del mundo de los contenedores, se tiene una gran cantidad de retos adicionales con los que el equipo de desarrollo y operaciones deben lidiar a lo largo de un proyecto e incluso después de su finalización. Uno de ellos es el hecho de tener un ambiente de desarrollo estándar que funcione adecuadamente en diferentes máquinas, e incluso y sorprendemente, en una misma máquina cuando, por algún motivo, se requiere un proceso de reinstalación o reconfiguración.

Gracias a los contenedores de software, los desarrolladores pueden tener aislado el entorno de ejecución de su aplicación de las configuraciones propias del sistema operativo de su máquina, siendo esto además, un insumo importante para escenarios como la entrada de nuevos miembros al equipo de desarrollo. Los altos tiempos que tomaba anteriormente configurar un ambiente de desarrollo (días o semanas), se limitan ahora a minutos.

Por otra parte, hacer la transición entre ambientes es uno de los grandes dolores de cabeza de todo equipo de desarrollo y operaciones. Generalmente, el desarrollador tiene su ambiente local totalmente adecuado para el correcto funcionamiento del desarrollo y la aplicación, pero en el tiempo, es posible que se olviden algunas configuraciones puntuales del mismo, lo que representa un alto riesgo al momento de hacer un paso a un segundo ambiente, ya sea de aseguramiento de calidad o peor aún, de producción, allí es donde generalmente aparece nuestra popular frase de batalla “en mi máquina funciona”.

Existen compañías que tienen una gran cantidad de ambientes para una misma aplicación (laboratorio, desarrollo, pruebas, certificación, QA, UAT, pre-producción, producción, en otros más), ¿te imaginas el esfuerzo que representa hacer cada una de las transiciones hasta llegar a producción? Todo esto desaparece con los contenedores de software, ya que por medio de ellos se tiene la capacidad de replicar una aplicación en cualquier lugar, sin necesidad de que el entorno donde se despliegue cumpla con las configuraciones particulares de la aplicación misma, lo que además, permite tener mayor cantidad de aplicaciones corriendo al tiempo en un mismo servidor, cada una con sus propias configuraciones sin que se generen escenarios de competencia entre ellas y sus configuraciones.

Ventajas de los Contenedores de Software, ¿Para qué?

Como ya he mencionado antes, los contenedores de software imprimen un componente de portabilidad muy interesante, ya que una vez que se tiene la aplicación dentro de un contenedor, se tiene la posibilidad de llevarlo fácil y rápidamente, así como de manera casi transparente, al sistema operativo que se considere más conveniente en un momento determinado. Las diferencias que tienen los sistemas operativos, las cuales causan inconvenientes en las aplicaciones al cambiar de entorno, desaparecen casi en su totalidad.

Los contenedores son una gran apuesta a la manera en que se despliegan las aplicaciones sobre la infraestructura tecnológica sin importar el entorno en el que esté configurado, y resultan de gran utilidad para la automatización de procesos de despliegue, lo cual a su vez es una tendencia importantísima en el mundo actual del desarrollo de software.

Los tiempos de configuración de ambiente, desde la fase de desarrollo misma, se reducen drásticamente, adicionalmente, los desarrolladores trabajan con ambientes cercanos a los ambientes de QA y producción, lo cual les permite incluso realizar pruebas del funcionamiento de la aplicación bajo ciertas características provistas por el contenedor y predecir ciertas condiciones o comportamientos del entorno de despliegue. De igual manera, se pueden distribuir las aplicaciones en despliegues de componentes por separado, lo que permite a los desarrolladores trabajar sobre componentes individuales y no sobre la solución completa.

Por otra parte, al trabajar bajo el aislamiento propio de los contenedores, cada contenedor se encarga, por separado, del despliegue y configuración del software y aplicaciones empaquetados en sí mismo, lo que disminuye la dependencia de la administración del sistema operativo.

Desde el punto de vista del servidor y su gestión, se tiene una mayor visibilidad y capacidad de administración de recursos físicos, ya que las aplicaciones que corren dentro de un contenedor solo pueden ver la información y dispositivos habilitados para él, lo cual permite un mayor control de recursos por parte de los administradores de sistemas y la posibilidad de escalar con rapidez, así como una disminución significativa de la carga en los servidores, logrando desplegar un mayor número de aplicaciones si así se requiere.

Finalmente, los equipos de operaciones y desarrollo tienen responsabilidades independientes y definidas. Los equipos de desarrollo pueden enfocarse en la aplicación y sus dependencias, mientras que los equipos de operaciones se pueden concentrar en la administración de la infraestructura sin preocuparse por las aplicaciones. Ahora bien, que las responsabilidades estén definidas no significa que los equipos trabajen de manera totalmente independiente, de hecho, dentro de metodologías como la de DevOps, para la cual los contenedores son de gran valor, la intención es justamente que trabajen de manera conjunta, pero cada uno con sus deberes claros al respecto, de manera que ahora dediquen menos tiempo a identificar diferencias entre los múltiples entornos de despliegue de la aplicación y más tiempo a ofrecer nuevas funcionalidades.

En conclusión…

Casi desde su definición misma, los contenedores de software brindan muchas ventajas significativas en función del aislamiento, la portabilidad, el rendimiento, la escalabilidad y el control a lo largo de todo el ciclo de vida de la aplicación. No sólo se encargan de facilitarnos la vida con respecto al desarrollo sino que nos ayudan a conseguir, casi que de manera implícita, los conceptos de calidad de software mencionados en un principio.

Te invito a conocer un poco más del mundo de los contenedores de software en la práctica y a comprobar por tí mismo su valor agregado para el desarrollo y despliegue de aplicaciones, y por ende, el por qué de su gran acogida. 

Nos vemos en una próxima entrega de este y otros temas de interés.

Fotografía tomada de: https://www.netec.com/post/comprendiendo-kubernetes-y-docker