Siguiendo la lista oficial de anuncios de Red Hat Enterprise Linux acabo de enterarme que las aplicaciones que han sido instaladas en Red Hat Enterprise Linux 6.6 (Santiago) se pueden desplegar ahora en Red Hat Enterprise Linux 7, el último release oficial de la compañía, y esto puede ser gracias a Docker, el proyecto que ha causado revuelo en el mundo Open Source por su potencial.

Aquí les dejo el anuncio oficial de la lista de Red Hat:

Greetings Red Hat Partners,

On the heels of the release of Red Hat Enterprise Linux 6.6, Red Hat has also announced the immediate availability of the Red Hat Enterprise Linux 6 platform image for containerizing Red Hat Enterprise Linux 6 applications. The Red Hat Enterprise Linux 6 platform image provides the necessary runtime elements needed to run a Red Hat Enterprise Linux 6 application inside a Docker-formatted container on a Red Hat Enterprise Linux 7 host.

The Red Hat Enterprise Linux 6 platform image allows for:

  • Red Hat Enterprise Linux subscribers to create and deliver secure container images of existing Red Hat Enterprise Linux 6 applications
  • Deployment of those applications to Red Hat Enterprise Linux 7 without porting or changing source code.
    Red Hat ISV partners and customers to rely on Red Hat Enterprise Linux 7 as a leading enterprise-grade container host for existing or new applications developed on Red Hat Enterprise Linux 6
  • Customers to gain additional deployment flexibility for applications developed on Red Hat Enterprise Linux
  • Customers to more quickly take advantage of Red Hat Enterprise Linux 7 and containerization without compromising on the reliability and security they have gained by standardizing on Red Hat Enterprise Linux 6

RED HAT ENTERPRISE LINUX PLATFORM IMAGE AVAILABILITY

Red Hat Enterprise Linux 6 platform image is now available in the Red Hat Customer Portal to all customers with active Standard and Premium Red Hat Enterprise Linux subscriptions. To access and download Red Hat Enterprise Linux 6 platform image, please visit: https://access.redhat.com/search/browse/docker-images#?

Learn more at http://rhelblog.redhat.com/2014/10/14/run-red-hat-enterprise-linux-6-applications-on-red-hat-enterprise-linux-7/.

Sincerely,

The Red Hat Enterprise Linux Team

Docker

Bueno, y qué es Docker?

Docker es una plataforma abierta de computación en la nube para el hosting de aplicaciones de forma distribuida. Dicha plataforma está basada en una tecnología conocida como “Linux Containers”, la cual es conocida como “Virtualización Ligera”.

Para que se entienda mejor vamos a explicar las diferencias que existen entre una Máquina Virtual y un Contenedor. En una Máquina Virtual tienes las librerías y dependencias para ejecutar tu aplicación, los servicios que deben estar presentes, y además el código de tu aplicación que a lo mejor es sólo unas decenas de MB; y todo ello lo tienes ejecutándose en un sistema operativo tipo Guest, lo cual se puede traducir en varios GB de almacenamiento. Además en tu sistema operativo original, necesitas tener el Hypervisor, que es el proceso que al final se encarga de la gestión de los recursos de las Máquinas Virtuales (principalmente memoria RAM, conectividad y almacenamiento). Ya los Hypervisor ustedes los conocen de sobra: Vmware, Xen, Virtualbox y algunos otros.
Máquina Virtual

Ahora, un Contenedor en Docker es algo distinto: sólo contiene el código de la aplicación y sus dependencias para su ejecución y es manejado por lo que se llama Docker Engine. El Contenedor es ejecutado como un proceso aislado en espacio de usuario en el sistema operativo, compartiendo el kernel con otros Contenedores. Por tanto, cada Contenedor puede gozar del aislamiento de recursos igual que las Máquinas Virtuales, pero a un nivel más eficiente y portable, por el hecho de que un Contenedor puede bootear casi 1000 veces más rápido que una Máquina Virtual, y al usar mucho menos espacio y menos RAM; los administradores de sistemas pueden usar un mejor uso de los recursos de cómputo.
Container
Entonces, en esencia, Docker provee un modo de ejecutar casi cualquier aplicación seguramente aislada en un contenedor. El aislamiento y la seguridad te permite entonces ejecutar múltiples contenedores en tu host. La naturaleza ligera de los contenedores, los cuales se ejecutan sin la penalización extra de un Hypervisor, significa entonces una mejor utilización del hardware disponible.

Haciendo un cálculo rápido: imáginense que en un sistema que tiene 128 GB de RAM, tienes tu sistema con 30 Máquinas Virtuales donde tienes toda tu infraestructura, y descubriste que con Docker puedes tener alrededor de casi 4 contenedores donde dispones de los recursos para una Máquina Virtual, con los cuales puedes atender más peticiones de balanceo de carga, puedes tener más bases de datos replicadas, y puedes almacenar más archivos u objetos.

Por estas simples pero poderosas razones es que Docker ha causado tanto revuelo en el mundo del Cloud Computing; y el equipo de la compañía detrás del proyecto ha sido lo suficientemente inteligente en crear servicios a partir de Docker y ha creado alianzas estratégicas con grandes organizaciones como Red Hat, Canonical, OpenStack, Rackspace; porque saben el potencial que tiene el proyecto.

Una de las últimas alianzas anunciadas es la creada entre Docker y Microsoft para llevar Docker Engine a Windows Server. Aquí les dejo algunas de las palabras de Ben Golup, Chief Executive Officer de Docker acerca de esta alianza:

At the heart of the Microsoft and Docker partnership is a shared view that there is great leverage when you provide developers a common approach to build their applications. Microsoft viewed Docker for what it is at its core; an open-platform for distributed applications that can provide a uniform user interface to a modular set of tools for containerizing and then orchestrating these applications.

