¿Qué es Docker y porqué es tan popular?

Publicado el viernes 13 de octubre de 2017 en Linux

Docker imagen

Para quien no lo conozca, Docker es un sistema de virtualización basado en contenedores o virtualización de sistema operativo que funciona bajo sistemas Linux y permite ejecutar los contenedores (máquinas virtuales) sin apenas penalización.

Un poco de historia

La primera versión de Docker fue lanzada en marzo de 2013 como proyecto interno de la empresa dotCloud. A partir de entonces Docker empezó a recibir colaboración de grandes empresas como RedHat, Microsoft o IBM debido al gran potencial que mostraba.

En sus inicios Docker se lanzaba sobre LXC (Linux Containers) hasta la versión 0.9 que se lanzó el soporte para libcontainer y ya lanzaba el propio Docker sus contenedores sobre el kernel de Linux.

La primera versión (1.0) disponible para producción llegaría en junio de 2014 en la cual Docker ya tenía soporte para ejecutar los contenedores, basarse en una imagen y construir las imágenes mediante un archivo Dockerfile.

En las siguientes versiones se fue puliendo el sistema agregando soporte para otros sistemas de archivos, soporte para variables de entorno, soporte para IPv6, etc...

A partir de la versión 1.9 se integró una nueva capa de red en Docker dando mayor capacidad de configuración entre contenedores como múltiples redes, redes privadas, soporte para plugins de red externos entre otras mejoras.

Hasta ahora Docker se ha centrado en mejorar y pulir el sistema de contenedores pero sobre un mismo host o servidor, a partir de la versión 1.12 incluye a Docker Swarm dentro de Docker como orquestador de varios hosts con Docker para montar servicios en alta disponibilidad, balanceo de carga y descubrimiento de servicios. A partir de ahora Docker se centra en llegar a un ámbito mas profesional.

En marzo de 2017 Docker se bifurca en 2 soluciones, Docker CE y Docker EE. Docker CE (Community Edition) es el motor Docker libre con todas las características mencionadas anteriormente, y con colaboración del a comunidad. Docker EE (Enterprise Edition) es Docker con añadidos empresariales y de pago, diseñado para tener mas robustez, y características que no se encontrarán en Docker CE como integración con LDAP, asistencia, escaneos de seguridad, etc.

Cómo funciona

Como ya hemos comentado anteriormente, Docker es un sistema de virtualización de sistema operativo, a diferencia de otros sistemas de virtualización como los de hypervisor, no necesita emular el hardware ya que se ejecuta sobre el kernel de Linux (v3.10 o superior) y sobre el kernel se ejecutan las aplicaciones directamente por lo que el aumento de rendimiento es considerable.

Docker containers vs hypervisor image

Docker utiliza la característica del kernel cgroups y namespaces para funcionar. Dichas características ofrecen aislamiento de los procesos y limitación de los recursos para cada contenedor a ejecutar.

Docker almacena toda la información en un sistema de capas de solo lectura y de lectura y escritura sobre la última capa. Esto provoca que varias imágenes puedan tener la misma capa reduciendo el espacio utilizado en disco de forma eficiente. Además, las imágenes Docker también se componen de un conjunto de capas y de unas versiones a otras puede que tan solo se descarguen unas capas porque el resto permanecen intactas por lo que también se consigue reducir el ancho de banda necesitado para funcionar.

¿Porque tiene tanto éxito Docker?

Docker se ha extendido muy rápido a pesar de lo joven que es (4 años) y es porque aglutina varias características que lo hacen único y productivo. Docker no es el primer sistema de virtualización de contenedores, antes de el ya existían LXC (Linux Containers), OpenVZ, Jails en FreeBSD, etc. Pero como es que si ya existían otros sistemas de contenedores, Docker se haya expandido tanto.

  • Repositorio de imágenes. Docker proporciona un repositorio central de imágenes alojado en Internet (https://hub.docker.com/) donde los usuarios y/o instituciones pueden subir sus imágenes listas para funcionar. Además proporciona el software necesario para que cualquier empresa pueda montarse un repositorio privado. Esto posibilita que todas las imágenes están accesibles de una forma rápida y sencilla.

  • Infraestructura como código. Para generar imágenes Docker se puede utilizar un archivo Dockerfile que no es mas que las instrucciones a ejecutar por Docker a la hora de construir la imagen. Con esto se consigue que podamos tener versionada toda la infraestructura de imágenes y sea fácilmente replicable.

  • Inmutabilidad. Una imagen Docker se ejecuta igual sobre cualquier sistema operativo o versión de Docker (A excepción de usar características no disponibles en versiones anteriores), por lo que un contenedor que nos funciona en local va a funcionar igual en el servidor/es empresarial/es de producción. Esta característica resuelve muchos problemas de dependencias, versiones, etc. en el desarrollo de software, ya que el contenedor tendrá únicamente las librerías y programas que necesite en la versión correcta.

  • Ligereza. Como ya hemos comentado, Docker utiliza un sistema de capas para almacenar la información, por lo que una actualización no tendrá que descargar una imagen grande y pesada. Además un contenedor Docker arranca en segundos, por lo que un despliegue a producción de Docker dura unos pocos segundos reduciendo el riesgo de sobrecarga o despliegues eternos.

  • Operatividad. Docker soporta el "Taggueado" de las imágenes, por lo que al igual que podemos tener versionado nuestro software, podemos versionar nuestras imágenes y etiquetarlas según la versión de nuestro código, por lo que distribuir una aplicación es tan sencillo como indicar la ruta de una imagen con su etiqueta.

A parte de estas características, Docker ha desarrollado otras herramientas como docker-compose que te permiten el despliegue en segundos de una infraestructura completa con cada elemento diferenciado y configurable o como Docker Swarm que maneja varios nodos con Docker y balancea servicios, escala y maneja los despliegues.

También he intentado resumir un poco y no entrar en detalles, ya que Docker es mucho mas de lo que he comentado, pero nos podemos hacer a una idea del potencial que tiene.

Fuentes

  • https://docs.docker.com/
  • https://es.wikipedia.org/wiki/Docker_(software)
  • https://en.wikipedia.org/wiki/Operating-system-level_virtualization#IMPLEMENTATIONS