¿Cuál es la diferencia entre Docker y una máquina virtual?

Docker y las máquinas virtuales (virtual machines, VM) son dos tecnologías que se utilizan en la implementación de aplicaciones. En el ciclo de vida del desarrollo de software, la implementación prepara el código de la aplicación para que se ejecute para los usuarios finales. Docker es una plataforma de código abierto que los desarrolladores utilizan para empaquetar el software en unidades estandarizadas denominadas contenedores. El contenedor tiene tanto el código de la aplicación como su entorno, incluidas las bibliotecas, las herramientas del sistema y el tiempo de ejecución. Con Docker, puede implementar y escalar aplicaciones en cualquier máquina y garantizar que su código se ejecute de manera uniforme. Por el contrario, una máquina virtual es una copia digital de una máquina física. Es posible tener varias máquinas virtuales que tengan sistemas operativos propios e individuales que se ejecuten en el mismo sistema operativo host. Los desarrolladores configuran la máquina virtual para crear el entorno de la aplicación. También es posible ejecutar contenedores de Docker en máquinas virtuales.

Más información sobre Docker »

Virtualización: Docker frente a máquina virtual

La virtualización permite la creación de una instancia virtual de recursos reales, como servidores y redes. En informática, la virtualización permite que varias instancias aisladas de un componente virtualizado funcionen en el componente real.

Por ejemplo, varios servidores virtuales podrían ejecutarse en un servidor físico. Al compartir recursos reales entre varias instancias virtuales, se utilizan mejor y su ejecución es más rentable. La virtualización es la base de una cantidad significativa de desarrollo e implementación de aplicaciones.

Máquinas virtuales

Como su nombre indica, las máquinas virtuales (virtual machines, VM) proporcionan la virtualización de una máquina completa (servidor). Una máquina virtual emula los componentes de hardware de una máquina física, como la CPU, la memoria, la tarjeta de interfaz de red, los controladores USB y las tarjetas de sonido. Puede ejecutar un sistema operativo invitado y varias aplicaciones en el entorno virtual. 

Las máquinas virtuales han hecho posibles las tecnologías de nube y, en Amazon Web Services (AWS), una máquina virtual se denomina instancia. Estas instancias en la nube pertenecen a AWS, quien las mantiene, y se pueden utilizar a través de las API.

Más información sobre las instancias en la nube »

Docker

Una VM le permite ejecutar una máquina virtual en cualquier hardware. Docker le permite ejecutar una aplicación en cualquier sistema operativo. Utiliza instancias de espacio de usuario aisladas conocidas como contenedores.

Los contenedores de Docker tienen su propio sistema de archivos, estructura de dependencias, procesos y capacidades de red. La aplicación tiene todo lo que necesita dentro del contenedor y puede ejecutarse en cualquier lugar. La tecnología de contenedores de Docker utiliza directamente los recursos del núcleo del sistema operativo host subyacente. 

¿Cuáles son las otras similitudes entre Docker y las máquinas virtuales?

Como tecnologías de virtualización, Docker y las máquinas virtuales (virtual machines, VM) tienen ciertas similitudes.

Imágenes

Tanto los contenedores de Docker como las máquinas virtuales se crean a partir de imágenes. Cada imagen sirve como esquema del entorno virtualizado. Las imágenes permiten a los usuarios crear y compartir entornos uniformes sin tener que configurarlos cada vez.

Una imagen especifica todos los recursos del sistema necesarios para ejecutar aplicaciones. Por ejemplo, una imagen de VM crea copias de seguridad del sistema operativo, mientras que la imagen del contenedor de Docker crea una copia de seguridad del entorno de aplicaciones.

Control de versiones

Tanto las imágenes de contenedores de Docker como las imágenes de máquinas virtuales se pueden versionar para realizar un seguimiento de los cambios en la configuración del entorno a lo largo del tiempo.

El control de versiones en Docker se refiere a la capacidad de rastrear y administrar los cambios en las imágenes de Docker a lo largo del tiempo. Permite a los desarrolladores realizar un seguimiento de las diferentes versiones de sus aplicaciones, volver a las versiones anteriores si es necesario e implementar diferentes versiones de una aplicación simultáneamente. 

Del mismo modo, el control de versiones en máquinas virtuales se refiere al proceso de seguimiento y gestión de los cambios en la imagen de la máquina virtual a lo largo del tiempo. El control de versiones de máquinas virtuales realiza un seguimiento de los cambios (como actualizaciones y parches) en la configuración del hardware virtual o del sistema operativo.

Portabilidad