Unifying Windows Server and Linux through the Docker platform aligns with Microsoft CEO Satya Nadella’s strategy to be the “productivity and platform company for the mobile-first and cloud-first world.” There is no greater productivity gain that I can think of than integrating two great development ecosystems and providing the means to collaborate by leveraging the best application “content” from each.

Componentes de Docker

Los principales componentes de Docker son 2 básicamente:

  • Docker: que es la platalforma libre de virtualización de contenedores, el cual fue liberado bajo la licencia de Apache 2.0
  • Docker Hub: es la plataforma SaaS de la compañía para la gestión y compartimiento de contenedores

Conceptos de Docker

Para entender un poco más de Docker, deben saber que son las Docker images, Docker registries y los Docker containers. Una imagen de Docker no es más que una plantilla de sólo lectura, la cual puede contener por ejemplo Ubuntu Linux con Apache y tu aplicación web instalada. Las imágenes son usadas para crear contenedores de Docker. Ahora los registros de Docker, son los que tienen las imágenes, y no son más que una forma de almacenamiento, ya sea pública o privada de dichas imágenes, a donde tu puedes subir o descargar estas imágenes. Constituyen la forma de distribución de imágenes usando Docker Hub. Entonces los contenedores de Docker son algo parecido a directorios, que mantienen todo lo necesario para ejecutar tu aplicación. Cada contenedor puede ser iniciado, parado, movido y borrado. Todo y mucho más puede ser consultado en la documentación oficial de Docker. Les recomiendo la sección Understanding Docker que explica todo estos conceptos brillantemente.

Arquitectura de Docker

Docker usa una arquitectura cliente-servidor. El cliente de Docker le hace peticiones al demonio de Docker, el cual hace todo el trabajo de la construcción, ejecución y distribución de tus contendedores de Docker. Ambos procesos pueden correr en el mismo sistema, o también un cliente de Docker puede interactuar a un demonio remoto de Docker. La comunicación entre ambos procesos puede ser a través de sockets o a través de una API tipo RESTful.
Arquitectura de Docker

Docker está escrito en Go y usa varias características del kernel de Linux para su funcionamiento.

Namespaces

Cuando uno ejecuta un contenedor, Docker crea una serie de namespaces para ese contenedor. Esto provee una capa de aislamiento: cada aspecto del contenedor se ejecuta en su propio namespace y no tiene acceso fuera de su contexto. Algunos de los namespaces que Docker usa son:

  • el namespace pid: Usado para el aislamiento de procesos (PID: id de proceso)
  • el namespace net: Usado para la gestión de interfaces de red (NET: networking)
  • el namespace ipc: Usado para la gestión de acceso a recursos IPC (IPC: Inter Process Communication)
  • el namespace mnt: Usado para puntos de montaje
  • el namespace uts: Usado para el aislamiento del kernel e identificadores de versiones (UTS: Unix Timesharing System)

Control groups

Docker también hace uso de otra tecnología llamada cgroups o grupos de control. La clave para la ejecución de una aplicación en total aislamiento es poder hace que usen sólo los recursos que tu dispongas. Esta tecnología se asegura de que los contenedores son ciudadanos aislados en tu sistema operativo. Los gropos de control permiten a Docker compatir los recursos de hardware disponibles entre los contenedores, y si lo requieren, establecer límites y restricciones. Por ejemplo, usted podría limitar el uso de memoria RAM para un determinado contenedor.

Union file systems

Union file systems o UnionFS, son sistemas de archivos que operan creando capas, haciéndolas ligeras y ràpidas. Docker usa UnionFS para proveer el fundamento para la construcción de contenedores. Docker puede hacer uso de varias variantes de este tipo de sistemas de archivos: AUFS, btrfs, vfs y DeviceMapper.

Esto en concreto hace que cada imagen que se crea con Docker, es al final una serie de capas combinadas, y esto precisamente hace que Docker sea tan ligero: Cuando tú cambias la imagen, por ejemplo para actualizar tu aplicación a una nueva versión, una nueva capa es construída. Y entonces, en vez de reemplazar la imagen completa o volverla a construir (como se hace con una Máquina Vitual), sólo la capa que tiene que ver con la aplicación es actualizada o agregada. Por tanto, a la hora de la distribución de la imagen, tú no necesitas hacerlo de forma completa, tú sólo distribuyes la actualización por todos tus contenedores de tu aplicación, haciendo la distribución más simple y más rápida. Y todo esto es gracias a UnionFS.

Container format

Docker combina todos estos componentes en un wrapper que llaman formato de contenedor. El formato por defecto de contenedores es libcontainer. Docker también soporta el formato tradicional de contenedores de Linux usando LXC. En el futuro, Docker podría soportar otros formatos de contenedores como las llamadas jails o jaulas en sistemas BSD, o las llamadas zonas en Solaris.

Algunas empresas que usan Docker

Hay muchas ya que han apostado por Docker para sus ambientes de desarrollo y han llevado su infraestructura a otro nivel. Precisamente ahora acabó el DockerCon2014 en San Francisco donde hubo varias empresas que expusieron sus casos de estudio, y ahora viene el DockerCon Europe en Amsterdam, donde estarán personas de Spotify, Shopify, ModCloth, Rackspace, Hortonworks y más. Aquí pueden encontrar algunos de los presentadores que estarán
DockCon Europe

Conclusiones

Bueno, concluyendo ya, sólo he dado una pequeña pincelada de las bondades y beneficios que puede brindar Docker y su ecosistema. En próximos posts, hablaré más de cómo se instala y cómo se usa para que a lo mejor, quien sabe, podamos adentrarnos también en el mundo de Docker y podamos contribuir también al proyecto.