Docker

¿Qué problemas encontramos en el desarrollo de software profesional?

A la hora de desarrollar aplicaciones y proyectos de software nos podemos encontrar con varios problemas, que se pueden agrupar en tres categorías:

  • Construir
  • Distribuir
  • Ejecutar

Docker promete ser la solución a todo nuestros problemas de una manera simple y sencilla.

Problemas al construir

  • Dependencias de desarrollo. ¿Qué dependencias de desarrollo son necesarias para ejecutar el proyecto?
  • Versiones de entornos de ejecución. ¿Qué versión de Node utilizamos?
  • Equivalencia de entornos de desarrollo. ¿Todos los desarrolladores tienen el mismo entorno de desarrollo?
  • Equivalencia con entornos productivos. ¿Los entornos de desarrollo y producción son idénticos?
  • Versiones/compatibilidad de software de terceros. ¿Todos los desarrolladores tienen las mismas versiones de MySQL?

Problemas al distribuir

  • Output de build heterogéneo. ¿Cómo mandamos los archivos a producción?
  • Acceso a servidores productivos. ¿Git, FTP? ¿Compilamos en el servidor?
  • Ejecución nativa vs. virtualizada. ¿Utilizamos una máquina virtual?
  • Serverless. ¿Cómo mandamos los archivos al servidor?

Problemas al ejecutar

  • Dependencias de aplicación. ¿Las dependencias del servidor sirven para todas las aplicaciones que se ejecutan en él?
  • Compatibilidad del sistema operativo. ¿El sistema operativo es compatible con las dependencias del proyecto?
  • Disponibilidad de servicios externos. ¿Puedo acceder a una base de datos MySQL?
  • Recursos de hardware. ¿Tiene suficiente RAM?

¿Qué es Docker?

Docker permite resolver problemas al construir, distribuir y ejecutar software en diferentes plataformas.

Contenedorización vs virtualización

Virtualización (máquinas virtuales)

Una máquina virtual es una máquina que se ejecuta dentro de otra máquina. Es una imagen o archivo que contiene información dentro. Por lo general tienen varios problemas:

  • Pesadas:
    • En el orden de los GB. Porque tienen el sistema operativo entero, con un montón de dependencias...
    • Muchas VMs suelen contener dependencias repetidas con otras VMs.
  • Administración costosa:
    • Una VM tiene que ser administrada como cualquier otra máquina: patching, updates, etc.
    • Hay que administrar la seguridad interna entre apps.
  • Lentas:
    • Ejecutar nuestro código en una VM implica no solo arrancar aplicaciones, sino también esperar el boot de la VM en sí.

Contenedorización (contenedores)

Los contenedores son agrupaciones de procesos aislados. Sus principales ventajas son:

  • Versátiles:
    • En el orden de los MB.
    • Tienen todas las dependencias que necesitan para funcionar correctamente.
    • Funcionan igual en todos lados.
  • Eficientes:
    • Comparten archivos con otros contenedores.
    • Sólo se ejecutan procesos, no un sistema operativo completo.
  • Aislados:
    • Lo que pasa en el contenedor queda en el contenedor.
    • No pueden alterar su entorno de ejecución (a menos que explícitamente se indique lo contrario).

VMs vs contenedores