¿En qué se diferencia Docker de una máquina virtual?


3693

Sigo releyendo la documentación de Docker para tratar de comprender la diferencia entre Docker y una máquina virtual completa. ¿Cómo se las arregla para proporcionar un sistema de archivos completo, un entorno de red aislado, etc. sin ser tan pesado?

¿Por qué implementar software en una imagen de Docker (si ese es el término correcto) es más fácil que simplemente implementarlo en un entorno de producción consistente?


11
Análisis de rendimiento de Docker vs KVM: bodenr.blogspot.com/2014/05/…
HDave

1
Si está buscando diferencia entre sus imágenes - stackoverflow.com/questions/29096967/…
devesh-ahuja

21
Docker no es una máquina virtual, es una herramienta de administración de configuración.
aaa90210

3
En palabras simples: VM -> tres capas virtuales deben ejecutarse para permitir que su aplicación se ejecute, si desea que la virtualización de un servidor esté bien, pero si solo desea ejecutar una aplicación web no es la mejor solución. DOCKER -> Solo una capa entre tu CPU real y tu aplicación web. Clonación / duplicación más potente y mejor si solo debe ejecutar su aplicación web para virtualizar las que recomiendo
Davide Castronovo

66
no olvidemos que Docker para Mac y Docker para Windows usan la capa de virtualización.
Cambiaformas

Respuestas:


3435

Docker usó originalmente LinuX Containers (LXC), pero luego cambió a runC (anteriormente conocido como libcontainer ), que se ejecuta en el mismo sistema operativo que su host. Esto le permite compartir muchos de los recursos del sistema operativo host. Además, utiliza un sistema de archivos en capas ( AuFS ) y administra las redes.

AuFS es un sistema de archivos en capas, por lo que puede tener una parte de solo lectura y una parte de escritura que se fusionan. Uno podría tener las partes comunes del sistema operativo como de solo lectura (y compartidas entre todos sus contenedores) y luego dar a cada contenedor su propio soporte para escribir.

Entonces, supongamos que tiene una imagen de contenedor de 1 GB; si desea utilizar una máquina virtual completa, necesitaría tener 1 GB x número de máquinas virtuales que desea. Con Docker y AuFS, puede compartir la mayor parte de 1 GB entre todos los contenedores y, si tiene 1000 contenedores, es posible que solo tenga un poco más de 1 GB de espacio para el sistema operativo de los contenedores (suponiendo que todos estén ejecutando la misma imagen del sistema operativo) .

Un sistema virtualizado completo obtiene su propio conjunto de recursos asignados y comparte de manera mínima. Obtienes más aislamiento, pero es mucho más pesado (requiere más recursos). Con Docker obtienes menos aislamiento, pero los contenedores son livianos (requieren menos recursos). Por lo tanto, podría ejecutar fácilmente miles de contenedores en un host, y ni siquiera parpadeará. Intenta hacerlo con Xen, y a menos que tengas un host realmente grande, no creo que sea posible.

Un sistema virtualizado completo suele tardar unos minutos en iniciarse, mientras que los contenedores Docker / LXC / runC tardan segundos y, a menudo, incluso menos de un segundo.

Hay ventajas y desventajas para cada tipo de sistema virtualizado. Si desea un aislamiento total con recursos garantizados, una máquina virtual completa es el camino a seguir. Si solo desea aislar los procesos entre sí y desea ejecutar una tonelada de ellos en un host de tamaño razonable, entonces Docker / LXC / runC parece ser el camino a seguir.

Para obtener más información, consulte este conjunto de publicaciones de blog que explican cómo funciona LXC.

¿Por qué es más fácil implementar software en una imagen acoplable (si ese es el término correcto) que simplemente implementarlo en un entorno de producción consistente?

Implementar un entorno de producción consistente es más fácil decirlo que hacerlo. Incluso si usa herramientas como Chef y Puppet , siempre hay actualizaciones del sistema operativo y otras cosas que cambian entre hosts y entornos.

Docker le brinda la capacidad de capturar el sistema operativo en una imagen compartida y facilita la implementación en otros hosts Docker. Localmente, dev, qa, prod, etc .: toda la misma imagen. Claro que puedes hacer esto con otras herramientas, pero no tan fácil o rápido.

Esto es genial para probar; supongamos que tiene miles de pruebas que necesitan conectarse a una base de datos, y cada prueba necesita una copia inmaculada de la base de datos y realizará cambios en los datos. El enfoque clásico para esto es restablecer la base de datos después de cada prueba, ya sea con código personalizado o con herramientas como Flyway ; esto puede llevar mucho tiempo y significa que las pruebas deben ejecutarse en serie. Sin embargo, con Docker podría crear una imagen de su base de datos y ejecutar una instancia por prueba, y luego ejecutar todas las pruebas en paralelo, ya que sabe que todas se ejecutarán en la misma instantánea de la base de datos. Dado que las pruebas se ejecutan en paralelo y en contenedores Docker, podrían ejecutarse todas en la misma caja al mismo tiempo y deberían terminar mucho más rápido. Intenta hacerlo con una máquina virtual completa.

De los comentarios ...

¡Interesante! Supongo que todavía estoy confundido por la noción de "instantánea [ting] del sistema operativo". ¿Cómo se hace eso sin, bueno, hacer una imagen del sistema operativo?

Bueno, veamos si puedo explicarlo. Comienza con una imagen base, y luego realiza los cambios, y los confirma utilizando Docker, y se crea una imagen. Esta imagen contiene solo las diferencias de la base. Cuando desea ejecutar su imagen, también necesita la base, y coloca su imagen en la parte superior de la base usando un sistema de archivos en capas: como se mencionó anteriormente, Docker usa AuFS. AuFS combina las diferentes capas y obtienes lo que quieres; solo necesitas ejecutarlo. Puede seguir agregando más y más imágenes (capas) y continuará guardando solo las diferencias. Dado que Docker generalmente se basa en imágenes preparadas de un registro , rara vez tiene que "capturar" todo el sistema operativo usted mismo.


239
Ken, en algunos lugares combinas el sistema operativo con el núcleo. Todos los contenedores en un host se ejecutan bajo el mismo kernel, pero el resto de los archivos del sistema operativo pueden ser únicos por contenedor.
Andy

22
¡Interesante! Supongo que todavía estoy confundido por la noción de "instantánea [ting] del sistema operativo". ¿Cómo se hace eso sin, bueno, hacer una imagen del sistema operativo?
zslayton

77
@ murtaza52 están agregando soporte para diferentes sistemas de archivos, por lo que Aufs desaparecer no debería ser un problema. No estoy seguro de cuándo se agregará el soporte de 32 bits, no creo que haya habido una fuerte demanda, por lo que es baja en la lista de prioridades, pero podría estar equivocado.
Ken Cochrane

21
@ Mike: ... que sin duda se inspiró en las cárceles de FreeBSD HISTORY The jail utility appeared in FreeBSD 4.0.
Stefan Paletta

21
Para aquellos que se preguntan a qué comentario de @ Mike estamos respondiendo, ya que parece haber sido eliminado, es esto: <Lo único que falta es una referencia al hecho de que los Contenedores de Linux son un clon de la verdadera fuente de inspiración : Contenedores Solaris. Allá por el año 2004 ... Este es un concepto revolucionario y una excelente forma de hacer máquinas virtuales alojadas y asequibles que sean realmente eficaces. Joyent fue el primero que conozco ...>
Jeffrey 'jf' Lim

559

Buenas respuestas Solo para obtener una representación de la imagen del contenedor frente a la VM, eche un vistazo a la siguiente.

ingrese la descripción de la imagen aquí

Fuente


