Saltar la navegación

1.1 ¿Qué es Docker?

Logotipo de Docker
dotCloud Inc.. Logotipo de Docker (Dominio público)

Si tuviéramos que definir Docker de una manera rápida y poco formal diríamos lo siguiente:

Docker es una tecnología de virtualización "ligera" cuyo elemento básico es la utilización de contenedores en vez de máquinas virtuales y cuyo objetivo principal es el despliegue de aplicaciones encapsuladas en dichos contenedores.

Dicho de esta manera puede parecer que no es más que otra tecnología de virtualización, pero para entender mejor cómo ha surgido esta tecnología y comprender las ventajas que aporta debemos echar un poco la vista atrás y conocer la evolución en el despliegue de aplicaciones.

En esa evolución nos podemos encontrar, de manera general y simplificada, con tres grandes pasos:

  • Arquitectura de un único servidor
  • Virtualización
  • Contenedores

A continuación describiremos estos tres pasos haciendo especial hincapié en sus ventajas e inconvenientes.

1. Un único servidor

Inicialmente, allá por la prehistoria de la informática (si podemos llamar prehistoria a los años 80 del siglo XX) las aplicaciones se desplegaban en un único servidor siguiendo un esquema similar al que podemos ver en la imagen:

Arquitectura de
                          Servidor Físico
Juan Diego Pérez Jiménez. Arquitectura de Servidor Físico (Dominio público)


Este enfoque tuvo su momento pero tenía varias LIMITACIONES:

  • Era un enfoque de costes elevados porque era necesaria un máquina de precio elevado.
  • El despliegue de aplicaciones era un proceso lento que podía suponer en algunos casos una parada del servicio.
  • El escalado de las aplicaciones era costoso y complicado. Si nuestra máquina llegaba un momento que se quedaba corta no había más remedio que sustituirla por otra más potente.
  • La migración a otro sistema era un proceso complicado. La configuración  del nuevo servidor, de su sistema operativo y de todas las dependencias tenía que ser compatible. Esto era algo complicado de gestionar y en algunos casos difícil de conseguir.
  • En muchos momentos, aquellos en los que el servidor no se utilizaba aprovechando su potencia, se estaban desperdiciando recursos.
  • Había mucha dependencia del fabricante del servidor.

2. Virtualización

Con el tiempo y para superar las limitaciones del modelo de un único servidor, la tecnología evolucionó hacia servidores con características de virtualización. De una manera simplificada, podríamos decir que para desplegar aplicaciones nos encontrábamos con arquitecturas similares a las siguientes:

Arquitecturas
                          basadas en virtualización.
Juan Diego Pérez Jiménez. Arquitecturas basadas en virtualización. (Dominio público)

Estos enfoques tenían una serie de BENEFICIOS que derivaban principalmente de superar las limitaciones del modelo de servidor único. A saber:

  • Hay un mejor aprovechamiento de los recursos. Un servidor potente se puede compartir entre distintas aplicaciones.
  • Los procesos de migración y escalado no son tan dolorosos, simplemente le doy más recursos a la máquina virtual dentro de mi servidor o bien muevo la máquina virtual a un nuevo servidor, propio o en la nube, más potente y que también tenga características de virtualización.
  • Esto además hizo que aparecieran nuevos modelos de negocio en la nube que nos permiten en cada momento tener y dimensionar las máquinas virtuales según nuestras necesidades y pagar únicamente por esas necesidades.

No obstante este enfoque también tiene algunos INCONVENIENTES:

  • Todas las máquinas virtuales siguen teniendo su propia memoria RAM, su almacenamiento y su CPU que será aprovechada al máximo...o no.
  • Para arrancar las máquinas virtuales tenemos que arrancar su sistema operativo al completo.
  • La portabilidad no está garantizada al 100%.

3. Contenedores

El siguiente paso en la evolución, fue la aparición de los CONTENEDORES, eso que anteriormente hemos llamado "máquinas virtuales ligeras" . Su arquitectura general se puede ver en la siguiente imagen:

