Docker y otros container: más allá de la virtualización
La virtualización ha revolucionado la informática. La distribución de los recursos de una máquina física en varias máquinas virtuales (VM o virtual machine) ha entrado en el panorama de las tecnologías de la información en forma de virtualización de hardware. Este enfoque se basa en la emulación de componentes de hardware para poder utilizar varios servidores virtuales con su propio sistema operativo en un sistema de alojamiento común. Esto es lo que sucede a menudo en el ámbito del desarrollo de software, al tener que implementar entornos de prueba diferentes en un mismo ordenador. La virtualización también se encuentra en la base de productos de alojamiento web con servidor en la nube.
Una alternativa a la virtualización de hardware la constituye la virtualización del sistema operativo, por la cual diversas aplicaciones de un servidor se implementan en entornos virtuales aislados, los llamados contenedores, que funcionan en el mismo sistema operativo (virtualización basada en contenedores). Como las máquinas virtuales, cada una con su sistema operativo, los contenedores también brindan la posibilidad de usar en paralelo diversas aplicaciones, cada una con sus requisitos, en un mismo sistema físico. Como los contenedores no disponen de ningún sistema operativo propio, esta técnica de virtualización se diferencia por una instalación mucho más sencilla y un menor consumo (overhead).
Los contenedores para el servidor no son una invención reciente, pero a través de proyectos open source como Docker y rkt de CoreOS, la tecnología de contenedores está hoy en boca de todos.
¿Qué son los contenedores?
Mientras que la virtualización convencional se apoya en el llamado hipervisor (hypervisor), también llamado monitor de máquina virtual, que distribuye de forma proporcional el hardware del sistema de alojamiento entre los sistemas operativos invitados, la virtualización mediante contenedores, por el contrario, no inicia ningún sistema operativo adicional. En su lugar, el sistema operativo en común forma ejemplares aislados de sí mismo, es decir, contenedores virtuales que crean un entorno de tiempo completo para las aplicaciones.
Un contenedor de software, en su concepción más básica, puede considerarse como aplicación para el servidor. Para poder instalar una aplicación, el contenedor se carga en el ordenador en un formato portable o imagen (Image) que incluye todos los datos necesarios para su funcionamiento y, en el ordenador, se inicia en un entorno virtual. Prácticamente todos los sistemas operativos soportan la implementación de contenedores de aplicaciones: en Windows se utiliza el software Virtuozzo creado por Parallels, FreeBSD tiene el entorno de virtualización Jails y Linux soporta contenedores en la forma de OpenVZ y LXC (LinuX Containers). Para la gran mayoría de usuarios, sin embargo, no es sino a través de plataformas como Docker o rkt como la virtualización de sistemas operativos comienza a ser factible, ya que añaden a esta tecnología algunas funciones que facilitan el uso de estos contenedores.
Contenedor Docker, la tecnología de contenedores a mano
Es inevitable haberse encontrado alguna vez con Docker si se trabaja en el ámbito de la virtualización de sistemas operativos. Este proyecto open source se ha convertido en pocos años y, gracias a una extraordinaria operación de marketing, en sinónimo de tecnología de contenedores. Explicado brevemente, Docker es una herramienta para iniciar, detener y gestionar contenedores mediante comandos y se basa en técnicas propias de Linux como Cgroups y Namespaces para poder separar los recursos de cada contenedor. Si al comienzo se usaba la interfaz LXC del kernel de Linux, hoy se ejecuta con Libcontanier, una interfaz de programación desarrollada por Docker.
Una característica destacable de este contenedor es el Docker Hub, un repositorio donde los usuarios de Docker pueden compartir las imágenes (contenedores) que han creado con otros usuarios. Para los usuarios de Linux, instalar uno de estos contenedores es tan fácil como descargar una aplicación desde la App Store. La descarga desde el Docker Hub se realiza mediante comandos y se ejecuta en el propio sistema.
La competencia de Docker container es la solución rkt, que soporta tanto las imágenes de Docker como el formato propio App Container Images (ACI).
Ventajas de la tecnología de contenedores
Los contenedores de aplicaciones “empaquetan” los recursos necesarios para el funcionamiento de una aplicación para facilitar su uso a administradores y desarrolladores, simplificando tanto la instalación como la puesta en marcha de programas muy complejos. Sin embargo, las mayores ventajas de tales contenedores radican, sobre todo, en la gestión y en la automatización de software basado en contenedores.
- Instalación más sencilla: los contenedores de software se inician a partir de imágenes o representaciones portables de un contenedor, incluyendo un programa y todos los componentes requeridos (como librerías, soporte o archivos de configuración). De esta forma se compensan las diferencias entre sistemas operativos. Su instalación se reduce a la introducción de una línea de comando.
- Independiente de la plataforma: las imágenes se pueden transportar cómodamente de un sistema a otro y se caracterizan por una considerable independencia de la plataforma. Lo único que se necesita para iniciar un contenedor desde una imagen es un sistema operativo que soporte contenedores.
- Pérdidas por virtualización mínimas: con un Linux y Docker container, la instalación de contenedores requiere alrededor de 100 MB y unos pocos minutos, aunque no es solo esto a lo que se oponen los administradores de sistemas. Mientras que la virtualización de hardware trae consigo una pérdida de rendimiento para el hipervisor y otros sistemas operativos, los contenedores, al prescindir de todo esto, reducen esta pérdida al mínimo. Aún más, si el arranque (booting) de una máquina virtual puede durar varios minutos, las aplicaciones están disponibles enseguida.
- Aplicaciones aisladas: cada programa funciona independientemente de otros contenedores, de forma que aplicaciones con requerimientos opuestos pueden funcionar en paralelo en el mismo sistema.
- Administración y automatización unitarias: debido a que en una plataforma como Docker todos los contenedores son gestionados con las mismas herramientas, es posible automatizar todas las aplicaciones de manera centralizada. Por esto, estas soluciones están indicadas sobre todo para arquitecturas de servidor en las cuales los componentes están distribuidos en varios servidores, de forma que se carga con los pesos de instancias diferentes. En estos ámbitos de aplicación, el Docker container dispone de herramientas con las cuales configurar automatismos. Esto posibilita, por ejemplo, iniciar instancias nuevas de forma automática en momentos puntuales de sobrecarga. Google ofrece Kubernetes, un software a la imagen de Docker para la orquestación de grandes clústers de contenedores.
¿Son seguros los contenedores?
Dejar de usar sistemas operativos separados implica una mejora en el rendimiento de la virtualización con contenedores, pero significa también tener un nivel más bajo de seguridad. Si, en el caso de la virtualización convencional de hardware, las vulnerabilidades del sistema operativo generalmente afectan a una sola máquina virtual, en una virtualización del sistema operativo tienen efecto sobre todos los contenedores. Así pues, los contenedores no son tan herméticos como las máquinas virtuales con sistema operativo propio. Y, aunque en el primer caso un ataque al hipervisor puede ocasionar graves daños, al ser menos complejos, no logran tanto alcance como en el caso de un kernel de Linux. En consecuencia, aunque los contenedores constituyen una alternativa para la virtualización de hardware, de momento no la pueden sustituir por completo.