20
<strike> Por lo que yo entiendo, sobre el "motor docker" debería haber un kernel de Linux compartido. Luego, comúnmente hay compartimientos / bibliotecas compartidas. Primero, vienen los bins / libs y las aplicaciones que son específicas de cada contenedor. Corrígeme si estoy equivocado. </strike> Estaba equivocado. Las imágenes de Docker comparten el núcleo con el host, consulte superuser.com/questions/889472/… . Sin embargo, para ilustrar el sistema de archivos de unión de los contenedores, podría haber una capa compartida de libs / bins directamente encima del motor del acoplador.
Betamos

13
Tengo un problema con la imagen de arriba, porque Hypervisor se puede instalar en una infraestructura / metal desnudo pero Docket no puede (todavía)
reza

@reza, estoy de acuerdo en que Hypervisor se puede instalar en Bare metal, pero el punto es que Docker se recomienda para la contenedorización de aplicaciones y cómo limitar o evitar la virtualización que no es necesaria / aplicable en algunos escenarios. Ken Cochrane explica esto con más detalle stackoverflow.com/a/16048358/2478933
manu97

44
Esto no aclara qué es Docker Engine . Fotos muy abstractas.
kyb

99
No hay una capa "Docker Engine" entre el contenedor y el kernel, el contenedor es solo un proceso con configuraciones especiales en el kernel (espacios de nombres, cgroups, etc.)
Paweł Prażak

504

Puede ser útil comprender cómo funcionan la virtualización y los contenedores a bajo nivel. Eso aclarará muchas cosas.

Nota: Estoy simplificando un poco al describir a continuación. Ver referencias para más información.

¿Cómo funciona la virtualización a bajo nivel?

En este caso, el administrador de VM toma el anillo de CPU 0 (o el "modo raíz" en las CPU más nuevas) e intercepta todas las llamadas privilegiadas realizadas por el SO huésped para crear la ilusión de que el SO huésped tiene su propio hardware. Dato curioso: antes de 1998 se pensaba que era imposible lograr esto en la arquitectura x86 porque no había forma de hacer este tipo de intercepción. La gente de VMWare fue la primera que tuvo la idea de reescribir los bytes ejecutables en la memoria para llamadas privilegiadas del sistema operativo invitado para lograr esto.

El efecto neto es que la virtualización le permite ejecutar dos sistemas operativos completamente diferentes en el mismo hardware. Cada sistema operativo invitado pasa por todo el proceso de arranque, carga del kernel, etc. Puede tener una seguridad muy estricta, por ejemplo, el sistema operativo invitado no puede obtener acceso completo al sistema operativo host u otros invitados y arruinar las cosas.

¿Cómo funcionan los contenedores a bajo nivel?

Alrededor de 2006 , las personas, incluidos algunos de los empleados de Google, implementaron una nueva función de nivel de kernel llamada espacios de nombres (sin embargo, la idea existía mucho antes en FreeBSD) Una función del sistema operativo es permitir compartir recursos globales como la red y el disco con los procesos. ¿Qué sucede si estos recursos globales se envuelven en espacios de nombres para que sean visibles solo para aquellos procesos que se ejecutan en el mismo espacio de nombres? Digamos, puede obtener un trozo de disco y ponerlo en el espacio de nombres X y luego los procesos que se ejecutan en el espacio de nombres Y no pueden verlo ni acceder a él. Del mismo modo, los procesos en el espacio de nombres X no pueden acceder a nada en la memoria asignada al espacio de nombres Y. Por supuesto, los procesos en X no pueden ver ni hablar con los procesos en el espacio de nombres Y. Esto proporciona un tipo de virtualización y aislamiento para los recursos globales. Así es como funciona Docker: cada contenedor se ejecuta en su propio espacio de nombres pero usa exactamente el mismokernel como todos los demás contenedores. El aislamiento ocurre porque el kernel conoce el espacio de nombres asignado al proceso y durante las llamadas a la API se asegura de que el proceso solo pueda acceder a los recursos en su propio espacio de nombres.

Las limitaciones de los contenedores frente a la VM deberían ser obvias ahora: no puede ejecutar un sistema operativo completamente diferente en contenedores como en las máquinas virtuales. Sin embargo, puede ejecutar diferentes distribuciones de Linux porque comparten el mismo núcleo. El nivel de aislamiento no es tan fuerte como en VM. De hecho, había una forma para que el contenedor "invitado" se hiciera cargo del host en las primeras implementaciones. También puede ver que cuando carga un nuevo contenedor, la nueva copia completa del sistema operativo no se inicia como lo hace en VM. Todos los contenedores comparten el mismo núcleo. Es por eso que los contenedores son livianos. Además, a diferencia de VM, no tiene que asignar previamente una porción considerable de memoria a los contenedores porque no estamos ejecutando una nueva copia del sistema operativo. Esto permite ejecutar miles de contenedores en un sistema operativo al tiempo que los pone en un espacio aislado, lo que podría no ser posible si estuviéramos ejecutando una copia separada del sistema operativo en su propia VM.


26
Wow, gracias por la gran explicación de bajo nivel (y hechos históricos). Estaba buscando eso y no se encuentra arriba. ¿Qué quiere decir con "puede ejecutar diferentes distribuciones de Linux porque comparten el mismo núcleo"? ? ¿Está diciendo que un contenedor invitado debe tener exactamente la misma versión del kernel de Linux o que no importa? Si no importa, si invoco un comando del sistema operativo en el invitado pero solo es compatible con el núcleo del invitado. O, por ejemplo, un error corregido en el kernel invitado pero no en el kernel host. Todos los invitados manifestarían el error, ¿correcto? A pesar de que los invitados fueron remendados.
Jeach

77
@Jeach: los contenedores no tienen su propio kernel, están compartiendo / usando el del host. Por lo tanto, no puede ejecutar contenedores que necesitan núcleos diferentes en la misma máquina / VM.
user276648

2
Pregunta: Usted escribe que algunos de los empleados de Google estuvieron involucrados en la función del núcleo de espacios de nombres alrededor de 1996, aunque Google no se fundó hasta 1998. ¿Se refería a "personas que luego se convertirían en empleados de Google"?
Martin Gjaldbaek

3
@martin: gracias por notar que el año fue 2006. También debo mencionar que existían diferentes tipos de espacios de nombres en Linux desde 2002, pero fue el trabajo durante 2006 lo que sentó las bases para la contenedorización. He actualizado la respuesta con referencia.
Shital Shah

20
+1 Esta debería ser la respuesta marcada, mientras que las otras respuestas ofrecen alguna aclaración, solo una explicación de bajo nivel puede aclarar cómo funciona esta tecnología, 'procesos agrupados en su propio espacio de nombres = contenedor'. Muchas gracias, lo entiendo ahora.
Tino Mclaren

328

Me gusta la respuesta de Ken Cochrane.

Pero quiero agregar un punto de vista adicional, no cubierto en detalle aquí. En mi opinión, Docker difiere también en todo el proceso. A diferencia de las máquinas virtuales, Docker no se trata (solo) de compartir recursos óptimos de hardware, además proporciona un "sistema" para empaquetar aplicaciones (preferible, pero no obligatorio, como un conjunto de microservicios).

Para mí encaja en la brecha entre las herramientas orientadas al desarrollador como rpm, paquetes Debian , Maven , npm + Git en un lado y herramientas de operaciones como Puppet , VMware, Xen, lo que sea ...

¿Por qué es más fácil implementar software en una imagen acoplable (si ese es el término correcto) que simplemente implementarlo en un entorno de producción consistente?

Su pregunta supone un entorno de producción consistente. Pero, ¿cómo mantenerlo consistente? Considere cierta cantidad (> 10) de servidores y aplicaciones, etapas en la tubería.