Tanto las máquinas virtuales como Docker se diseñaron para abordar las dificultades de tener que desarrollar diferentes configuraciones de aplicaciones para diferentes tipos de arquitecturas subyacentes. Aunque adoptan diferentes enfoques para afrontar los desafíos, tanto las imágenes de Docker como las de VM son portátiles en todas las arquitecturas, ya sea en las instalaciones o en la nube. 

Diferencias clave: Docker frente a máquina virtual

Tanto las máquinas virtuales (virtual machines, VM) como Docker abordan el desafío de ejecutar aplicaciones en diferentes entornos. Pero lo hacen por motivos ligeramente diferentes y con enfoques distintos.

Objetivo

Las máquinas virtuales se diseñaron originalmente para permitir que varios sistemas operativos se ejecutaran en una sola máquina física. El objetivo es permitir a los usuarios crear un entorno virtual que esté aislado del hardware subyacente. Las máquinas virtuales extraen los detalles del hardware para facilitar la ejecución de aplicaciones en diferentes arquitecturas de hardware y utilizar los recursos de hardware de manera más eficiente.

Docker, por otro lado, se diseñó para proporcionar una forma ligera y portátil de empaquetar y ejecutar aplicaciones en un entorno aislado y reproducible. Docker resume los detalles del sistema operativo para abordar el desafío de implementar aplicaciones en diferentes entornos, como el desarrollo, las pruebas y la producción. Puede resultar muy difícil gestionar las actualizaciones del entorno de software y mantener la uniformidad del entorno en todas partes. Esto es especialmente cierto para las organizaciones que ejecutan cientos de aplicaciones o las descomponen en cientos de microservicios. Docker aborda este problema mediante la contenedorización. 

Producto final

Docker es el nombre de la plataforma de contenedores de código abierto que pertenece y es operada por la empresa Docker. Existen plataformas alternativas como Podman, aunque son mucho menos populares; Docker es sinónimo de contenedorización. El contenedor es el artefacto, la parte utilizable para el usuario final.

Una máquina virtual en sí misma es la parte utilizable por el usuario final. La tecnología no está asociada a una marca específica. Puede implementar máquinas virtuales en centros de datos locales o acceder a ellas a través de las API como un servicio de nube administrado.

Arquitectura

Una máquina virtual ejecuta su propio núcleo y sistema operativo host, junto con las aplicaciones y sus dependencias, como bibliotecas y otros archivos binarios. Un hipervisor coordina entre el hardware (máquina o servidor host) y la máquina virtual. Asigna los recursos de hardware físico descritos durante la instanciación a la máquina virtual para su uso exclusivo. Pueden existir varias máquinas virtuales en un único servidor potente, gestionado por un único hipervisor, con cientos de aplicaciones ejecutándose en cada máquina virtual.

Un contenedor de Docker contiene solo sus dependencias. El software Docker Engine potencia la virtualización en Docker. Proporciona coordinación entre los contenedores en ejecución y el sistema operativo subyacente, ya sea una máquina física o virtual.

Para una gestión de virtualización más avanzada con Docker, utilice Kubernetes. Para obtener más información, consulte ¿Cuál es la diferencia entre Kubernetes y Docker?

Uso compartido de recursos

Tanto las máquinas virtuales como los contenedores de Docker utilizan la multiplexación de recursos o el uso compartido de recursos entre instancias virtualizadas.

Las máquinas virtuales solicitan al hardware una cantidad específica de recursos por adelantado y siguen ocupando esa cantidad de manera constante mientras la máquina virtual esté en ejecución. 

Los contenedores de Docker, por otro lado, utilizan recursos bajo demanda. En lugar de solicitar una cantidad específica de recursos de hardware físico como hacen las máquinas virtuales, simplemente solicitan lo que necesitan del núcleo único del sistema operativo. Varios contenedores comparten el mismo sistema operativo. Los contenedores de Docker dirigen el intercambio de recursos con los líderes del núcleo y pueden utilizar menos recursos del sistema en comparación con una máquina virtual. 

Seguridad

Como los contenedores de Docker comparten el núcleo con el sistema operativo host para reducir el consumo de recursos, corren peligro si hay vulnerabilidades en el núcleo. Sin embargo, Docker también proporciona muchos controles de seguridad avanzados.

Por el contrario, dado que una máquina virtual ejecuta un sistema operativo completo, hay un nivel adicional de aislamiento al ejecutar aplicaciones. Las máquinas virtuales ofrecen una mayor seguridad siempre que el sistema operativo cuente con medidas de seguridad estrictas.

Cuándo usar: Docker frente a máquina virtual

