Es muy posible que hayas oído hablar de Docker, un proyecto que implementa los famosos containers de los que todo el mundo habla ahora mismo.

Hace poco, tuve la oportunidad de charlar un rato con mi amigo @godofdez y le estuve explicando un poco en que consistía Docker y Kubernetes y para qué los estaba utilizando.

Parece ser que le debió interesar el tema, porque el otro día me escribió el siguiente correo:

El día que estuvimos hablando me comentaste que las tecnologías de "virtualización" (no encuentro la palabra apropiada) que actualmente estaban pujando eran Docker y Kubernetes.

Todo esto lo recordé ayer cuando leía este artículo: http://www.linuxjournal.com/content/vagrant-simplified en el que hablan de Vagrant como un "gestor de virtualización rápida", y me gustaría saber cómo lo encajas con lo anterior.

Te agradezco una reflexión "mini" sobre todo esto y, así quizá, reactivar tu blog a posteriori con un simple copy/paste y alguna captura gráfica :-D

En fin, que me acordé de ti y te lo comparto.

Salud!!!

Docker y los contenedores

En mi opinión, virtualización es una palabra adecuada. Los contenedores son un tipo de virtualización, y Docker es un producto/software/solución que ha construido un ecosistema en torno a ellos.

Normalmente, cuando hablamos de virtualización, pensamos automáticamente en VirtualBox o VMWare, productos que nos permiten crear máquinas virtuales.

Luego, una máquina física a la que llamamos el host, se encarga de ejecutar esas máquinas virtuales utilizando un software llamado hypervisor.

Containers vs VMs

Los contenedores son también una tecnología de virtualización, pero no necesitan hypervisor ni máquinas virtuales para ser ejecutados. Los contenedores se ejecutan directamente sobre el kernel del sistema operativo del host.

OS-Level Virtualization

Los contenedores son parte de un tipo de virtualización llamada OS-level virtualization. El kernel es el encargado, en este caso, de ejecutar los distintos contenedores y de aislarlos los unos de los otros, por lo que no es necesario un hypervisor ni un sistema operativo huésped.

¿Conocéis el comando chroot? Este comando permite que un proceso y sus hijos solo tengan acceso a una parte del sistema de archivos.

$ chroot [OPTION] NEWROOT [COMMAND [ARG]...]

Cuando ejecutas un proceso con chroot, estás cambiando el árbol de directorios de ese proceso. El directorio raiz (/) para ese proceso será el directorio que elijas de tu árbol de directorios real (por ejemplo /mnt/container1), de modo que todos los archivos/directorios que se encuentran fuera de/mnt/container1 son inaccesibles para esos procesos.

Podríamos decir que virtualiza un árbol de directorios a nivel de sistema operativo. Crea un árbol virtual que se enlaza con el árbol del sistema de archivos real, de manera que el proceso solo puede acceder a los directorios presentes en el árbol virtual, pero cuando lo modifica, esta modificando una sección del árbol de directorios real del host.

Ese concepto de virtualización es el que más tarde llegó al resto de recursos del host: la red, los procesos, los usuarios, los puntos de montaje, etc. Desde la versión 2.6.24, el kernel de Linux es capaz de virtualizar todos esos recursos gracias a una característica llamada namespaces.

Un contenedor no es más que un proceso que utiliza estas características del kernel para tener una red, unos usuarios, un sistema de archivos, etc virtuales que se mapean/enlazan con los recursos reales del host.

Docker logo

Y entonces, Docker ... ?

Describiéndolo de una manera simple, es una solución que utiliza todas estas funcionalidades del kernel (y algunas más). Básicamente, crea una imagen a partir de un archivo de texto llamado Dockerfile, y permite crear contenedores a partir de esas imágenes.

Una imagen no es más que un sistema de archivos y un entorno de ejecución. Por ejemplo, en el siguiente Dockerfile, podéis ver como se crea una imagen con apache y tres variables de entorno. Ese entorno y ese archivo será lo que estará presente en el contenedor cuando se ejecute esta imagen.

# Ejemplo de Dockerfile
# https://github.com/kstaken/dockerfile-examples
# A basic apache server. To use either add or bind mount content under /var/www
FROM ubuntu:12.04

MAINTAINER Kimbro Staken version: 0.1