Para mantener esto sincronizado, comenzará a usar algo como Puppet, Chef o sus propios scripts de aprovisionamiento, reglas inéditas y / o mucha documentación ... En teoría, los servidores pueden ejecutarse indefinidamente y mantenerse completamente consistentes y actualizados. La práctica no logra administrar completamente la configuración de un servidor, por lo que hay un margen considerable para la deriva de la configuración y cambios inesperados en los servidores en ejecución.

Hay un patrón conocido para evitar esto, el llamado servidor inmutable . Pero el patrón de servidor inmutable no fue amado. Principalmente debido a las limitaciones de las máquinas virtuales que se usaron antes de Docker. Tratar con imágenes grandes de varios gigabytes, mover esas imágenes grandes solo para cambiar algunos campos en la aplicación, fue muy muy laborioso. Comprensible...

Con un ecosistema Docker, nunca necesitará moverse alrededor de gigabytes en "pequeños cambios" (gracias a aufs y Registry) y no debe preocuparse por perder rendimiento al empaquetar las aplicaciones en un contenedor Docker en tiempo de ejecución. No necesita preocuparse por las versiones de esa imagen.

Y finalmente, incluso podrá reproducir entornos de producción complejos incluso en su computadora portátil Linux (no me llame si no funciona en su caso;))

Y, por supuesto, puede iniciar contenedores Docker en máquinas virtuales (es una buena idea). Reduzca el aprovisionamiento de su servidor en el nivel de VM. Todo lo anterior podría ser gestionado por Docker.

PD Mientras tanto, Docker usa su propia implementación "libcontainer" en lugar de LXC. Pero LXC todavía es utilizable.


1
Parece extraño incluir git en un grupo de herramientas como rpm y dpkg. Menciono esto porque veo que los intentos de usar sistemas de control de versiones como git como herramienta de distribución / empaquetado son una fuente de mucha confusión.
blitzen9872

2
Sin embargo, no está equivocado, git se puede usar para la gestión de paquetes, Bower, por ejemplo, es básicamente un cli elegante para descargar etiquetas git.
roo2

2
El empaquetado de aplicaciones en contenedores es un enfoque interesante y válido. Sin embargo, si lo empaquetó en docker, esto sería excesivo, ya que no habría soporte directo para las dependencias o las bibliotecas compartidas. Esto es exactamente lo que están tratando de lograr las nuevas tecnologías de empaque como Ubuntu Snap y Flatpak para Redhat. En mi opinión, una de estas tecnologías de empaque ganará y se convertirá en el futuro del empaque en Linux.
yosefrow

@ blitzen9872 de acuerdo en esto. Pero se mencionó exactamente porque se usaba muy a menudo en la distribución en praxis, de nuevo, tampoco me gusta.
aholbreich

@yosefrow elabora "exageración". Verifique la idea y las ventajas del patrón de "servidor inmutable", hay algunas desventajas, por supuesto ... Si ve una exageración, no la use ..
aholbreich

245

Docker no es una metodología de virtualización. Se basa en otras herramientas que realmente implementan la virtualización basada en contenedores o la virtualización a nivel del sistema operativo. Para eso, Docker inicialmente usaba el controlador LXC, luego se movió a libcontainer, que ahora se renombra como runc. Docker se centra principalmente en automatizar la implementación de aplicaciones dentro de contenedores de aplicaciones. Los contenedores de aplicaciones están diseñados para empaquetar y ejecutar un solo servicio, mientras que los contenedores del sistema están diseñados para ejecutar múltiples procesos, como máquinas virtuales. Por lo tanto, Docker se considera una herramienta de administración de contenedores o de implementación de aplicaciones en sistemas en contenedores.

Para saber cómo es diferente de otras virtualizaciones, veamos la virtualización y sus tipos. Entonces, sería más fácil entender cuál es la diferencia allí.

Virtualización

En su forma concebida, se consideró un método de división lógica de mainframes para permitir que varias aplicaciones se ejecuten simultáneamente. Sin embargo, el escenario cambió drásticamente cuando las compañías y las comunidades de código abierto pudieron proporcionar un método para manejar las instrucciones privilegiadas de una forma u otra y permitir que múltiples sistemas operativos se ejecuten simultáneamente en un solo sistema basado en x86.

Hipervisor

El hipervisor maneja la creación del entorno virtual en el que operan las máquinas virtuales invitadas. Supervisa los sistemas invitados y se asegura de que los recursos se asignen a los invitados según sea necesario. El hipervisor se encuentra entre la máquina física y las máquinas virtuales y proporciona servicios de virtualización a las máquinas virtuales. Para darse cuenta, intercepta las operaciones del sistema operativo invitado en las máquinas virtuales y emula la operación en el sistema operativo de la máquina host.

El rápido desarrollo de las tecnologías de virtualización, principalmente en la nube, ha impulsado el uso de la virtualización aún más al permitir que se creen múltiples servidores virtuales en un solo servidor físico con la ayuda de hipervisores, como Xen, VMware Player, KVM, etc., y incorporación de soporte de hardware en procesadores básicos, como Intel VT y AMD-V.

Tipos de virtualización

El método de virtualización se puede clasificar en función de cómo imita el hardware a un sistema operativo invitado y emula un entorno operativo invitado. Principalmente, hay tres tipos de virtualización:

  • Emulación
  • Paravirtualización
  • Virtualización basada en contenedores

Emulación

La emulación, también conocida como virtualización completa, ejecuta el núcleo del sistema operativo de la máquina virtual completamente en software. El hipervisor utilizado en este tipo se conoce como hipervisor tipo 2. Se instala en la parte superior del sistema operativo host que se encarga de traducir el código del kernel del sistema operativo invitado a las instrucciones del software. La traducción se realiza completamente en software y no requiere participación de hardware. La emulación permite ejecutar cualquier sistema operativo no modificado que admita el entorno que se emula. La desventaja de este tipo de virtualización es una sobrecarga de recursos del sistema adicional que conduce a una disminución en el rendimiento en comparación con otros tipos de virtualizaciones.

Emulación

Los ejemplos en esta categoría incluyen VMware Player, VirtualBox, QEMU, Bochs, Parallels, etc.

Paravirtualización

La paravirtualización, también conocida como hipervisor Tipo 1, se ejecuta directamente en el hardware o "bare metal" y proporciona servicios de virtualización directamente a las máquinas virtuales que se ejecutan en él. Ayuda al sistema operativo, al hardware virtualizado y al hardware real a colaborar para lograr un rendimiento óptimo. Estos hipervisores suelen tener una huella bastante pequeña y, por sí mismos, no requieren amplios recursos.

Los ejemplos en esta categoría incluyen Xen, KVM, etc.

Paravirtualización

Virtualización basada en contenedores

La virtualización basada en contenedores, también conocida como virtualización a nivel del sistema operativo, permite múltiples ejecuciones aisladas dentro de un solo núcleo del sistema operativo. Tiene el mejor rendimiento y densidad posibles y presenta una gestión dinámica de recursos. El entorno de ejecución virtual aislado que proporciona este tipo de virtualización se denomina contenedor y se puede ver como un grupo de procesos rastreados.

Virtualización basada en contenedores

El concepto de contenedor es posible gracias a la función de espacios de nombres agregada a la versión 2.6.24 del kernel de Linux. El contenedor agrega su ID a cada proceso y agrega nuevas verificaciones de control de acceso a cada llamada al sistema. Se accede mediante la llamada al sistema clone () que permite crear instancias separadas de espacios de nombres previamente globales.

