Skip to main content

Ya hace unos años que Docker ha llegado a la industria del desarrollo de software. Y parece ser que es para quedarse. Lo que en un principio podía verse como una moda pasajera más, como tantas otras dentro de este mundo, se ha convertido en todo un estándar. Rápidamente grandes empresas como Netflix o PayPal han sabido ver sus ventajas y apostar fuerte por dockerizar sus aplicaciones. Por ello, en este post, Hugo Pérez, software developer de Slashmobility, hace un repaso de los conceptos básicos de Docker, además, hace una comparativa con las máquinas virtuales tradicionales y analiza las ventajas que nos pueden ofrecer en nuestros desarrollos de software. 

¿Qué es Docker?

Empecemos por el principio ¿Qué es Docker? Podemos definir Docker: “como una herramienta que nos permite implementar fácilmente aplicaciones en entornos aislados. Son los llamados contenedores de software.” ¿Qué es un contenedor? Un contenedor es una unidad de software que empaqueta el código con todas sus dependencias, es decir, herramientas del sistema, bibliotecas configuraciones, etc.; para que la aplicación se ejecute de forma rápida y fiable en cualquier entorno.

Esto quiere decir que, dentro de una misma imagen de Docker se incluye todo lo necesario para que la aplicación sea funcional. De esta forma obtenemos dos beneficios:

  • Ahorraremos el tiempo y trabajo de instalar todas las dependencias para levantar la aplicación en nuestro local una vez descargamos el código del proyecto. Así eliminamos los habituales problemas de compatibilidad.
  • Aseguramos que, a la hora de subir el código, tendremos un entorno igual al que teníamos en nuestro local al desarrollar. 

En otras palabras, es un paso más en la unificación de entornos. Utilizando contenedores podemos levantar exactamente el mismo entorno y aplicación en local, desarrollo y producción sabiendo que funcionará de la misma manera . Esto nos permite ahorrar tiempo, costos y asegurar la calidad de las entregas.

Contenedores de software vs máquinas virtuales

Hasta la llegada de Docker, la forma más habitual de despliegue de software eran las máquinas virtuales. Analizaremos qué caracteriza a una y otra manera de trabajar: 

Máquinas virtuales

  • Abstracción del hardware físico que convierte un servidor en muchos servidores mediante el uso de un hipervisor. Esto nos obliga a reservar memoria, espacio en disco y CPU aunque no se utilice.
  • Cada VM incluye una copia completa de un sistema operativo, la aplicación, las librerías, etc. Las VMs necesitan tomarse su tiempo para levantarse al tener que arrancar todo esto, que es bastante pesado.

Contenedores

  • Abstracción en la capa de la aplicación que empaqueta el código y dependencias.
  • Pueden ejecutarse varios contenedores en la misma máquina compartiendo el núcleo del sistema operativo con otros contenedores. Cada uno de los cuales se ejecuta como proceso aislado en el espacio de usuario. Esto se hace utilizando características de linux, como namespaces. 
  • Los contenedores ocupan menos espacio que las máquinas virtuales (las imágenes de los contenedores suelen tener un tamaño de decenas de MB), pueden manejar más aplicaciones y requieren menos máquinas virtuales y sistemas operativos.

Como vemos, los contenedores serían un paso más en abstracción de la aplicación del entorno en el que se sitúa. Esto nos abarata costes, ya que un mismo servidor puede contener más imágenes que máquinas virtuales. Además, agiliza implementaciones al ser unidades mucho más ligeras. Y, finalmente, elimina errores derivados del entorno, ya que el contenedor incluye el entorno necesario.

Y como una imagen dice más que mil palabras, aquí lo podéis ver: 

Ventajas de Docker más importantes

DevOps , SysAdmins e integración continua

Docker nos permite, como programadores, independizarnos en cierto modo de los administradores de sistemas y acercarnos al concepto DevOps. Se hacen necesarios menos conocimientos para levantar una aplicación al no tener que configurar apenas las máquinas virtuales. También nos facilita implementar la integración continua. Por poner un ejemplo, podemos hacer que al subir el código a cierta rama en nuestro repositorio, se levante un contenedor generado con el nuevo código, ejecute todos los tests y, en el caso de que no haya errores, actualice los entornos correspondientes. Lo mejor es que podríamos hacer este proceso en unos minutos y de forma automatizada. ¡¿Qué más podemos pedir?!

Monolito y MicroServicios

Las aplicaciones monolíticas, a medida que crecen, generan mucha complejidad para su mantenimiento. En el polo opuesto se sitúan los microservicios. Servicios pequeños, independientes y conectados entre sí. Los contenedores, como ya podemos intuir, nos facilitarán y abaratarán el uso de microservicios al poder levantar varios entornos totalmente independientes dentro de la misma máquina virtual. 

Y hasta aquí nuestro repaso sobre Docker. Como podéis imaginar, es una herramienta que daría para mucho más. Pero eso ya os lo contaremos en otro post. Si queréis estar al tanto de todas nuestras novedades, podéis suscribiros a nuestra newsletter (#spamfree). Ya vosotros, ¿ya os ha enamorado Docker?