Curso Jakarta EE 9 (8). Docker (1): Introducción.

logo Jakarta EE

Con Arquillian podemos probar a fondo nuestras aplicaciones de forma realista desplegando lo que necesitemos en el servidor para realizar test de integración, end-to-end, aceptación, etc. Las pruebas van a complicarse a medida que avancemos en el curso porque necesitaremos un entorno más complejo en el que, además de WildFly, tendremos un servidor de bases de datos MySQL. Y resulta de vital importancia que sea lo más parecido posible al entorno de explotación final de la aplicación.

Nota. De nuevo nos encontramos ante un capítulo teórico que se aparta un poco del contenido natural del curso. Si el lector todavía no ha tenido el placer de trabajar con Docker, o ya lo conoce pero no tiene claro en qué consiste, creo que merece la pena que dedique unos minutos a su lectura.

>>>> ÍNDICE <<<<

El problema de los entornos

Las configuraciones de entornos de ejecución siempre han supuesto una gran fuente de problemas y un sumidero de tiempo. Todos los desarrolladores deberían tener en su equipo las mismas versiones de las herramientas y servidores, dedicando tiempo a su instalación y configuración, además de estar al tanto de las posibles actualizaciones a realizar. Y quizás necesiten duplicar servicios para hacer pruebas y pequeños experimentos.

El segundo problema llega cuando toca ejecutar la aplicación fuera de los equipos de los desarrolladores, por ejemplo en un servidor para la realización de pruebas. A ello hay que sumar una agravante: en muchos proyectos es habitual que los programadores trabajen con Windows o macOS, pero la aplicación que realizan se va a desplegar finalmente en servidores Linux. El drama está servido, y surgen errores debido a las diferencias entre las plataformas de desarrollo, pruebas y producción.

Sería fabuloso poder crear infraestructuras de servicios configurables, fáciles de desplegar y portables entre máquinas, e incluso independiente del sistema operativo…

Máquinas virtuales

Una estrategia para la creación de estas infraestructuras consiste en utilizar una o varias máquinas virtuales y empaquetar en ellas los servicios y aplicaciones que nos haga falta. De forma muy simplificada, consideremos a estas máquinas como un conjunto de ficheros que contienen un sistema operativo completo -y sus aplicaciones- que se ejecuta sobre un hardware «virtual», tan real para el sistema operativo como si fueran dispositivos físicos. Un software de tipo hipervisor (por ejemplo Oracle VirtualBox o VMware Workstation) se encarga de todo y permite ejecutar la máquina en un equipo físico llamado «anfitrión» (host). Para conseguirlo, aprovecha las capacidades de virtualización presentes en la mayoría de CPU modernas.

A continuación señalo algunos beneficios de la utilización de estas máquinas virtuales.

  • En un mismo equipo físico podemos ejecutar varias a la vez, aunque estaremos limitados por las capacidades del anfitrión.
  • Es posible utilizar un sistema operativo distinto al empleado por su anfitrión. Por ejemplo, en una computadora con Windows 10 podemos trabajar con un Linux contenido en una máquina virtual.
  • Son portables. Pueden copiarse, distribuirse y ejecutarse en cualquier lugar siempre y cuando tengamos el software necesario.
  • La máquina se ejecuta como un proceso aislado. Lo que hagamos en ella no compromete la seguridad y el correcto funcionamiento del anfitrión.

La siguiente captura muestra Linux Debian en Windows 10 con VirtualBox. La máquina virtual se ha creado con un disco duro virtual descargado de OSBoxes.

Sin duda alguna, es una tecnología es extraordinaria con numerosas aplicaciones. No obstante, en nuestro caso particular, el uso de máquinas virtuales es desproporcionado. Tenemos que configurar y ejecutar un sistema operativo completo, con todo el consumo de recursos (memoria, CPU, espacio en disco…) que ello implica, simplemente para disponer de WildFly y MySQL. La máquina virtual puede tener un tamaño ingente, lo que supone un escollo importante para su distribución y versionado. También hay que considerar la gran inversión de tiempo que implica su creación, configuración y mantenimiento.

Presentando Docker

Docker es una plataforma de código abierto que elimina los problemas asociados al uso de máquinas virtuales que acabo de comentar. Sus contenedores funcionan como si se tratasen de máquinas virtuales que se ejecutan de forma aislada, pero lo hacen sobre el núcleo o «kernel» del sistema operativo del equipo anfitrión haciendo uso de sus servicios. Por este motivo, no incluyen un sistema operativo, tan solo las aplicaciones que necesitemos. Tampoco requieren de un hardware virtualizado. Sin embargo, dentro del contenedor lo que vemos es su propio sistema operativo con su correspondiente sistema de archivos como si estuviéramos trabajando con una máquina virtual.