Los espacios de nombres se pueden usar de muchas maneras diferentes, pero el enfoque más común es crear un contenedor aislado que no tenga visibilidad o acceso a objetos fuera del contenedor. Los procesos que se ejecutan dentro del contenedor parecen ejecutarse en un sistema Linux normal, aunque comparten el núcleo subyacente con procesos ubicados en otros espacios de nombres, lo mismo para otros tipos de objetos. Por ejemplo, cuando se usan espacios de nombres, el usuario root dentro del contenedor no se trata como root fuera del contenedor, lo que agrega seguridad adicional.

El subsistema de Grupos de control de Linux (cgroups), el siguiente componente principal para habilitar la virtualización basada en contenedores, se usa para agrupar procesos y administrar su consumo de recursos agregados. Se usa comúnmente para limitar el consumo de memoria y CPU de los contenedores. Dado que un sistema Linux en contenedores solo tiene un núcleo y el núcleo tiene una visibilidad completa de los contenedores, solo hay un nivel de asignación y programación de recursos.

Hay varias herramientas de administración disponibles para contenedores Linux, incluidas LXC, LXD, systemd-nspawn, lmctfy, Warden, Linux-VServer, OpenVZ, Docker, etc.

Contenedores vs Máquinas Virtuales

A diferencia de una máquina virtual, un contenedor no necesita iniciar el núcleo del sistema operativo, por lo que los contenedores se pueden crear en menos de un segundo. Esta característica hace que la virtualización basada en contenedores sea única y deseable que otros enfoques de virtualización.

Dado que la virtualización basada en contenedores agrega poca o ninguna sobrecarga a la máquina host, la virtualización basada en contenedores tiene un rendimiento casi nativo

Para la virtualización basada en contenedores, no se requiere software adicional, a diferencia de otras virtualizaciones.

Todos los contenedores en una máquina host comparten el planificador de la máquina host, lo que ahorra la necesidad de recursos adicionales.

Los estados del contenedor (imágenes Docker o LXC) son de tamaño pequeño en comparación con las imágenes de máquinas virtuales, por lo que las imágenes del contenedor son fáciles de distribuir.

La gestión de recursos en contenedores se logra a través de cgroups. Cgroups no permite que los contenedores consuman más recursos de los asignados. Sin embargo, a partir de ahora, todos los recursos de la máquina host son visibles en las máquinas virtuales, pero no se pueden usar. Esto puede realizarse ejecutando topohtop en contenedores y máquina host al mismo tiempo. El resultado en todos los entornos será similar.

Actualizar:

¿Cómo ejecuta Docker contenedores en sistemas que no son Linux?

Si los contenedores son posibles debido a las características disponibles en el kernel de Linux, entonces la pregunta obvia es cómo los sistemas que no son Linux ejecutan contenedores. Tanto Docker para Mac como Windows usan máquinas virtuales Linux para ejecutar los contenedores. Docker Toolbox se usa para ejecutar contenedores en máquinas virtuales de Virtual Box. Pero, el último Docker usa Hyper-V en Windows e Hypervisor.framework en Mac.

Ahora, permítanme describir cómo Docker para Mac ejecuta contenedores en detalle.

Docker para Mac usa https://github.com/moby/hyperkit para emular las capacidades del hipervisor e Hyperkit usa hypervisor.framework en su núcleo. Hypervisor.framework es la solución de hipervisor nativa de Mac. Hyperkit también usa VPNKit y DataKit para la red de espacio de nombres y el sistema de archivos, respectivamente.

La máquina virtual Linux que Docker ejecuta en Mac es de solo lectura. Sin embargo, puedes atacarlo ejecutando:

screen ~/Library/Containers/com.docker.docker/Data/vms/0/tty.

Ahora, incluso podemos verificar la versión Kernel de esta VM:

# uname -a Linux linuxkit-025000000001 4.9.93-linuxkit-aufs #1 SMP Wed Jun 6 16:86_64 Linux.

Todos los contenedores se ejecutan dentro de esta VM.

Existen algunas limitaciones para hypervisor.framework. Debido a eso, Docker no expone docker0la interfaz de red en Mac. Por lo tanto, no puede acceder a los contenedores desde el host. A partir de ahora,docker0 solo está disponible dentro de la VM.

Hyper-v es el hipervisor nativo en Windows. También están tratando de aprovechar las capacidades de Windows 10 para ejecutar sistemas Linux de forma nativa.


1
Muy buena publicación. Muchas gracias! Otra pregunta que tengo es que puedo construir una imagen docker arm7v de 32 bits en la máquina Mac x86_64. Sin embargo, no puedo construir la misma imagen en Ubuntu instalado en la máquina x86_64. ¿Está relacionado con la solución del hipervisor Mac que mencionaste?
jiashenC

1
Su respuesta es la única que aborda "¿Cómo ejecuta Docker contenedores en sistemas que no son Linux?" Esta información es muy difícil de encontrar en cualquier lugar. ¡Todo enfatiza que "los contenedores son completamente diferentes de las máquinas virtuales!", Son más rápidos, más livianos, etc.
Bogatyr el

@Bogatyr IINM, es una máquina virtual para todos los contenedores.
dstromberg

147

A través de esta publicación vamos a dibujar algunas líneas de diferencias entre máquinas virtuales y LXC. Primero los definimos.

VM :

Una máquina virtual emula un entorno informático físico, pero las solicitudes de CPU, memoria, disco duro, red y otros recursos de hardware son administradas por una capa de virtualización que traduce estas solicitudes al hardware físico subyacente.

En este contexto, la VM se llama como Invitado, mientras que el entorno en el que se ejecuta se llama host.

LXC s:

Los Contenedores de Linux (LXC) son capacidades de nivel de sistema operativo que hacen posible ejecutar múltiples contenedores de Linux aislados, en un host de control (el host LXC). Los contenedores de Linux sirven como una alternativa ligera a las máquinas virtuales, ya que no requieren los hipervisores a saber. Virtualbox, KVM, Xen, etc.

Ahora, a menos que haya sido drogado por Alan (Zach Galifianakis- de la serie Hangover) y haya estado en Las Vegas durante el último año, estará muy consciente del tremendo interés por la tecnología de contenedores Linux, y si voy a ser un contenedor específico El proyecto que ha creado un gran revuelo en todo el mundo en los últimos meses es: Docker, que lleva a algunas opiniones que hacen eco de que los entornos de computación en la nube deberían abandonar las máquinas virtuales (VM) y reemplazarlas con contenedores debido a su menor sobrecarga y un rendimiento potencialmente mejor.

Pero la gran pregunta es, ¿es factible ?, ¿será sensato?

a. Los LXC tienen un alcance para una instancia de Linux. Es posible que se trate de diferentes versiones de Linux (por ejemplo, un contenedor de Ubuntu en un host CentOS pero sigue siendo Linux). De manera similar, los contenedores basados ​​en Windows ahora tienen un alcance para una instancia de Windows si miramos las máquinas virtuales, tienen un alcance bastante más amplio y utilizan Los hipervisores no están limitados a los sistemas operativos Linux o Windows.

si. Los LXC tienen gastos generales bajos y un mejor rendimiento en comparación con las máquinas virtuales. Herramientas a saber. Docker, construido sobre los hombros de la tecnología LXC, ha proporcionado a los desarrolladores una plataforma para ejecutar sus aplicaciones y, al mismo tiempo, ha dado a las personas de operaciones una herramienta que les permitirá implementar el mismo contenedor en servidores de producción o centros de datos. Intenta crear la experiencia entre un desarrollador que ejecuta una aplicación, arranca y prueba una aplicación y una persona de operaciones que implementa esa aplicación sin problemas, porque aquí es donde reside toda la fricción y el propósito de DevOps es romper esos silos.

Por lo tanto, el mejor enfoque es que los proveedores de infraestructura en la nube deberían abogar por un uso adecuado de las máquinas virtuales y LXC, ya que cada uno de ellos es adecuado para manejar cargas de trabajo y escenarios específicos.

