Maquinas virtuales
Una máquina virtual (VM) emula una computadora física. Viene con su propio sistema operativo completo y asignación de recursos. La máquina host proporciona los recursos físicos necesarios, pero el entorno virtualizado funciona como una máquina independiente con su propia BIOS, CPU, almacenamiento y adaptadores de red. Aunque VMware hoy es más famoso por la tecnología moderna de VM, la idea de la máquina virtual ha existido durante mucho tiempo. En 1965, IBM Yorktown Research Center necesitaba una forma de medir la efectividad de las diferentes ideas de informática. El equipo de investigación quería cambiar entre características y medir los resultados. El equipo ideó un esquema para dividir una sola máquina en particiones más pequeñas. Las particiones más pequeñas administrarían sus propios recursos. Serían pequeñas máquinas virtuales. La idea de VM fue exitosa. IBM comenzó a hacer sistemas operativos basados en máquinas virtuales. IBM System 370 (S/370) e IBM System 390 (S/390), tanto los sistemas basados en IBM VM/ESA, se hicieron populares entre las empresas y las universidades porque permitieron a las instituciones permitir que sus usuarios compartan recursos informáticos sin afectar los entornos de los demás. La idea también ayudó a crear el sistema operativo UNIX y el lenguaje de programación Java.
Las máquinas virtuales modernas se ejecutan en hipervisores. Los hipervisores son el software, el firmware o el hardware responsables de la creación y ejecución de máquinas virtuales. Hay muchos hipervisores disponibles en el mercado. KVM, Red Hat Enterprise Virtualization (RHEV), Xenserver, Microsoft Hyper-V y VMware vSphere / ESXI son los reproductores prominentes. Hoy las máquinas virtuales han estimulado el crecimiento de la computación en la nube. Amazon AWS, Microsoft Azure, Google Cloud, Digital Ocean y otras compañías en la nube dependen en gran medida de la tecnología de virtualización.
Contenedores
Los contenedores crean virtualización en el nivel del sistema operativo. Funcionan como un paquete de software ejecutable que aísla aplicaciones de su entorno circundante. Dentro del paquete, un contenedor tiene las propiedades necesarias como código, tiempo de ejecución, bibliotecas de sistemas y herramientas para mantener la aplicación separada de la influencia externa. Se ejecuta en el sistema operativo de la máquina host. Los contenedores comparten bibliotecas y binarios cuando sea posible y solo separa los recursos absolutamente necesarios.
En 1979, las llamadas al sistema "chroot" podrían aislar procesos para UNIX. Fue la primera semilla de la idea del contenedor. La tecnología de contenedores temprano comenzó con las cárceles FreeBSD en 2000. Un año después, Linux Vserver permitió que varias máquinas Linux se ejecuten en un solo host. En 2004, Oracle Solaris Zones proporcionó una funcionalidad similar a las cárceles de FreeBSD. En 2006-2007, Google desarrolló el contenedor de procesos y luego lo fusionó en el núcleo de Linux. Los contenedores de Linux (LXC) se crearon en 2008 para aprovechar Linux CGROUPS y PLATE. En 2013, Docker se creó mediante la combinación de ideas LXC. También agregó herramientas para construir y recuperar fácilmente imágenes de contenedores.
Estibador
Docker es una tecnología de contenedores de código abierto basada en LXC. Es popular porque hace que sea más fácil crear, ejecutar e implementar aplicaciones en un entorno autónomo. Docker no crea un sistema operativo completo como una máquina virtual. En su lugar, utiliza el núcleo del sistema operativo del host y crea virtualización solo para la aplicación y las bibliotecas necesarias. Este enfoque lo hace mucho más ligero que las máquinas virtuales.
Los contenedores Docker se crean a partir de imágenes de Docker. Las imágenes de Docker se pueden considerar como instantáneas de máquinas. Los usuarios pueden iniciar fácilmente un contenedor desde una imagen. Las imágenes se crean como capas. Supongamos que un equipo de desarrollo necesita un contenedor con Apache y Python instalados en una determinada versión de Linux. Un desarrollador puede descargar una imagen de Linux desde Docker Hub, iniciar un contenedor, instalar Apache y Python, crear una nueva imagen desde el contenedor y compartir esa imagen. Otros miembros del equipo no necesitan pasar por la misma instalación. Ayuda a mantener un entorno consistente para todos.
Docker también admite aplicaciones de secuencias de comandos y múltiples. Los usuarios pueden usar un DockerFile basado en texto para definir los requisitos y luego crear contenedores a través de Docker Compose. El ejemplo anterior de la creación de un servidor Apache/Python/Linux también se puede lograr a través de este proceso. Con Docker Compose, los equipos solo necesitan compartir el DockerFile para crear el mismo entorno. Docker tiene herramientas más especializadas para tareas complejas. Docker Swarm ayuda a orquestar implementaciones de Docker a gran escala.
Vagabundo
Vagrant es una herramienta de código abierto que ayuda a crear y mantener máquinas virtuales. Funciona con VirtualBox, VMware, AWS y otros proveedores. Vagrant simplifica la gestión de las máquinas virtuales. Usando un archivo Vagrant, los desarrolladores pueden definir las propiedades de la máquina virtual como el sistema operativo, las instalaciones de software y otros. Vagrantfile basado en texto se puede compartir a través del control de versiones y la máquina necesaria se puede comenzar con un comando simple como "Vagrant Up". Los usuarios pueden iniciar sesión en la máquina como un servidor físico.
Cuándo usar Docker o Vagrant
El uso de Docker o Vagrant a menudo se reduce a la necesidad de contenedores o máquinas virtuales. Aquí hay algunas similitudes y diferencias entre Docker y Vagrant en términos de uso. Tanto Docker como Vagrant tienen entornos fácilmente configurables que se pueden controlar a través de scripts. También son amigables con las nubes. La máquina virtual vagabunda proporciona separación de seguridad basada en el núcleo. La separación hace que las máquinas virtuales sean menos riesgosas que los contenedores. Pero los contenedores Docker son muy livianos. Usan menos recursos y son rápidos en la ejecución. Para que pueda tener muchos más contenedores en un solo host que las máquinas virtuales. Además, comenzar y detener los contenedores es casi instantáneo en comparación con las máquinas virtuales. Las máquinas virtuales pasan por el ciclo de arranque completo del BIOS y el sistema operativo.
La separación de seguridad de una máquina virtual hace que una falla de VM sea más autónoma. Por otro lado, los contenedores comparten recursos y pueden tener un efecto de choque en cascada. Además, las amenazas de seguridad de los contenedores pueden llegar al núcleo del sistema operativo del host. Sin embargo, la velocidad de ejecución y la huella liviana de los contenedores hacen que Docker sea muy atractivo para el desarrollo. Con una arquitectura de microservicio, los contenedores pueden funcionar bien porque los factores de riesgo se mitigan mediante el uso de microservicios. Además, se están haciendo progresos para hacer que Docker sea más seguro todos los días.
Desde un punto de vista de caso de uso práctico, tanto Docker como Vagrant solo son utilizados por profesionales de TI y desarrolladores, no son utilizados por consumidores generales o tecnologías informáticas. En específico, vagabundo puede ser más útil cuando realmente desea emular un sistema completo, mientras que Docker quizás sea más útil al construir un sistema de prueba de integración continua (CI) para cambiar el software con frecuencia. Docker a menudo se usa con frecuencia en las implementaciones de producción de aplicaciones para ejecutar servidores web o de aplicaciones que son estatales y fácilmente asesinados y recreados en cualquier host o IP. Entonces Docker probablemente sea mucho más un caso de uso común.
Docker y Vagrant son tecnologías útiles que pueden ayudar a los desarrolladores a mejorar su productividad. Si la seguridad de la aplicación es una preocupación, entonces el uso de Vagrant y VMS podría ser una buena idea. Para un desarrollo rápido y compartir, Docker ofrece una ventaja. La mayoría de los equipos usan ambos para ejecutar una operación sin problemas.