Máquinas virtuales y Docker: una casa pesada y una tienda ligera

«Instala una máquina virtual con Linux y recrea exactamente el mismo entorno.»

Tres meses después de entrar en la empresa, el ambiente en la oficina no era precisamente tranquilo. El único compañero senior iba a ser reasignado a otro proyecto y estaba tan ocupado haciendo sus propias maletas que ni siquiera podía pensar en una buena transferencia de conocimiento, mientras que el jefe de equipo llevaba ya mucho tiempo alejado del desarrollo práctico y estaba bastante desconectado de las tendencias actuales.

Un día, el jefe me llamó. «Cuando tu mentor se vaya, la única persona que podrá encargarse del servidor serás tú. Incluso si el servidor se cae, tienes que ser capaz de recuperarlo por tu cuenta. Instala Linux como máquina virtual, VM, en tu portátil de desarrollo actual, Windows, e intenta construir exactamente el mismo entorno que el servidor de producción.»

A partir de ese día empezó mi viacrucis. Instalé VMware, descargué el archivo ISO de Ubuntu y solo ponerlo en marcha me llevó medio día. Reb uscando en la wiki de la empresa instalé Java, Node.js y PostgreSQL. Pensé: «Lo más nuevo será mejor», así que instalé Java 17, pero resultó que el código legado dependía de Java 8 y ni siquiera compilaba. Tuve que borrarlo y volver a instalarlo todo. Cada vez que cambiaba una sola línea de código, tenía que ejecutar mvn build, mover el archivo jar a la VM y ejecutarlo allí. Era dolor en estado puro.

Entonces me surgió de pronto una duda. «Un momento. La vez pasada, cuando desplegamos en producción, ¿no bastó con escribir una sola vez docker service update

Mi máquina virtual local era así de pesada y tenía una montaña de configuraciones, así que ¿qué demonios era ese ‘Docker’ del servidor de producción que permitía actualizarlo todo con un solo comando?

Docker es la forma más ligera de transportar un entorno completo.

La solución pesada: la máquina virtual

El método que me mandó usar el jefe, es decir, instalar Linux encima de Windows, es precisamente lo que se llama una máquina virtual, VM. Es como construir una ‘casa virtual’, un guest OS, completa encima de una computadora física, el host.

Al final, una VM sí garantiza bien el aislamiento del entorno, pero es demasiado pesada y demasiado lenta como para estar pasándola de un lado a otro cada vez en desarrollo o despliegue.

La revolución ligera: Docker

Por eso apareció Docker, es decir, la tecnología de contenedores. Docker no construye una casa entera como hace una VM. En su lugar, monta una tienda de campaña.

El comando update que yo ejecuté en el servidor de producción no estaba reinstalando un sistema operativo pesado. Simplemente estaba «desmontando la tienda anterior y levantando una nueva con la nueva versión del código». Así que era inevitable que terminara en un instante.

[Code Verification] ¿Docker de verdad es tan ligero?

No nos quedemos solo en que Docker es ligero; comprobémoslo de verdad. Si el objetivo es ejecutar un entorno Linux, Ubuntu, la diferencia entre una VM y Docker es brutal.

# Ejecutar Ubuntu con el comando Docker (descarga la imagen si falta)
$ docker run -it ubuntu:latest /bin/bash

Resultado:

En cuanto pulsé Enter, ya estaba dentro de un entorno Ubuntu. Eso es posible porque un contenedor Docker no es un sistema operativo real. Es solo «un espacio aislado que toma prestado el kernel del host OS, es decir, mi computadora, mientras finge ser un OS independiente».

Consejo práctico: la verdadera razón para usar Docker

Desde que adoptamos Docker en el trabajo, mi vida cambió por completo.

Para cerrar: ya no entregamos un ejecutable, sino un entorno

La aparición de Docker cambió el paradigma del desarrollo. Ya no enviamos solo el código fuente, .java, al servidor. Congelamos la configuración del sistema operativo, las librerías y las variables de entorno que necesita ese código en una ‘imagen’ y enviamos el paquete completo.

Entonces, ¿cómo se crea realmente esta mágica ‘imagen Docker’? ¿Es solo un archivo comprimido? Sorprendentemente, dicen que una imagen Docker está apilada en varias capas, como si fuera un pastel.

La próxima vez, profundicemos en el secreto de la eficiencia de Docker: las imágenes y su estructura en capas.

Deja un comentario