Abandonar máquinas virtuales no es práctico a partir de ahora. Por lo tanto, tanto las máquinas virtuales como las LXC tienen su propia existencia e importancia individual.


44
Su parte "b" anterior es exactamente lo que la gente de Docker ha estado diciendo sobre la tecnología. Está destinado a facilitar las tareas de desarrollo e implementación. Y en base a mi experiencia como desarrollador y sysop, tengo que estar de acuerdo.
WineSoaked

3
Es una respuesta bastante abstracta. Necesitamos casos de uso cuando usar / no usar Docker. Esa es la pregunta. Todos pueden encontrar cómo es el Docker, pero solo unos pocos pueden explicarlo en escenarios reales.
Ivan Voroshilin

1
docker se está trayendo al mundo de Windows ahora, ya que ya no depende de LXC: blogs.msdn.com/b/nzdev/archive/2015/06/02/… corríjame si no
entendí

66
Me resulta difícil comprender la parte de los contenedores "(por ejemplo, un contenedor de Ubuntu en un host Centos pero todavía es Linux)" . Según tengo entendido, los contenedores comparten el núcleo del host. Si tengo una VM host que ejecuta Linux kernel 4.6, por ejemplo, tengo varias VM invitadas que ejecutan Linux kernels 2.4, 2.6, 3.2, 4.1 y 4.4. Si ejecuto comandos específicos para ese núcleo, obtendré el comportamiento del núcleo invitado (y no el host). Pero si mis máquinas virtuales invitadas son contenedores ahora, ¿el comando del host lo determinaría el núcleo del host?
Jeach

@bubakazouba sí. estás en lo correcto. Ahora usan runC
Rumesh Eranga Hapuarachchi

140

La mayoría de las respuestas aquí hablan de máquinas virtuales. Voy a darle una respuesta única a esta pregunta que me ha ayudado más en los últimos años de usar Docker. Es esto:

Docker es solo una forma elegante de ejecutar un proceso, no una máquina virtual.

Ahora, déjame explicarte un poco más sobre lo que eso significa. Las máquinas virtuales son su propia bestia. Tengo ganas de explicar lo que Docker es lo ayudará a comprender esto más que explicar qué es una máquina virtual. Especialmente porque hay muchas respuestas excelentes aquí que te dicen exactamente lo que alguien quiere decir cuando dice "máquina virtual". Entonces...

Un contenedor Docker es solo un proceso (y sus elementos secundarios) que se divide en compartimentos utilizando cgroups dentro del núcleo del sistema host del resto de los procesos. En realidad, puede ver los procesos del contenedor Docker ejecutándose ps auxen el host. Por ejemplo, comenzar apache2"en un contenedor" es solo comenzar apache2como un proceso especial en el host. Se acaba de dividir en compartimentos de otros procesos en la máquina. Es importante tener en cuenta que sus contenedores no existen fuera de la vida útil de su proceso en contenedores. Cuando su proceso muere, su contenedor muere. Esto se debe a que Docker reemplaza pid 1dentro de su contenedor con su aplicación ( pid 1normalmente es el sistema init). Este último punto sobrepid 1 es muy importante.

En cuanto al sistema de archivos utilizado por cada uno de esos procesos de contenedor, Docker usa UnionFS imágenes respaldadas por , que es lo que está descargando cuando hace un . Cada "imagen" es solo una serie de capas y metadatos relacionados. El concepto de capas es muy importante aquí. Cada capa es solo un cambio de la capa debajo de ella. Por ejemplo, cuando elimina un archivo en su Dockerfile mientras crea un contenedor Docker, en realidad solo está creando una capa en la parte superior de la última capa que dice "este archivo ha sido eliminado". Por cierto, es por eso que puede eliminar un archivo grande de su sistema de archivos, pero la imagen todavía ocupa la misma cantidad de espacio en disco. El archivo todavía está allí, en las capas debajo de la actual. Las capas mismas son solo tarballs de archivos. Puedes probar esto con y luego . Entonces puedes echar un vistazo. Todos esos directorios que parecen hashes largos son en realidad las capas individuales. Cada uno contiene archivos ( ) y metadatos (docker pull ubuntudocker save --output /tmp/ubuntu.tar ubuntucd /tmp && tar xvf ubuntu.tarlayer.tarjson) con información sobre esa capa en particular. Esas capas solo describen cambios en el sistema de archivos que se guardan como una capa "encima" de su estado original. Al leer los datos "actuales", el sistema de archivos lee los datos como si solo estuviera mirando las capas superiores de cambios. Es por eso que el archivo parece haber sido eliminado, aunque todavía existe en las capas "anteriores", porque el sistema de archivos solo está mirando las capas superiores. Esto permite que contenedores completamente diferentes compartan sus capas del sistema de archivos, a pesar de que algunos cambios significativos pueden haberle sucedido al sistema de archivos en las capas superiores de cada contenedor. Esto puede ahorrarle una tonelada de espacio en disco, cuando sus contenedores comparten sus capas de imagen base. Sin embargo,

La conexión en red en Docker se logra mediante el uso de un puente de Ethernet (llamado docker0en el host) e interfaces virtuales para cada contenedor en el host. Crea una subred virtual docker0para que sus contenedores se comuniquen "entre". Aquí hay muchas opciones para la creación de redes, incluida la creación de subredes personalizadas para sus contenedores y la capacidad de "compartir" la pila de redes de su host para que su contenedor acceda directamente.

Docker se mueve muy rápido. Su documentación es una de las mejores que he visto. Generalmente está bien escrito, conciso y preciso. Le recomiendo que consulte la documentación disponible para obtener más información y confíe en la documentación sobre cualquier otra cosa que lea en línea, incluido Stack Overflow. Si tiene preguntas específicas, le recomiendo unirse #dockera Freenode IRC y preguntar allí (¡incluso puede usar el chat web de Freenode para eso!).


12
"Docker es solo una forma elegante de ejecutar un proceso, no una máquina virtual". este es un gran resumen, gracias!
mkorman

¡Gracias! El crédito para eso va a programmerq desde el #dockercanal en Freenode IRC.
L0j1k

Esto es mucho más claro que las otras respuestas. Supongo que es la analogía del proceso lo que lo hace por mí. Simplemente baja el nivel de abstracción.
Mate Mrše

Yo agregaría: "Docker es solo una forma elegante de ejecutar un proceso, de forma aislada, protegida y encapsulada, no una máquina virtual". El sistema host tiene visibilidad (sobre los procesos y recursos) del subsistema, pero el sistema aislado no tiene visibilidad (sobre los procesos y recursos) en el sistema host.
Sohail Si

87

Docker encapsula una aplicación con todas sus dependencias.

Un virtualizador encapsula un sistema operativo que puede ejecutar cualquier aplicación que normalmente puede ejecutar en una máquina de metal desnudo.


1
Estoy aprendiendo sobre LXC, corrígeme si me equivoco, pero podría ser algún tipo de virtualenv. pero obviamente más amplio, no solo circunscripto a Python por decir
NeoVe

2
Me gusta esta respuesta la mejor. Es simple y va directo al punto. Ahora que uno tiene una comprensión básica de LO QUE LXC y los Virtualizadores pueden hacer, los detalles de otra lectura tendrán sentido.
Phil

2
@ Phil Lo hizo después de leer primero las respuestas detalladas arriba.
johnny

Supongo que quieren saber cómo encapsular. Esa es la gran parte que mostraría la diferencia entre ellos pero no respondiste.
Light.G

60

Ambos son muy diferentes. Docker es liviano y usa LXC / libcontainer (que se basa en el espacio de nombres del kernel y cgroups) y no tiene emulación de máquina / hardware como hipervisor, KVM. Xen que son pesados.

