En esta serie de blogs se pretende explicar y entender desde 0 todo sobre contenedores. Este primer artículo es una introducción para familiarizarnos con los conceptos. En los siguientes nos centraremos en Docker, Kubernetes y terminaremos viendo Red Hat OpenShift Container Platform y HPE Container Platform, recién anunciado como parte de ‘Ezmeral’.
Evolución
Vamos a empezar viendo de forma rápida la transición por la que la tecnología ha ido pasando. No solo el hardware evoluciona de forma rápida, ofreciéndonos procesadores cada vez más potentes, memoria y discos más rápidos… sino que las tecnologías de infraestructura también lo hacen:
Con la llegada de la virtualización, hemos conseguido aprovechar y sacar el máximo partido a los recursos de cómputo y almacenamiento de nuestros servidores, permitiendo ejecutar más de un sistema virtual y múltiples SO y apps sobre una misma plataforma con una capa de software. Esto nos ha permitido ahorrarnos la necesidad de adquirir hardware nuevo cada vez que necesite ejecutar una aplicación diferente.
Más adelante, apareció “la nube”. El hecho de poder consumir y pagar solo por los recursos que necesitamos, ofrecidos de forma ágil, sonaba y suena genial, y por eso ha tomado tanta fuerza.
Y ahora… contenedores, contenedores y más contenedores. Este término ya existe desde hace 5 o 6 años pero realmente se están adoptando ahora.

Un error que solemos cometer es asociar el término “contenedores” a la nube, pero no tiene por qué ser así. Vamos a poder ejecutarlos tanto desde una máquina física en un datacenter (on-premise) a una máquina virtual en una nube privada o pública. De hecho, se estima que más de la mitad de los contenedores van a funcionar sobre plataformas on-premise.

¿Por qué vamos hacia contenedores?
Con la evolución que hemos visto, cada vez estamos más alineados con las necesidades de la empresa: rapidez, agilidad, flexibilidad y la capacidad de poder ofrecer los servicios en el momento adecuado. Sin embargo, aún nos encontramos con piedras por el camino, como el aprovisionamiento o la actualización de plataformas, y aunque vamos mejorando, de momento no es suficiente. Por eso los contenedores llegan como respuesta: nos proporcionan más ahorro de costes de licenciamiento, de infraestructura, pudiendo sacar partido a herramientas que permiten automatizar los recursos, y dando una respuesta rápida a los entornos que necesitan flexibilidad.
¿Qué es un contenedor?

Según la RAE, un contenedor es un ‘recipiente de grandes dimensiones destinado al almacenamiento y transporte de mercancías’. Es decir, una plataforma estándar que nos permite mover contenidos de un lado a otro de forma independiente. Si este concepto lo adaptamos a la tecnología, nos van a simular la forma de trabajar.
Lo que se hace es meter en ese contenedor todos los elementos necesarios para hacer que una aplicación funcione. Por ejemplo, una versión de Java en concreto, Tomcat (el software que realmente estará ejecutando mi aplicación y haciendo que pueda interactuar con ella), Maven, la propia aplicación… Por lo tanto, podré mover ese contenedor y ejecutar mi aplicación en cualquier dispositivo que tenga instalado Docker sin tener que instalar nada más ni preocuparme de si las versiones son compatibles.
Docker & Kubernetes
Docker es el motor, el equivalente al hipervisor, la tecnología de creación de contenedores, o como queramos definirlo, que permite la creación y el uso de contenedores. Sin embargo, no gestiona nada.
La herramienta de gestión, el que se dedica a orquestar y manejar los contenedores es Kubernetes. Nos va a permitir hacer las conexiones, migrar un contenedor que corre en la nube para que ejecute on-premise, entre otras cosas. Es por eso, que realmente hasta que no ha aparecido Kubernetes, el uso de los contenedores no se ha extendido. Por hacer un símil, es como en el caso de la aparición de VMware vCenter en el caso de la virtualización, para manejar tanto nuestros hosts como VMs.
En los siguientes artículos hablaremos en detalle sobre estas soluciones.
Diferencias entre contenedores y VMs

Si lo planteamos como una fórmula:
Virtualización de recursos = Servidor + Hipervisor (ESXi / KVM / HyperV…) + VMs
Containers = Servidor + SO + Motor (Docker) + Aplicaciones virtualizadas
Pero vamos a entenderlo y ver qué ventajas tenemos al evolucionar hacia contenedores.
Una VM es un entorno donde emulamos los componentes físicos de un servidor y ponemos su SO y sus aplicaciones. Los contenedores nos quitan la dependencia con el SO de cada VM. No es que no lo necesitemos, sino que lo ponemos como una pieza común para todo el entorno y un motor para gestionarlos (Docker Engine). No necesitamos la parte del hipervisor, por lo tanto nos ahorramos esa licencia. Por eso, las apps arrancan mucho más rápido y permiten la movilidad, ya que llevan todo lo necesario para su funcionamiento.
Pros y Contras

Casos de uso
Hemos visto parte de los beneficios que nos proporciona tener cualquiera de nuestras cargas en contenedores. Aun así, unos casos de uso se benefician más que otros.

Y claramente, el que destaca es DevOps. El mundo cada vez está más centrado en los dispositivos móviles cuyas aplicaciones están constantemente actualizándose, por lo que necesitamos tener estándares que reduzcan el tiempo de desarrollo, desde el diseño hasta la implementación.
Es indudable el valor que los contenedores aportan tanto a los programadores como a los administradores de software, especialmente a aquellos que hayan adoptado un flujo de trabajo centrado en DevOps. Entonces, ¿cuáles son estos beneficios que obtienen los equipos de desarrollo desplegando sus aplicaciones como contenedores?
- No tener que programar varias veces para cada SO donde se ejecute, ya que los contenedores se van a ejecutar sobre cualquiera que tenga Docker instalado. Valdría con hacerlo 1 sola vez para Docker
- Aplicaciones modulares. El hecho de poder ejecutar microservicios en contenedores dentro de nuestra app, va a ahorrarnos muchos quebraderos de cabeza y de tener que revisar la aplicación completa cada vez que queramos ejecutar cambios o aparezca un error.
- Mayor tranquilidad y confianza, ya que el entorno de pruebas es idéntico al entorno final en el que se va a ejecutar el software
Compañías como Netflix, Spotify o PayPal hace tiempo que apostaron por la tecnología de Docker, que les ha permitido reducir muchísimo los tiempos de desarrollo y obtener un mayor beneficio.
Para soluciones de IA / ML también obtenemos grandes beneficios, ya que vamos a automatizar la instalación, el aprovisionamiento y el autoescalado de los modelos / frameworks de ML basados en contenedores. Además de la portabilidad y flexibilidad que nos dan para que las aplicaciones con tecnología ML se desarrollen y entreguen on-premise, en el extremo o en la cloud.
Si después de todo esto aún sigues leyendo humo, te parece todo muy abstracto y sigues sin estar muy convencido de llevar a cabo la transformación hacia los contenedores: stay tuned…