La siguiente imagen trata de subrayar la sencillez conceptual y la eficiencia de un contenedor frente a una máquina virtual.

Gracias a estas características, los contenedores tienen muy poco tamaño, solo consumen los recursos mínimos que necesite el software que ejecutan, y su arranque y detención es muy rápido. Y todo esto conservando la portabilidad y aislamiento de una máquina virtual. Estas ventajas vienen acompañadas de herramientas que permiten la definición de las imágenes a partir de las cuales se crean los contenedores mediante ficheros de tipo «script», el despliegue coordinado de varios contenedores como un conjunto integrado (Docker Compose), o la utilización de repositorios de imágenes para su fácil distribución.

Ahora bien, lo anterior no significa que Docker sea un reemplazo de un las máquinas virtuales «clásicas»: es otra tecnología de virtualización que resulta (bastante) más práctica en ciertos escenarios. Es más, si contratamos un proveedor de servicios en la nube, lo habitual (y económico) es que nos proporcione una máquina virtual con Linux.

Con Docker tenemos -¡y gratis!- lo que buscábamos para crear entornos de ejecución de aplicaciones complejas: facilidad de configuración, modularidad, portabilidad y rendimiento. Entornos idénticos con las mismas versiones de servidores, librerías, etc., que podemos utilizar para desarrollar, realizar pruebas y hacer despliegues donde queramos.

Docker hace honor a su lema «crea, distribuye y ejecuta cualquier aplicación en cualquier lugar»

Conviene hacer una puntualización respecto a la ilustración anterior: los contenedores sólo pueden ejecutarse si su imagen fue creada para el sistema operativo subyacente, pues hacen un uso directo de su núcleo y servicios. Esto es, el contenedor generado a partir de una imagen basada en Linux solo se puede usar en un anfitrión que funcione con Linux. Por fortuna, Docker es capaz de ejecutar, de forma transparente y con buen rendimiento, contenedores Linux tanto en Windows como en macOS mediante tecnologías de virtualización. En el caso del primero, con Hyper-V, o bien con el novedoso subsistema de Linux para Windows (WSL 2), la única opción si usamos Windows Home.

En su momento (2013), la irrupción de Docker supuso una revolución. Hoy en día, el uso de contenedores -mercado dominado por Docker- es una práctica estándar, siendo una tecnología imprescindible en la caja de herramientas de cualquier desarrollador moderno. En los próximos capítulos aprenderemos a utilizarlo y quedarán más claros los conceptos que hemos visto.

Instalación

Windows 10

Tenemos dos alternativas:

  • Docker Desktop (la solución «oficial»). Hay una licencia personal gratuita, pero en estos momentos no es aplicable a grandes empresas.
  • Usar Docker en un Linux ejecutándose en WSL 2.

La primera opción es la más sencilla y práctica. Tan solo hay que seguir un asistente que no presenta la más mínima complicación. Eso sí, debe estar activada la posibilidad de utilizar virtualización en nuestro equipo, configuración que se realiza en la BIOS. Si no lo está, podemos instalar Docker, pero será incapaz de arrancar.

Docker crea un servicio que se iniciará automáticamente cada vez que arranque Windows. En la barra de tareas, un pequeño icono permite abrir una herramienta gráfica de gestión y configuración. Tiene una animación que indica si Docker está arrancando o deteniéndose.

Es más que recomendable utilizar Docker sobre WSL 2, tanto por prestaciones como para evitar problemas de compatibilidad con otras tecnologías de virtualización (Virtual Box o VMware) que pueden producirse si tenemos activado Hyper-V. Esto lo hacemos habilitando la siguiente opción en el panel de control de Docker Desktop.

Naturalmente, WSL 2 debe estar instalado y configurado. En este enlace se encuentran las instrucciones oficiales en español.

Linux

En Linux, Docker suele incluirse en los repositorios de las distintas distribuciones, así que podemos instalarlo desde el gestor de paquetes del sistema (yum, apt-get, etc.). Si queremos disfrutar de las últimas versiones, encontraremos repositorios oficiales para las distribuciones más populares en esta dirección. Las instrucciones figuran en la documentación oficial (en inglés); en el caso concreto de Ubuntu, recomiendo este magnífico tutorial en español

>>>> ÍNDICE <<<<

Deja una respuesta

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Salir /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Salir /  Cambiar )

Conectando a %s

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.