Docker y LXC están diseñados más para sandboxing, contenedorización y aislamiento de recursos. Utiliza la API de clonación del sistema operativo host (actualmente solo el kernel de Linux) que proporciona espacio de nombres para IPC, NS (montaje), red, PID, UTS, etc.

¿Qué pasa con la memoria, E / S, CPU, etc.? Eso se controla mediante cgroups donde puede crear grupos con ciertas especificaciones / restricciones de recursos (CPU, memoria, etc.) y poner sus procesos allí. Además de LXC, Docker proporciona un back-end de almacenamiento ( http://www.projectatomic.io/docs/filesystems/ ), por ejemplo, sistema de archivos de montaje de unión donde puede agregar capas y compartir capas entre diferentes espacios de nombres de montaje.

Esta es una característica poderosa donde las imágenes base son típicamente de solo lectura y solo cuando el contenedor modifica algo en la capa escribirá algo en la partición de lectura-escritura (también conocida como copia en escritura). También proporciona muchos otros contenedores como el registro y el control de versiones de imágenes.

Con LXC normal, debe venir con algunos rootfs o compartir los rootfs y cuando se comparten, y los cambios se reflejan en otros contenedores. Debido a muchas de estas características adicionales, Docker es más popular que LXC. LXC es popular en entornos integrados para implementar seguridad alrededor de procesos expuestos a entidades externas como la red y la interfaz de usuario. Docker es popular en el entorno de múltiples inquilinos en la nube, donde se espera un entorno de producción consistente.

Una máquina virtual normal (por ejemplo, VirtualBox y VMware) usa un hipervisor, y las tecnologías relacionadas tienen un firmware dedicado que se convierte en la primera capa para el primer sistema operativo (sistema operativo host o sistema operativo invitado 0) o un software que se ejecuta en el sistema operativo host para proporcionar emulación de hardware como CPU, USB / accesorios, memoria, red, etc., a los sistemas operativos invitados. Las máquinas virtuales siguen siendo (a partir de 2015) populares en el entorno de múltiples inquilinos de alta seguridad.

Docker / LXC casi se puede ejecutar en cualquier hardware barato (menos de 1 GB de memoria también está bien siempre que tenga un kernel más nuevo) en comparación con las máquinas virtuales normales que necesitan al menos 2 GB de memoria, etc., para hacer algo significativo con él . Pero el soporte de Docker en el sistema operativo host no está disponible en sistemas operativos como Windows (a partir de noviembre de 2014), donde muchos tipos de máquinas virtuales se pueden ejecutar en Windows, Linux y Mac.

Aquí hay una foto de Docker / Rightscale: Aquí hay una foto de Rightscale


34

1. ligero

Esta es probablemente la primera impresión para muchos estudiantes de docker.

Primero, las imágenes de Docker suelen ser más pequeñas que las imágenes de VM, lo que facilita la creación, la copia y el intercambio.

En segundo lugar, los contenedores Docker pueden comenzar en varios milisegundos, mientras que VM se inicia en segundos.

2. Sistema de archivos en capas

Esta es otra característica clave de Docker. Las imágenes tienen capas, y diferentes imágenes pueden compartir capas, lo que hace que ahorre aún más espacio y sea más rápido de construir.

Si todos los contenedores usan Ubuntu como sus imágenes base, no todas las imágenes tienen su propio sistema de archivos, pero comparten los mismos archivos ubuntu subrayados, y solo difieren en sus propios datos de aplicación.

3. Kernel de SO compartido

¡Piense en los contenedores como procesos!

Todos los contenedores que se ejecutan en un host son, de hecho, un montón de procesos con diferentes sistemas de archivos. Comparten el mismo núcleo del sistema operativo, solo encapsula la biblioteca del sistema y las dependencias.

Esto es bueno para la mayoría de los casos (no se mantiene un kernel adicional del sistema operativo) pero puede ser un problema si se necesitan aislamientos estrictos entre los contenedores.

¿Por qué es importante?

Todo esto parece una mejora, no una revolución. Bueno, la acumulación cuantitativa conduce a la transformación cualitativa .

Piense en la implementación de la aplicación. Si queremos implementar un nuevo software (servicio) o actualizar uno, es mejor cambiar los archivos y procesos de configuración en lugar de crear una nueva VM. Porque Crear una VM con servicio actualizado, probarlo (compartir entre Dev y QA), implementar en producción lleva horas, incluso días. Si algo sale mal, debes comenzar de nuevo, perdiendo aún más tiempo. Por lo tanto, utilice la herramienta de administración de configuración (títere, saltstack, chef, etc.) para instalar un nuevo software, se prefiere descargar nuevos archivos.

Cuando se trata de Docker, es imposible usar un contenedor Docker recién creado para reemplazar el antiguo. ¡El mantenimiento es mucho más fácil! Construir una nueva imagen, compartirla con QA, probarla, implementarla solo lleva minutos (si todo está automatizado), horas en el peor de los casos. Esto se llama infraestructura inmutable : no mantenga el software (actualización), cree uno nuevo.

Transforma la forma en que se entregan los servicios. Queremos aplicaciones, pero tenemos que mantener máquinas virtuales (lo cual es una molestia y tiene poco que ver con nuestras aplicaciones). Docker te hace concentrarte en las aplicaciones y suaviza todo.


27

Docker, básicamente contenedores, admite la virtualización del sistema operativo, es decir, su aplicación considera que tiene una instancia completa de un sistema operativo, mientras que VM admite la virtualización de hardware . Sientes que es una máquina física en la que puedes arrancar cualquier sistema operativo.

En Docker, los contenedores que se ejecutan comparten el núcleo del sistema operativo host, mientras que en las máquinas virtuales tienen sus propios archivos del sistema operativo. El entorno (el SO) en el que desarrolla una aplicación sería el mismo cuando la implemente en varios entornos de servicio, como "prueba" o "producción".

Por ejemplo, si desarrolla un servidor web que se ejecuta en el puerto 4000, cuando lo implementa en su entorno de "prueba", ese puerto ya lo utiliza algún otro programa, por lo que deja de funcionar. En contenedores hay capas; todos los cambios que haya realizado en el sistema operativo se guardarían en una o más capas y esas capas serían parte de la imagen, por lo que donde quiera que vaya la imagen, las dependencias también estarán presentes.

En el ejemplo que se muestra a continuación, la máquina host tiene tres máquinas virtuales. Para proporcionar el aislamiento completo de las aplicaciones en las máquinas virtuales, cada una tiene sus propias copias de los archivos del sistema operativo, las bibliotecas y el código de la aplicación, junto con una instancia completa en memoria de un sistema operativo.Sin contenedores Mientras que la figura a continuación muestra el mismo escenario con los contenedores. Aquí, los contenedores simplemente comparten el sistema operativo host, incluido el kernel y las bibliotecas, por lo que no necesitan iniciar un sistema operativo, cargar bibliotecas o pagar un costo de memoria privada por esos archivos. El único espacio incremental que ocupan es cualquier espacio de memoria y disco necesario para que la aplicación se ejecute en el contenedor. Si bien el entorno de la aplicación se siente como un sistema operativo dedicado, la aplicación se implementa como lo haría en un host dedicado. La aplicación en contenedores comienza en segundos y muchas más instancias de la aplicación pueden caber en la máquina que en el caso de VM. ingrese la descripción de la imagen aquí

Fuente: https://azure.microsoft.com/en-us/blog/containers-docker-windows-and-trends/


Me gusta mucho el primer párrafo.
Light.G

23

Hay tres configuraciones diferentes que proporcionan una pila para ejecutar una aplicación (esto nos ayudará a reconocer qué es un contenedor y qué lo hace tan poderoso como otras soluciones):

1) Traditional Servers(bare metal)
2) Virtual machines (VMs)
3) Containers

