En la segunda mitad del siglo XX se produjo una enorme innovación de la que no somos en absoluto conscientes. De hecho, cambió la forma en la que se hacen negocios alrededor del mundo. Yo mismo tampoco fui consciente de eso hasta que leí esta (https://www.gatesnotes.com/books/the-box) reseña de Bill Gates del libro «The Box» sobre como «los contenedores del transporte hicieron el mundo más pequeño y la economía mundial más grande».

Böx 
How the Shipping Container 
TQade the World Smaller and the 
World Economy Bigger 
Second Edition 
Marc Levinson

Y es que si  nos ponemos a pensar como fue el comercio durante siglos, nos damos cuenta que el proceso de carga/descarga  era tremendamente lento e ineficiente… la mercancía se transportaba a granel y se cargaba una y otra vez del carro, camión o tren en el barco y viceversa. Y eso fue así durante mucho tiempo hasta que, como ocurre muchas veces, alguien se puso a pensar en un método mejor… así un magnate del transporte por carretera, Malcom LcLead, se le ocurrió una genial idea ¿Por qué no transportar la mercancía en «contenedores» estándar? De esta manera, cuando un camión llega al puerto con una carga, una grúa coge el contenedor completo (sin abrirlo) y lo deposita tal cual en el barco.

La revolución de los contenedores se implantó completamente en los primeros años de la década de los 80 y abarató tremendamente los costes (se estima en un ahorro del 40 al 60 por ciento) y los tiempos en los que un producto podía ir de un extremo al otro del mundo.

¿Contenedores en T.I?

Ahora cambiemos de ámbito totalmente y pensemos en las aplicaciones informáticas que usamos todos los días, tanto en el trabajo como a nivel personal. Pues bien, estas aplicaciones también se «transportan»… desde el PC del desarrollador donde se construyen o «fabrican» hasta que llegan al «punto de venta», es decir, al entorno de producción donde pueden ser utilizadas por los usuarios y demás procesos de la empresa. Entre uno y otro,  hay todo un largo y, en muchas ocasiones, tortuoso viaje. En este viaje, como pasa en los contenedores físicos, es posible que la «mercancía» (la aplicación) sufre mucho… incluso a veces puede llegar incompleta (se ha «perdido» algo por el camino) o más frecuentemente, el entorno de destino no es el que se había previsto y no es exactamente como debería ser. La aplicación es muy «sensible» a su entorno y tiene que ejecutarse en un entorno lo más parecido posible, mejor si es exactamente igual, al que se pensó para ella.

Y entonces, ¿por qué no usamos el mismo concepto de contenedor para transportar la aplicación durante este viaje desde el PC del desarrollador al entorno de producción?  Parece una buena idea… y de hecho así es. Tanto que ya se ha aplicado con mucho éxito en T.I., y para no ser muy originales, recibe el mismo nombre… sí, tenemos contenedores de aplicaciones.

¿Y qué es esto de un contenedor de aplicaciones?

Simplificando mucho, podemos decir que para que una aplicación se pueda ejecutar, necesita un ordenador, una máquina donde ejecutarse con su CPU, disco duro, recursos de red, Etc. Etc. Pues bien, un contenedor es un ordenador completo donde se puede ejecutar la aplicación, pero tiene un truco. En realidad no es un ordenador de verdad, es uno virtual. Y lo que es más, es un ordenador virtual «light», muy ligero, que es capaz de arrancar en unos pocos segundos.

Un ordenador virtual tiene prácticamente las mismas características que uno físico pero realmente es sólo software. El secreto está en engañar a la aplicación para que se piense que se está ejecutando en un ordenador físico, completo y que es para ella sola. Evidentemente no es así, tendremos unos cuantos ordenadores físicos, dentro de ellos «correrán» decenas o ciento de ordenadores virtuales y, dentro de ellos, cientos o miles de contenedores.  Pero no olvidemos que para la aplicación un contenedor es un ordenador completo.

Así pues, sí, se puede «contenerizar» una aplicación, meterla en grandes cajones para ir moviendo la aplicación de un entorno a otro sin que haya que desempaquetarla y vuelta a empaquetar en cada trayecto de su viaje hasta el entorno de ejecución. Es más, como el contenedor es una ordenador completo, la aplicación siempre se ejecuta en el mismo entorno virtual independiente de donde se ejecute de manera física. Es como trasladar un pez de colores de casa en casa en su propia pecera 😉 la idea es que el pez se sienta como en casa y no haya que trasvasarlo continuamente… pues lo mismo con una aplicación en su contenedor.

Un estándar para gobernarlos a todos

OPENC NT I E I I 
AN OPEN GOVERNANCE STRUCTURE FOR THE EXPRESS PURPOSE OF 
CREATING OPEN INDUSTRY STANDARDS AROUNDCONTAINEÄ 
FORMATS AND RUNTIME

Y para que algo sea utilizable en todas partes sin que haya problemas de incompatibilidad, se necestia un estándar que defina qué es un contenedor y que éste pueda ser portado de un sitio a otro sin problema. El organismo que se encarga de esto es el OCI (Open Container Iniatiative).

Al final, con este estándar, lo que tenemos es una especie de contrato. Un contrato en el que se dice qué es lo que tiene que hacer y funcionar un contenedor. Si somos un fabricante de contenedores, si nos atenemos a este contrato, nuestro contenedor podrá usarse en todo el mundo (de igual modo que lo que pasa con los contenedores físicos que viajan de los camiones a los barcos y viceversa).

Decir contenedor, es decir Docker, y decir Docker es decir Kubernetes 🙂

Docker Security - 6 Ways to Secure Your Docker Containers

Los contenedores pueden tienen un problema, una empresa puede tener cientos o miles de contenedores (aplicaciones) en ejecución… y no puede ser que cada uno haga la guerra por su cuenta. Necesitamos a alguien que los organice, los coordine, los mantenga bajo control… que elimine los que están «enfermos» y que se encargue de renovar estos contenedores enfermos por otros nuevos…. Realmente es como si estuviésemos tratando con un ganado «digital», y necesitamos a un pastor, ese es Kubernetes.

La analogía con el ganado no es nueva, se aplica bastante en este mundo y creo que da una imagen es bastante clara. En los «viejos tiempos» cuando los servidores eran caros y escasos, los cuidábamos como si fueran mascotas. Les poníamos un nombre, los cuidábamos… nos preocupábamos cuando estaban enfermos, luchábamos contra sus virus, etc. Etc. Pero ahora los servidores son baratos, son fáciles de crear, podemos replicarlos, hacer cientos de copias (clonarlos), etc. Etc. Son tantos, que ni siquiera les ponemos nombres… esos son los contenedores, ahora son ganado.

Conclusión

La gestión de las aplicaciones en T.I. es un trabajo muy complejo. Por un lado tenemos muchos entornos (entorno local, entorno de Integracion, de Preprodución, Produccion) y la aplicación sufre mucho cuando los entornos no son totalmente idénticos. Por otra parte, necesitamos gestionar estos cientos o incluso miles de aplicaciones de manera industrial, como si fueran ganado y no una granja tradicional… para eso están los contenedores (Docker) y también necesitamos un pastor que controle este ganado para que no se desmande, ese es Kubernetes.