RUN apt-get update && apt-get install -y apache2 && apt-get clean && rm -rf /var/lib/apt/lists/*

ENV APACHE_RUN_USER www-data
ENV APACHE_RUN_GROUP www-data
ENV APACHE_LOG_DIR /var/log/apache2

EXPOSE 80

CMD ["/usr/sbin/apache2", "-D", "FOREGROUND"]

Docker ha conseguido crear un ecosistema muy potente que se sostiene sobre esos cimientos, y que tiene como objetivo la portabilidad de las aplicaciones.

Puedes compartir las imágenes subiéndolas a Docker Hub, de manera que puedes compartirlas y descargarlas como si estuvieras usando apt-get/dnf/yum.

También es capaz de comunicar unos contenedores con otros, habilitar puntos de montaje entre un contenedor y la maquina host, comunicar puertos del contenedor con la maquina host, etc.

Kubernetes logo

Vale, y Kubernetes qué ?

Kubernetes quiere solucionar uno de los problemas de los contenedores: no se consideran production-ready. Hay poca gente utilizándolos en entornos en producción, y les faltan características en torno a esos casos de uso.

En general, lo que la comunidad busca son características como orquestación (despliegue de contenedores en clusters, replicación, load-balancing, fault-tolerance, etc) y monitorización.

Kubernetes es la apuesta de Google en ese sentido. Permite replicar contenedores, colocar load-balancers delante de ellos, realizar checkeos de salud y reiniciar contenedores automáticamente en caso de que algo vaya mal.

Solo nos queda Vagrant

Vagrant es una solución de la empresa Hashicorp. Esta empresa se dedica a crear soluciones para orquestación, despliegue y control de aplicaciones distribuidas, microservicios, contenedores y cosas por el estilo.

Pertenece a una categoría distinta que Docker y Kubernetes. Estos últimos están en el mundo de los contenedores, y Vagrant en el mundo de las máquinas virtuales.

Vagrant logo

Vagrant te permite construir y ejecutar una máquina virtual (con VirtualBox, por ejemplo). Para ello, utiliza un archivo llamado Vagrantfile, donde se especifica qué características tiene que tener la maquina virtual. Es un concepto parecido al Dockerfile, pero para máquinas virtuales.

# Ejemplo de Vagrantfile
# vi: set ft=ruby :

Vagrant.configure("2") do |config|
    version = "php5-5.6"
    hostname = "php.box"
    locale = "en_GB.UTF.8"

    # Box
    config.vm.box = "ubuntu/trusty64"

    # Shared folders
    config.vm.synced_folder ".", "/srv"

    # Setup
    config.vm.provision :shell, :inline => "touch .hushlogin"
    config.vm.provision :shell, :inline => "hostnamectl set-hostname #{hostname} && locale-gen #{locale}"
    config.vm.provision :shell, :inline => "apt-get update --fix-missing"
    config.vm.provision :shell, :inline => "apt-get install -q -y g++ make git curl vim"

    # Lang
    config.vm.provision :shell, :inline => "add-apt-repository ppa:ondrej/#{version} && apt-get update"
    config.vm.provision :shell, :inline => "apt-get install -q -y php5-dev php5-cli php5-curl php5-xdebug"
    config.vm.provision :shell, :inline => "curl -s https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer"
end

Está muy orientado a un uso para desarrolladores, aunque hay gente usándolo en producción para desplegar VMs cuando la demanda es alta, por ejemplo.

La idea es que si un equipo está trabajando en, por ejemplo, un proyecto con Drupal, todos los desarrolladores compartan un Vagrantfile, con lo que con solo ejecutar un comando (vagrant up) todos tienen la misma máquina virtual con las mismas dependencias funcionando en local lista para trabajar.

Y ... ?

Ahora mismo vivimos en un momento muy excitante para la gente que, como yo, disfruta conociendo y probando nuevas tecnologías.

Cada día es posible encontrar una solución nueva, un artículo interesante, o una nueva manera de usar cosas que ya existían.

Si te interesa este tema (el cloud computing, los sistemas distribuidos, etc) te recomiendo echarle un ojo al resto de sus herramientas de Hashicorp, en concreto Nomad, Vault, Terraform y Otto (que lo acaban de anunciar).

Y, hazme un favor, si tienes alguna duda y crees que puedo ayudarte a resolverla, ¡házmelo saber! Es mi forma favorita de alimentar mi blog :)