1) La pila de servidor tradicional consiste en un servidor físico que ejecuta un sistema operativo y su aplicación.

Ventajas:

  • Utilización de recursos en bruto.

  • Aislamiento

Desventajas

  • Tiempo de despliegue muy lento.
  • Costoso
  • Recursos desperdiciados
  • Difícil de escalar
  • Difícil de migrar
  • Configuración compleja

2) La pila VM consta de un servidor físico que ejecuta un sistema operativo y un hipervisor que administra su máquina virtual, recursos compartidos e interfaz de red. Cada Vm ejecuta un sistema operativo invitado, una aplicación o un conjunto de aplicaciones.

Ventajas:

  • Buen uso de los recursos.
  • Fácil de escalar
  • Fácil de respaldar y migrar
  • Eficiencia de costo
  • Flexibilidad

Desventajas

  • La asignación de recursos es problemática
  • Dependencia de un proveedor
  • Configuración compleja

3) La configuración del contenedor , la diferencia clave con otra pila es que la virtualización basada en el contenedor utiliza el núcleo del sistema operativo host para buscar múltiples instancias de invitados aisladas. Estas instancias de invitado se llaman como contenedores. El host puede ser un servidor físico o una VM.

Ventajas:

  • Aislamiento
  • Ligero
  • Recurso efectivo
  • Fácil de migrar
  • Seguridad
  • Gastos indirectos bajos
  • Ambiente de producción y desarrollo espejo

Desventajas

  • Misma arquitectura
  • Aplicaciones pesadas en recursos
  • Problemas de redes y seguridad.

Al comparar la configuración del contenedor con sus predecesoras, podemos concluir que la contenedorización es la configuración más rápida, más efectiva en recursos y más segura que conocemos hasta la fecha. Los contenedores son instancias aisladas que ejecutan su aplicación. Docker hace girar el contenedor de una manera, las capas obtienen memoria de tiempo de ejecución con controladores de almacenamiento predeterminados (controladores de superposición) que se ejecutan en segundos y una capa de copia en escritura creada encima de ella una vez que nos comprometemos en el contenedor, lo que potencia la ejecución de contenedores.En el caso de las máquinas virtuales, tomará alrededor de un minuto cargar todo en el entorno de virtualización. Estas instancias livianas se pueden reemplazar, reconstruir y mover fácilmente. Esto nos permite reflejar el entorno de producción y desarrollo y es de gran ayuda en los procesos de CI / CD. Las ventajas que los contenedores pueden proporcionar son tan convincentes que definitivamente están aquí para quedarse.


Indique por qué esta debería ser la "configuración más segura" en comparación con las máquinas virtuales.
MKesper

@MKesper: cuando migra de un entorno heredado a un entorno de contenedor, tiene varias formas de construir un paradigma de seguridad, uno basado en un enfoque proactivo en lugar de reactivo para prevenir intrusiones. Le permite asegurar su aplicación y tiempo de ejecución a un nivel más granular y matizado. También permiten identificar y resolver posibles amenazas de seguridad antes de que interrumpan sus flujos de trabajo. Y es posible combinar el análisis estático con ML para automatizar la defensa del tiempo de ejecución y aplicar políticas en su entorno. Por lo tanto, la línea "configuración más segura".
mohan08p

18

En relación a:-

"¿Por qué es más fácil implementar software en una imagen acoplable que simplemente implementarlo en un entorno de producción consistente?"

La mayoría del software se implementa en muchos entornos, generalmente un mínimo de tres de los siguientes:

  1. PC de desarrollador individual (es)
  2. Entorno de desarrollador compartido
  3. PC de prueba individual (es)
  4. Entorno de prueba compartido
  5. Entorno de control de calidad
  6. Entorno UAT
  7. Prueba de carga / rendimiento
  8. Puesta en escena en vivo
  9. Producción
  10. Archivo

También hay que considerar los siguientes factores:

  • Los desarrolladores, y de hecho los probadores, tendrán configuraciones de PC sutiles o muy diferentes, por la propia naturaleza del trabajo.
  • Los desarrolladores a menudo pueden desarrollar en PC más allá del control de las reglas de estandarización corporativas o comerciales (por ejemplo, freelancers que desarrollan en sus propias máquinas (a menudo de forma remota) o contribuyentes a proyectos de código abierto que no están 'empleados' o 'contratados' para configurar sus PC en particular camino)
  • Algunos entornos consistirán en un número fijo de máquinas múltiples en una configuración de carga equilibrada
  • Muchos entornos de producción tendrán servidores basados ​​en la nube creados y destruidos dinámicamente (o 'elásticamente') dependiendo de los niveles de tráfico

Como puede ver, el número total extrapolado de servidores para una organización rara vez se encuentra en cifras únicas, muy a menudo en cifras triples y puede ser fácilmente aún mayor.

Todo esto significa que crear entornos consistentes en primer lugar es bastante difícil solo por el gran volumen (incluso en un escenario de campo verde), pero mantenerlos consistentes es casi imposible dada la gran cantidad de servidores, la adición de nuevos servidores (dinámicamente o manualmente), actualizaciones automáticas de proveedores de O / S, proveedores de antivirus, proveedores de navegadores y similares, instalaciones manuales de software o cambios de configuración realizados por desarrolladores o técnicos de servidores, etc. Permítanme repetirlo: es prácticamente imposible (sin juego de palabras) para mantener los entornos consistentes (está bien, para el purista, se puede hacer, pero implica una gran cantidad de tiempo, esfuerzo y disciplina, que es precisamente por qué las máquinas virtuales y los contenedores (por ejemplo, Docker) se diseñaron en primer lugar).

Así que piense en su pregunta más así: "Dada la extrema dificultad de mantener consistentes todos los entornos, ¿es más fácil implementar software en una imagen acoplable, incluso teniendo en cuenta la curva de aprendizaje?" . Creo que la respuesta siempre será "sí", pero solo hay una forma de averiguarlo, publique esta nueva pregunta en Stack Overflow.


Entonces, si despliego mi imagen acoplable con 15 cuadros diferentes que tienen todas las combinaciones diferentes de SO / versión, ¿todas mis imágenes acoplables se ejecutarán igual?
Teoman shipahi el

@Teomanshipahi Si todos estos contenedores pudieran usar el mismo núcleo proporcionado por el host, sí, todos se ejecutarán con éxito.
Light.G

Si uso Docker para Windows en mi local, ¿puedo implementarlo y ejecutarlo de la misma manera en Linux / Mac?
Teoman shipahi

Lo que siempre parece pasarse por alto es que todavía hay dependencias de la versión: 1) El desarrollador debe desarrollar en el mismo entorno que contiene la imagen; 2) El entorno de desarrollo y el entorno de prueba deben estar ejecutando las mismas versiones (o compatibles) tanto del kernel de Linux como del mismo acoplador ... ¿sí?
Bogatyr el

18

Hay muchas respuestas que explican más detalladamente las diferencias, pero aquí está mi breve explicación.

Una diferencia importante es que las máquinas virtuales usan un núcleo separado para ejecutar el sistema operativo . Esa es la razón por la que es pesado y toma tiempo arrancar, consumiendo más recursos del sistema.

En Docker, los contenedores comparten el núcleo con el host; por lo tanto, es liviano y puede comenzar y detenerse rápidamente.

En la virtualización, los recursos se asignan al comienzo de la configuración y, por lo tanto, los recursos no se utilizan por completo cuando la máquina virtual está inactiva durante muchas veces. En Docker, los contenedores no están asignados con una cantidad fija de recursos de hardware y es libre de usar los recursos según los requisitos y, por lo tanto, es altamente escalable.

