Continuando el tema de micro-servicios y cómo podemos implementarlo vamos tocar el tema de Docker. Seguramente hemos escuchado de Docker en alguna conferencia o de algún compañero de trabajo pero no nunca llegamos a comprender del todo que es y en que podría ayudarnos esta tecnología.
Objetivo
El objetivo de esta publicación es tocar las posibles utilizaciones y el alcance de dockers. Ver cómo podemos utilizarlo en una arquitectura de microservicios. Sus beneficios como también que puntos debemos tener en cuenta para poder llevarla adelante. El objetivo principal es entender de una forma clara y sencilla que es Docker.
Audiencia
Este documento está dirigido a personas que conocen muy poco o nada sobre el tema. No nos meteremos en aspectos técnicos, tampoco como ejecutarlo o como se debe usar.
Desarrollo
Básicamente Docker nos da la posibilidad de crear contenedores muy livianos y fácilmente portables para nuestras aplicaciones. Independiente del sistema operativo que utilicemos podremos ejecutar un contenedor Docker en cualquier máquina. Esta característica nos facilita mucho el despliegue de nuestras aplicaciones.
Seguramente se preguntaran, ¿Pero… que es un contenedor? el concepto viene originalmente de la plataforma linux, no es realmente un concepto nuevo, pero hoy muy de moda. La idea viene de los contenedores que llevan los barcos para transportar productos que pueden ser o no del mismo tipo.
Docker nos permite meter todo lo que necesitamos para ejecutar nuestra aplicación en un contenedor e inclusive la propia aplicación. Supongamos que queremos implementar un micro-servicio que está desarrollado con .Net Framework. Dentro del contenedor podremos poner todos los componentes necesarios para la ejecución del servicio, el servidor web, componentes de terceros sin preocuparnos de las versiones de software que tiene instalada, si las tiene instalada, si están lo componentes necesarios en nuestra máquina donde se alojara el contenedor.
¿Y en qué nos beneficia?
Docker puede ser utilizado en cualquier entorno de IT. Puede dar soporte a equipos de desarrollo o equipos de infraestructura ayudando a que las aplicaciones y ejecuten fácilmente y aumentando nuestra capacidad de despliegue de estas.
Desde mi punto de vista, como desarrollador, me permite olvidarme si el la aplicación que estoy construyendo funcionara correctamente en la máquina que va a ser ejecutada permitiendo enfocarme completamente en dicha construcción.
Vamos a dar un ejemplo bastante usado en internet:
- Matías tiene en su computadora instalado la versión de .Net Framework 4.5 y se encuentra programando una micro-servicio con funcionalidades específicas de esta versión.
- Florencia en su máquina tiene instalado las versión de .Net Framework 3.5 debido a que está trabajando en un proyecto distinto. Matías quiere que Florencia pruebe su micro-servicio en su máquina pero si ella no instala .Net Framework 4.5 la aplicación no funcionará.
Si estamos usando Docker no tendremos este inconveniente. Matias creará un contenedor con todo lo necesario para que el micro-servicio funcione y se lo pasará a Florencia. Como Florencia tiene instalado en su máquina Docker podrá ejecutar la aplicación sin necesidad de instalar nada.
Algo para lo cual usamos mucho Docker es para hacer testing. Es muy fácil crear o eliminar un contenedor. Al ser muy livianos podemos usar varios contenedores en la misma máquina y el contenedor funcionara en cualquier maquina que tenga instalado docker sea Windows, Linux, MacOs o Inclusive en la Nube como Azure. También al contenedor es ser más liviano que una máquina virtual puede reducir mucho el hardware que utilizaremos
Docker Vs Máquina Virtual
Podemos tener varios contenedores en la misma máquina, pero… ¿en qué se diferencia de una máquina virtual si también podemos tener varias? Es muy similar en algunas cosas pero la gran diferencia es que en una máquina virtual necesitamos instalar un sistema operativo y en un contenedor no.
Algunas características específicas de los sistemas operativos pueden causar problemas cuando queremos portar nuestras aplicaciones en diferentes entornos. Un contenedor de Docker toma los aspectos básicos de funcionamiento de un sistema operativo donde se encuentra ejecutándose este.
Cosas que tenemos en Docker
Tenemos varios elementos que tenemos disponibles en docker. Cada elemento nos brinda un serie de beneficios dependiendo de cómo los usemos. Los más fuertes son Imágenes y Contenedores.
Imágenes
Las imágenes son muy parecido a un snapshot de una máquina virtual pero no olvidemos que es mucho más liviano. Los usaremos como una plantilla para nuestros contenedores. Estas imágenes las utilizaremos para crear nuestros contenedores.
Hay mucho repositorios públicos donde podemos obtener imágenes para crear contenedores siendo un buen punto de partida para crear los nuestros e ir agregando las cosas que necesitemos. Podemos empezar buscado aqui https://hub.docker.com
Contenedores
Podemos decir que son instancias de nuestras imágenes y son finalmente lo que ejecutan nuestras aplicaciones y de una imagen podemos ejecutar varios contenedores. Supongamos que necesitamos escalar nuestra aplicación porque aumentó su consumo. A partir de la imagen podríamos ir creando contenedores para atender las solicitudes.
Con Docker podemos ir administrado las versiones como si fuera una herramienta de control de versiones. Hacemos unos cambios, damos commit y se nos guardarán los cambios. Esto nos permitirá volver a versiones anterior por algún inconveniente que tengamos.
Conclusión
Docker puede darnos una gran ayuda en una arquitectura de micro-servicios. Nos facilitará no solo el desarrollo y el testing si no que nos garantizara una gran capacidad de despliegue con tiempo muy cortos. También, puede reducirse mucho los costos de infraestructura ya que son mucho más livianos que una máquina virtual. En el futuro vamos a ver una implementación de docker en Azure.