Entorno de ejecución basado en
                          contenedores
Juan Diego Pérez Jiménez. Entorno de ejecución basado en contenedores (Dominio público)

Y sus principales características son las siguientes:

  • Los contenedores utilizan el mismo Kernel Linux que la máquina física en la que se ejecutan, gracias a la estandarización de los los Kernel y a características como los Cgroups y los Namespaces. Esto elimina la sobrecarga que en las máquinas virtuales suponía la carga total del sistema operativo invitado.
  • Permiten aislar las distintas aplicaciones que tenga en los distintos contenedores, o bien, comunicarlas entre ellas.
  • Facilitan la distribución de las aplicaciones ya que éstas se empaquetan junto con sus dependencias y pueden ser ejecutadas posteriormente en cualquier sistema en el que se pueda lanzar el contenedor en cuestión.
  • Se puede pensar que se añade una capa adicional  el Docker Engine, pero esta capa apenas añade sobrecarga debido a que se hace uso del mismo Kernel.

 Este enfoque por lo tanto aporta los siguientes BENEFICIOS:

  • Una mayor velocidad de arranque, ya que prescindimos de la carga de un sistema operativo invitado. Estamos hablando de apenas segundos para arrancar un contenedor (a veces menos).
  • Un gran portabilidad, ya que los contenedores empaquetan tanto las aplicaciones como sus dependencias de tal manera que pueden moverse a cualquier sistema en el que tengamos instalados el Docker Engine, y este se puede ser instalado en casi todos, por no decir todos.
  • Una mayor eficiencia ya que hay un mejor aprovechamiento de los recursos. Ya no tenemos que reservar recursos, como hacemos con las máquinas virtuales, sin saber si serán aprovechados al máximo o no.

Aunque como todo en esta vida, la tecnología de contenedores tiene algún INCONVENIENTE:

  • Los contenedores son más frágiles que las máquinas virtuales y en ocasiones se quedan en un estado desde el que no podemos recuperarlos. No es algo frecuente, pero ocurre, y para eso hay soluciones como la orquestación de contenedores que es algo que queda fuera del alcance de este curso.

GLOSARIO

Una vez hemos hecho una pequeña introducción al mundo de los contenedores,  y para acabar el apartado vamos a proceder a definir una serie de términos relacionados que usaremos con frecuencia a lo largo del curso:

Imagen

Dicho de una manera sencilla una imagen es una plantilla (ya sea de una aplicación o de un sistema) que podremos utilizar como base para la ejecución posterior de nuestras aplicaciones (contenedores). Si queremos una descripción más técnica y detallada, diremos que es un archivo comprimido en el que, partiendo de un sistema base, se han ido añadiendo capas cada una de las cuáles contiene elementos necesarios para poder ejecutar una aplicación o sistema. No tiene estado y no cambia, salvo que generemos una nueva versión o una imagen derivada de la misma.

Contenedor

Es una imagen que junto a unas instrucciones y variables de entorno determinadas se ejecuta. Tiene estado y podemos modificarlo. Estos cambios no afectan a la imagen o "plantilla" que ha servido de base.

Repositorio

Almacén, normalmente en la nube, desde el cuál podemos descargar distintas versiones de una misma imagen para poder empezar a construir nuestras aplicaciones basadas en contenedores.

Docker

Plataforma, por lo general opensource, pensada para el desarrollo, empaquetado y distribución de aplicaciones de la empresa Docker Inc (anteriomente Dot Cloud Inc). Es un término que se suele utilizar indistintamente al del Docker Engine.

Docker Engine

Aplicación cliente-servidor que consta de tres componentes: un servicio dockerd para la ejecución de los contenedores, un API para que otras aplicaciones puedan comunicarse con ese servicio y una aplicación de línea de comandos docker cli para gestionar los distintos elementos (contenedores, imágenes, redes, volúmenes etc..)

Docker Hub

Registro de repositorios de imágenes de la empresa Docker Inc. Accesible a través de la URL https://hub.docker.com/

Creado con eXeLearning (Ventana nueva)