Docker usa el sistema de archivos UNION . Docker usa una tecnología de copia en escritura para reducir el espacio de memoria consumido por los contenedores. Leer más aquí


1
"En la virtualización, los recursos se asignan al comienzo de la configuración y, por lo tanto, los recursos no se utilizan por completo cuando la máquina virtual está inactiva durante muchas de las veces" Hyper-V tiene una noción de memoria dinámica donde puede especificar Mínimo, Máximo y RAM de inicio.
Mariusz

15

Con una máquina virtual , tenemos un servidor, tenemos un sistema operativo host en ese servidor y luego tenemos un hipervisor. Y luego ejecutándose sobre ese hipervisor, tenemos cualquier número de sistemas operativos invitados con una aplicación y sus binarios dependientes y bibliotecas en ese servidor. Trae todo un sistema operativo invitado con él. Es bastante pesado. También hay un límite en cuanto a lo que realmente puede poner en cada máquina física.

Ingrese la descripción de la imagen aquí

Los contenedores Docker, por otro lado, son ligeramente diferentes. Tenemos el servidor Tenemos el sistema operativo host. Pero en lugar de un hipervisor , tenemos el motor Docker , en este caso. En este caso, no estamos trayendo todo un sistema operativo invitado con nosotros. Estamos trayendo una capa muy delgada del sistema operativo , y el contenedor puede comunicarse con el sistema operativo host para llegar a la funcionalidad del núcleo allí. Y eso nos permite tener un contenedor muy ligero.

Todo lo que tiene allí es el código de la aplicación y cualquier binario y biblioteca que requiera. Y esos binarios y bibliotecas pueden compartirse en diferentes contenedores si así lo desea. Y lo que esto nos permite hacer es una serie de cosas. Tienen un tiempo de inicio mucho más rápido . No puede soportar una sola VM en unos pocos segundos así. E igualmente, derribarlos tan rápido ... para que podamos escalarlos rápidamente y lo veremos más adelante.

Ingrese la descripción de la imagen aquí

Cada contenedor piensa que se está ejecutando en su propia copia del sistema operativo. Tiene su propio sistema de archivos, registro propio, etc., lo cual es una especie de mentira. En realidad se está virtualizando.



11

He usado Docker en entornos de producción y puesta en escena. Cuando te acostumbres, lo encontrarás muy poderoso para construir un contenedor múltiple y entornos aislados.

Docker ha sido desarrollado en base a LXC (Linux Container) y funciona perfectamente en muchas distribuciones de Linux, especialmente Ubuntu.

Los contenedores Docker son entornos aislados. Puede verlo cuando emite el topcomando en un contenedor Docker que se ha creado a partir de una imagen Docker.

Además de eso, son muy ligeros y flexibles gracias a la configuración de dockerFile.

Por ejemplo, puede crear una imagen Docker y configurar un DockerFile y decir que, por ejemplo, cuando se está ejecutando, luego wget 'this', apt-get 'that', ejecute 'alguna secuencia de comandos de shell', estableciendo variables de entorno, etc.

En proyectos y arquitectura de microservicios, Docker es un activo muy viable. Puede lograr escalabilidad, resistencia y elasticidad con Docker, Docker swarm, Kubernetes y Docker Compose.

Otra cuestión importante con respecto a Docker es Docker Hub y su comunidad. Por ejemplo, implementé un ecosistema para monitorear kafka usando Prometheus, Grafana, Prometheus-JMX-Exporter y Docker.

Para hacer eso, descargué contenedores Docker configurados para zookeeper, kafka, Prometheus, Grafana y jmx-collector y luego monté mi propia configuración para algunos de ellos usando archivos YAML, o para otros, cambié algunos archivos y configuraciones en el contenedor Docker y yo construya un sistema completo para monitorear kafka utilizando Dockers de contenedores múltiples en una sola máquina con aislamiento, escalabilidad y resistencia para que esta arquitectura pueda trasladarse fácilmente a múltiples servidores.

Además del sitio Docker Hub, hay otro sitio llamado quay.io que puede usar para tener su propio panel de imágenes Docker allí y tirar / empujar hacia / desde él. Incluso puede importar imágenes de Docker desde Docker Hub al muelle y luego ejecutarlas desde el muelle en su propia máquina.

Nota: Learning Docker, en primer lugar, parece complejo y difícil, pero cuando te acostumbras, no puedes trabajar sin él.

Recuerdo los primeros días de trabajo con Docker cuando emití los comandos incorrectos o eliminé mis contenedores y todos los datos y configuraciones por error.


6

Así se presenta Docker :

Docker es la compañía que impulsa el movimiento de contenedores y el único proveedor de plataformas de contenedores para abordar todas las aplicaciones en la nube híbrida. Las empresas de hoy están bajo presión para transformarse digitalmente, pero están limitadas por las aplicaciones y la infraestructura existentes al tiempo que racionalizan una cartera cada vez más diversa de nubes, centros de datos y arquitecturas de aplicaciones. Docker permite una verdadera independencia entre las aplicaciones y la infraestructura y los desarrolladores y las operaciones de TI para desbloquear su potencial y crea un modelo para una mejor colaboración e innovación.

Por lo tanto, Docker se basa en contenedores, lo que significa que tiene imágenes y contenedores que se pueden ejecutar en su máquina actual. No incluye el sistema operativo como máquinas virtuales, sino un paquete de diferentes paquetes de trabajo como Java, Tomcat, etc.

Si entiendes los contenedores, obtienes qué es Docker y en qué se diferencia de las máquinas virtuales ...

Entonces, ¿qué es un contenedor?

Una imagen de contenedor es un paquete ligero, independiente y ejecutable de un software que incluye todo lo necesario para ejecutarlo: código, tiempo de ejecución, herramientas del sistema, bibliotecas del sistema, configuraciones. Disponible para aplicaciones basadas en Linux y Windows, el software en contenedores siempre se ejecutará igual, independientemente del entorno. Los contenedores aíslan el software de su entorno, por ejemplo, las diferencias entre los entornos de desarrollo y preparación y ayudan a reducir los conflictos entre los equipos que ejecutan software diferente en la misma infraestructura.

Estibador

Entonces, como puede ver en la imagen a continuación, cada contenedor tiene un paquete separado y se ejecuta en una sola máquina que comparte el sistema operativo de esa máquina ... Son seguros y fáciles de enviar ...


4

Aquí hay muchas buenas respuestas técnicas que discuten claramente las diferencias entre máquinas virtuales y contenedores, así como los orígenes de Docker.

Para mí, la diferencia fundamental entre VM y Docker es cómo gestiona la promoción de su aplicación.

Con las máquinas virtuales, usted promueve su aplicación y sus dependencias de una máquina virtual a la siguiente DEV a UAT a PRD.

  1. A menudo, estas máquinas virtuales tendrán diferentes parches y bibliotecas.
  2. No es raro que varias aplicaciones compartan una VM. Esto requiere administrar la configuración y las dependencias para todas las aplicaciones.
  3. El retroceso requiere deshacer cambios en la VM. O restaurarlo si es posible.

Con Docker, la idea es agrupar su aplicación dentro de su propio contenedor junto con las bibliotecas que necesita y luego promocionar todo el contenedor como una sola unidad.

  1. A excepción del núcleo, los parches y las bibliotecas son idénticos.
  2. Como regla general, solo hay una aplicación por contenedor que simplifica la configuración.
  3. El retroceso consiste en detener y eliminar el contenedor.

Entonces, en el nivel más fundamental con las máquinas virtuales, promueve la aplicación y sus dependencias como componentes discretos, mientras que con Docker promueve todo de una vez.

Y sí, hay problemas con los contenedores, incluida su administración, aunque herramientas como Kubernetes o Docker Swarm simplifican enormemente la tarea.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.