Los contenedores de Docker se ejecutan en la arquitectura Linux y requieren funciones específicas del núcleo de Linux, como espacios de nombres y grupos de control (cgroups). Los desarrolladores suelen ejecutar la plataforma Docker en máquinas virtuales basadas en Linux. Docker empaqueta el código de la aplicación en contenedores que se ejecutan en cualquier lugar. Las actualizaciones del entorno solo se realizan una vez en el contenedor. No es necesario que actualice el entorno de su aplicación. 

Por ejemplo, puede activar una instancia en AWS y cargarla inmediatamente con una imagen de máquina de Amazon (Amazon Machine Image, AMI) que viene preconfigurada con Docker. 

 

Sin embargo, si está entre usar una máquina virtual (virtual machine, VM) o Docker para implementar aplicaciones, depende de los requisitos de ejecución de la aplicación.

Cuándo usar una máquina virtual

Es mejor usar una máquina virtual si ejecuta aplicaciones con los siguientes requisitos: 

  • Dependencias específicas del sistema operativo.
  • Requerimientos sustanciales de recursos de hardware.
  • Necesidad de establecer varios controles en los sistemas operativos.
  • Aplicaciones heredadas que ya no se ejecutan en los sistemas operativos modernos.
  • Diferentes requisitos de sistemas operativos con una única infraestructura física subyacente disponible.

Cuándo usar Docker

Es mejor usar Docker cuando se ejecutan aplicaciones con los siguientes requisitos: 

  • Requerimientos de recursos ligeros para una arquitectura de microservicios.
  • Un entorno de infraestructura física distribuida, que incluye servidores basados en la nube.
  • Ciclos de implementación rápidos (ya que los Dockerfiles son más fáciles de administrar que las configuraciones de VM).
  • Un requisito de escalabilidad rápida.

Resumen de la diferencia: Docker frente a VM

 

Contenedor de Docker

VM

¿Qué es?

Docker es una plataforma de software para crear y ejecutar contenedores de Docker. Un contenedor de Docker es una emulación de una instancia de espacio de usuario, la parte del sistema operativo en la que se ejecutan los procesos de usuario.

Es una emulación de una máquina física (incluido el hardware virtualizado) que ejecuta un sistema operativo.

Virtualización

El contenedor extrae los detalles del sistema operativo del código de la aplicación.

La VM extrae los detalles del hardware del código de la aplicación.

Objetivo

Abstraer los detalles del hardware y aumentar la utilización del hardware.

Mejorar la administración del entorno de aplicaciones y aportar uniformidad en varios entornos.

Administrado por

Docker Engine coordina el sistema operativo y los contenedores de Docker.

El hipervisor coordina entre el hardware físico de la máquina y las máquinas virtuales.

Arquitectura

Comparte recursos con el núcleo del host subyacente.

Ejecuta su propio núcleo y sistema operativo.

Uso compartido de recursos

Bajo demanda.

Una cantidad fija, establecida en los requisitos de configuración de una imagen de máquina virtual.

¿Cómo puede AWS cumplir con los requisitos de implementación de sus aplicaciones?

Amazon Web Services (AWS) cuenta con una gama de servicios diseñados específicamente para la gestión de máquinas virtuales (virtual machines, VM) y Docker:

  • Amazon Elastic Cloud Compute (Amazon EC2) ofrece más de 600 tipos diferentes de instancias seguras, confiables y escalables. Al cargar una plantilla de imagen de máquina de Amazon (Amazon Machine Image, AMI), puede disponer de un servidor de entorno de desarrollo, pruebas o producción completamente especificado listo para funcionar en cuestión de minutos.
  • Amazon Elastic Container Service (Amazon ECS) es un servicio de orquestación de contenedores totalmente administrado que le facilita la implementación y el escalado de aplicaciones en contenedores. Los clientes pueden configurar sus instancias de contenedor para obtener acceso a un registro privado de imágenes de Docker en una nube virtual privada (virtual private cloud, VPC) o a un registro accesible fuera de la VPC.
  • Amazon Elastic Container Registry (Amazon ECR) le permite almacenar, compartir e implementar fácilmente sus contenedores en cualquier lugar. Amazon ECR se integra con la interfaz de línea de comandos (command line interface, CLI) de Docker para simplificar los flujos de trabajo de desarrollo y producción. Por ejemplo, puede enviar las imágenes de sus contenedores a Amazon ECR mediante la CLI de Docker desde su máquina de desarrollo. Además, los orquestadores de contenedores de Amazon pueden utilizarlos directamente para las implementaciones de producción.
  • AWS Fargate es un servicio sin servidor que le permite implementar y administrar contenedores sin necesidad de administrar un servidor físico o máquinas virtuales.

Comience con el desarrollo de aplicaciones en AWS con la creación de una cuenta hoy mismo.