[Docker] Introducción

Que es. Docker es una herramienta open-source que nos permite realizar una ‘virtualización ligera’, con la que poder empaquetar entornos y aplicaciones que posteriormente podremos desplegar en cualquier sistema que disponga de esta tecnología. Para ello Docker extiende LXC (LinuX Containers), que es un sistema de virtualización que permite crear múltiples sistemas totalmente aislados entre sí, sobre la misma máquina o sistema anfitrión.

Imágenes y Contenedores. Los términos que hay que manejar con Docker son principalmente 2, las imágenes y contenedores.

Las imágenes en Docker se podrían ver como un componente estático, pues no son más que un sistema operativo base, con un conjunto de aplicaciones empaquetadas.

Mientras que un contenedor es la instanciación o ejecución de una imagen, pudiendo ejecutar varios contenedores a partir de una misma imagen. Haciendo una analogía con la POO (Programación Orientada a Objetos) una imagen es una clase y un contenedor es la instanciación de una clase, es decir un objeto.

Aunque hasta la versión 0.8.1 el proceso de aislamiento de Docker se basaba en los contenedores de Linux (LXC), la versión 0.9 ofrece un formato de contenedor desarrollado por el mismo Docker conocido como Libcontainer. Este permite el uso multiplataforma de Docker, así como la ejecución de un mismo contenedor en diferentes sistemas anfitriones. Además, ofrece una versión de Docker para macOS y Windows.

Docker vs Máquinas Virtuales

La gran diferencia es que una máquina virtual necesita contener todo el sistema operativo mientras que un contenedor Docker aprovecha el sistema operativo sobre el cual se ejecuta, comparte el kernel del sistema operativo anfitrión e incluso parte de sus bibliotecas.

En la imagen adjunta podemos ver esta diferencia entre el enfoque de las máquinas virtuales y el utilizado por Docker.

Respecto al almacenamiento en disco, una máquina virtual puede ocupar varios gigas ya que tiene que contener el sistema operativo completo, sin embargo los contenedores Docker sólo contienen aquello que las diferencia del sistema operativo en las que se ejecutan, por ejemplo un Ubuntu con Apache ocuparía unos 180 Mb.

Desde el punto de vista del consumo de procesador y de memoria RAM, los contenedores Docker hacen un uso mucho más eficiente del sistema anfitrión, pues comparten con él, el núcleo del sistema operativo y parte de sus bibliotecas, con lo que únicamente usarán la memoria y la capacidad de cómputo que estrictamente necesiten.

Otras ventajas destacables del uso de Docker serían:

Las instancias se arrancan en pocos segundos.

Es fácil de automatizar e implantar en entornos de integración continua.

Existen multitud de imágenes que pueden descargarse y modificarse libremente.

Como inconvenientes podemos destacar:

Sólo puede usarse de forma nativa en entornos Unix aunque se puede virtualizar gracias a boot2docker tanto en OSX como en Windows.

Las imágenes sólo pueden estar basadas en versiones de Linux modernas (kernel 3.8 mínimo).

Como es relativamente nuevo, puede haber errores de código entre versiones.