En el mundo de la tecnología hay verbos y definiciones para todo, como deployar, pushear, commitear, debuggear, e infinidad. Uno de ellos “dockerizar” se ha vuelto de mis favoritos durante un largo tiempo.

Primero debemos entender que es Docker:

"Docker es un software multiplataforma open source, que automatiza el despliegue de aplicaciones dentro de contenedores, proporciona una capa de abstracción y automatización de virtualización de aplicaciones"

Entiendo que con esta definición no se logra entender al cien lo que significa Docker. Para eso hay que entender el concepto de máquina virtual y de un contenedor.

Máquina virtual (MV)

Anteriormente era complicado que una aplicación co-existiera con alguna(s) otra(s) con fines distintos dentro de un mismo servidor. Por mencionar un ejemplo, alguna aplicación de PHP como un sitio web levantado con el stack LAMP (Linux, Apache, MySQL, PHP), requería su propio entorno para funcionar única y exclusivamente, si se intentaba en ese mismo servidor utilizar un entorno de una aplicación de Django (Stack posiblemente conformado por Python, Django, Gunicorn, Apache, PostgreSQL), requería un esfuerzo grande por parte del personal técnico de infraestructura para que ambas funcionaran dentro de un solo entorno. Eso sin mencionar que podría haber choque de puertos e incompatibilidad de ciertas cosas como librerías. Problemas en entornos productivos ocasionaron el difícil mantenimiento de estos servidores de múltiples aplicaciones.

Para este problema nacieron las máquinas virtuales, las cuales son básicamente un sistema operativo dentro del sistema operativo, algo redundante si se ve desde un punto. Veámoslo como una caja que dentro tiene otras cajas más pequeñas e independientes.

Las máquinas virtuales son un sistema operativo completamente independiente, con sus librerías de sistema, binarios y aplicaciones que necesita para funcionar. Con esto se dió un gran paso para el despliegue de aplicaciones independientes, pudiendo esta vez compartir un mismo servidor y recursos.

Gráficamente es algo asi:

la terminal

En este diagrama observamos la arquitectura de las aplicaciones corriendo sobre un sistema operativo 1 (SO1) y un sistema operativo 2 (SO2), ambos independientes con sus librerías y todo lo que necesitan para funcionar, en la parte baja observamos algo que es conocido como “hypervisor”, que básicamente es un puente que permite la conexión de un sistema operativo base con una o más máquinas virtuales, compartiendo sus recursos de hardware.

El contenedor

Un contenedor que su nombre se basa en los contenedores de carga marítima, tiene un objetivo similar a la de una máquina virtual, el tener aplicaciones independientes mediante una capa de abstracción. A diferencia de una MV, un contenedor comparte además de hardware, el kernel del sistema operativo base, es decir ya no es un sistema operativo completo e independiente. Si lo queremos simplificar, comparte hardware y el núcleo del sistema operativo, así que un contenedor ya no dispone de archivos de sistema únicos.

Gráficamente es similar al anterior:

la terminal

Este sería la arquitectura de las aplicaciones del ejemplo, si se observa claramente, ya no disponen de un Sistema Operativo propio, si no que algo llamado “Docker engine” que se encarga de la distribución de recursos de hardware y software.

Esto trae sus ventajas, al ya no tener un sistema operativo completo un contenedor es ligero en disco, una MV podría pesar gran tamaño dependiendo que sistema operativo almacena. Por decir un Windows de 15 GB, generaría una MV de un tamaño considerable. Si lo traducimos a escenarios corporativos, el tiempo es dinero y para despliegues los contenedores se volvieron populares por su “ligereza”, dado que entre menos tamaño las entregas continuas de software son más rápidas.

También tiene sus desventajas, recién hace años era común enterarse de hackers que encontraron backdoors por ineficiencias de permisos y de seguridad en los contenedores, al tener un enfoque de compartir el kernel del sistema operativo base, alguien malintencionado puede romper el servidor principal y exponer toda la información con solo acceder al contenedor.

Esto por supuesto que inquieta a todos los entornos productivos desplegados en contenedores, que deben poner un esfuerzo más para implementar entornos seguros, lo cual realmente sólo requiere de buenas prácticas, nada realmente que temer.

Y ¿Qué es Docker?

Al final la definición:

"Docker es un software multiplataforma open source, que automatiza el despliegue de aplicaciones dentro de contenedores, proporciona una capa de abstracción y automatización de virtualización de aplicaciones"

Ya te debería de dar más sentido con lo explicado anteriormente, básicamente está conformado por cosas Docker engine, Docker Swarm y Docker Registry, convirtiéndolo no solo en un software, si no en un ecosistema de aplicaciones.

¿A qué se refiere el término “dockerizar”?

Se refiere básicamente a encapsular software (aplicaciones, frontend, backend, microservicios, etc.) y generar un ambiente aislado en un contenedor con todas las dependencias necesarias para que ese software funcione correctamente, poniendo en marcha un ambiente de desarrollo, pruebas o productivo.

Si aún no utilizas docker para tus aplicaciones y el problema es que te da miedo la consola o terminal, sin miedo al éxito y te invito a dar los primeros pasos con Docker.