¿Qué es Docker? ¿Para qué sirve?

El game-changer del mundo IT

Docker es una tecnología que, sin duda alguna, está revolucionando de forma brutal la manera de diseñar, desplegar, mantener y entender las infraestructuras de IT actuales.

En muy resumidas cuentas (más adelante entraremos en detalles), es un sistema que permite desplegar múltiples servicios o aplicaciones de forma aislada, segura y ligera mediante un tipo de «virtualización» muy especial basada en un término llamado «contenedores«. En este ámbito, un contenedor no es más que un servicio concreto, como puede ser un MySQL, Nginx, Tomcat, etc. Empaquetado junto con todas sus dependencias y archivos en una imagen virtual.

Cualquiera que lo lea puede pensar que esto es algo muy similar a la virtualización, y más aún a LXC. De hecho, Docker en sus inicios basaba sus cimientos en LXC. Son extremadamente parecidos, pero tienen algunos conceptos y capacidades diferentes.

  • Arquitectura
    1. Aunque ambas tecnologías comparten el kernel del host con los contenedores, lo hacen de forma diferente. LXC se basa en cgroups y namespaces, mientras que Docker utiliza un motor propio escrito en Go (aunque por detrás sigue utilizando tanto cgroups como namespaces).
    2. LXC puede ser tratado como un «mini S.O», y se pueden instalar varias aplicaciones y servicios en un solo contenedor. Docker, por diseño, solo permite una aplicación por cada contenedor desplegado.
    3. LXC comparte capa de red con el S.O host, mientras que Docker utiliza una red, servidor DNS y «router virtual» propios.
    4. En general, LXC proporciona virtualización completa de un S.O, mientras que Docker solo virtualiza la capa de aplicación.
  • Seguridad
    • Docker aísla por completo la capa de red, mientras que LXC comparte red con el host.
    • Docker añade una capa más de seguridad, como SELinux, AppArmor o GRSec.
    • En general, ambos son «inseguros» ya que, al compartir kernel, si comprometes el del contenedor, has comprometido el kernel del sistema que lo soporta.

Dicho esto, la principal diferencia destacable entre un contenedor LXC (como pueden ser los que se suelen utilizar en Proxmox) y otro de Docker es que, mientras que en LXC tengo un S.O completo (virtualmente), con casi todas sus capacidades y múltiples servicios, en Docker tengo una sola aplicación o servicio en un sistema muy limitado.

Pero, ¿Cómo que solo puedo desplegar una aplicación por contenedor? ¿Y si necesito una base de datos con una web?. Pues muy fácil, despliegas un contenedor para MySQL, y otro para Nginx con la web y gracias a la magia de la capa de red de Docker, ambos contenedores se comunican entre sí.

Hablemos de ventajas:

  • Ligereza: Docker es muy, MUY ligero y consume muy pocos recursos. Un contenedor Nginx consume unos 30MB (Si, megas) de RAM.
  • Portabilidad: Olvídate del «en mi máquina funciona». Si la imagen funciona en tu ordenador, funciona en CUALQUIERA que tenga Docker instalado. Hola, developers!
  • Seguridad: Si la aplicación que estás desarrollando «la lía parda» en el contenedor, al host no le pasa absolutamente nada. Borras, corriges y despliegas otro contenedor.
  • Y, la mejor: Es Open Source. Cualquiera puede contribuir, explorar su código y mejorarlo.

¿Inconvenientes? También.

En primer lugar, los datos de un contenedor Docker son efímeros por diseño. Es decir, los contenedores están diseñados y pensados para acabar muriendo, y por ende sus datos. De hecho nunca, NUNCA se deben guardar datos cambiantes en una imagen Docker, solo aquellos datos que sean inmutables.

Vale, ¿Y si necesito desplegar una web? ¿Para que quiero un contenedor con Nginx si no puedo meter la web dentro? Pues… para eso existen los volúmenes.

Por otro lado, la seguridad es también un inconveniente. Aunque aislemos las «liadas» de una aplicación mal configurada, como hemos dicho antes si el atacante accede al kernel del contenedor, accede al del host.

Además, Docker no se lleva bien desplegando aplicaciones de escritorio con GUI. Su rendimiento es bastante malo y hacer que funcione, por ejemplo, con X11 es complicado, aunque no imposible.

Visto esto, sin duda Docker es un «game changer» en la forma de entender y desplegar plataformas y aplicaciones. Está evolucionando y revolucionando con mucha rapidez con capas como Kubernetes y sin duda es un must-to para cualquier SysAdmin. A continuación os dejo algunos enlaces de interés para conocer en profundidad esta tecnología y comenzar a trabajar con ella. ¡Hasta otra!