¿Qué es un contenedor?

Respuestas:

18

Lo primero que debe saber sobre un contenedor es:

Es, ante todo, un proceso.

Una vez que se entiende eso, uno puede comenzar a comprender cómo los contenedores se comparan y contrastan con las máquinas virtuales. Los contenedores y las máquinas virtuales comparten el aislamiento de sus hosts. El método de aislamiento es la diferencia crítica.

Los procesos de contenedor usan extensiones para el host del núcleo del sistema operativo en el que se ejecutan para aislarse de otros procesos. Otras extensiones también proporcionan aislamiento de disco y recursos. Los contenedores comparten su núcleo y memoria con el sistema operativo host.

Las máquinas virtuales usan un hipervisor para aislar máquinas virtuales de sus hosts. Esta es una capa de software que envía solicitudes de recursos de "invitados" (VM) al hardware. El aislamiento del disco lo proporciona la virtualización del disco. Las máquinas virtuales no comparten un núcleo con el host: cargan sus propios núcleos en el espacio de memoria dedicado a la máquina virtual.

Un impacto importante de esta diferencia es que un contenedor debe ser compatible con el núcleo de su host. Por ejemplo, no es posible ejecutar un contenedor basado en Windows Nano Server en un host de Linux o un contenedor de Ubuntu directamente en un host de Windows. Las máquinas virtuales, por el contrario, pueden ejecutar cualquier núcleo independientemente del sistema operativo host. Al ejecutar un contenedor de Linux en un host de Windows, Docker ejecuta el contenedor en una VM de Linux.

Las diferencias operativas están en la agilidad: los contenedores comienzan y se detienen casi tan rápido como un proceso normal. Las máquinas virtuales son "más pesadas" y requieren recursos dedicados destinados a ellas y tardan más en iniciarse y apagarse.

Los contenedores ofrecen mucha flexibilidad a un modelo operativo DevOps:

  • Los contenedores aíslan las dependencias de los componentes de software. Los desarrolladores pueden usar contenedores para garantizar que un módulo de aplicación funcione tan bien en sus máquinas de desarrollo como en QA / UA / Production
  • Los contenedores usan redes definidas por software para comunicarse
  • Las definiciones de contenedor son declarativas y pueden controlarse en origen
  • Los sistemas de administración de contenedores (Kubernetes, DC / OS, Swarm) pueden administrar grupos de recursos de hardware (cómputo / RAM / almacenamiento) y escalar contenedores dinámicamente
Dave Swersky
fuente
1
También hago sus 3 últimos puntos en vSphere, gracias a vagabundo :)
Tensibai
8

La palabra contenedor se refiere a una tecnología de virtualización liviana disponible en los núcleos modernos de Linux, esta tecnología es muy similar a las cárceles de FreeBSD.

Un kernel de Linux más antiguo, no apto para contenedores, puede ejecutar procesos simultáneamente. Algunos atributos del sistema son privados de procesar, como el entorno del proceso o la memoria del proceso: solo el proceso que posee estos atributos y el propio sistema operativo pueden acceder a estos datos. (Hay muchas lagunas, como algunas implementaciones de ps , ¡pero eso es esencialmente cierto!) Algunos otros atributos se comparten entre los procesos, como el sistema de archivos y las interfaces de red, por ejemplo.

Un kernel de Linux moderno y apto para contenedores puede manejar más atributos del sistema como datos privados asociados a un proceso o grupo de procesos. El contexto resultante es un contenedor y, en lugar de ejecutar un programa en los "contenedores iniciales" utilizando el sistema de archivos y las interfaces de red inicializadas por el sistema operativo, es posible ejecutar procesos en otros contenedores, para que vean un sistema de archivos diferente y un lista diferente de interfaces de red. Por lo tanto, dos procesos que se ejecutan en contenedores distintos solo comparten el núcleo. Quizás esté familiarizado con el comando chroot que puede ejecutar un proceso en una jerarquía de archivos distinta, los contenedores llevan la idea un paso más allá.

Por supuesto, esta es solo una explicación muy burda, pero espero que ayude a aclarar la idea de qué son los contenedores. Ahora, ¿para qué sirven?

Docker implementa una interfaz popular para las capacidades de contenedor de los núcleos de Linux , una utilidad de línea de comandos que se puede usar para producir artefactos que representan sistemas de archivos ( imágenes de docker ) y ejecutar procesos en contenedores donde estos sistemas de archivos son accesibles. Este paquete de software también puede construir sistemas de redes virtuales ad-hoc para permitir que varios contenedores se comuniquen en una red privada.

Las tecnologías basadas en contenedores son convenientes para:

  • Describir implementaciones complejas escalables .
  • Proporcione a los desarrolladores de aplicaciones un entorno muy similar al entorno de producción.
  • Implemente un patrón de servidor inmutable, ya que los artefactos de software generalmente describen un sistema operativo completo, no solo un paquete de aplicación.

(Como parece familiarizado con otras tecnologías de virtualización como Virtual Box, puede observar que estas tecnologías también pueden abordar convenientemente los tres puntos anteriores. Hoy en día, existe un espectro bastante pequeño de tecnologías de virtualización, y podemos comparar la cuestión de su popularidad en ciertos contextos con la popularidad de los lenguajes de computadora: probablemente depende de los méritos técnicos de cada solución individual, pero también de muchos factores que simplemente denominaré "oportunidad".)

Michael Le Barbier Grünewald
fuente
1
Ya no se limita a Linux, Windows 16 tiene el mismo tipo de habilidad
Tensibai el
1
Enlace para respaldar mi reclamo docs.microsoft.com/en-us/virtualization/windowscontainers/…
Tensibai
7

Por lo general, los contenedores se refieren a algo como los contenedores acoplables que han popularizado el nombre

Cito allí de la definición de docker:

Usando contenedores, todo lo necesario para ejecutar un software se empaqueta en contenedores aislados. A diferencia de las máquinas virtuales, los contenedores no incluyen un sistema operativo completo, solo se necesitan bibliotecas y configuraciones necesarias para que el software funcione.

La denominación de raíz proviene de los contenedores de Linux (lxc) cuyo objetivo era aislar un proceso de su sistema host, el primer objetivo era evitar comprometer el proceso para hacerse cargo del sistema host.

Ahora se usan en un ámbito más amplio. En una definición moderna de 'contenedor', lanzará más o menos un paquete para el tiempo de ejecución que ya incluye su aplicación, es middleware subyacente si es necesario y todas las bibliotecas necesarias y asegúrese de que se ejecutará en cualquier sistema compatible.

La segunda ventaja es que permite utilizar múltiples aplicaciones con la misma dependencia en diferentes versiones sin tener que modificar mucho sus variables de entorno para que cargue la correcta.

Poco probable para un sistema VM como una máquina virtual de caja virtual o una instancia EC2 en AWS, los contenedores son virtuales solo en el nivel del sistema de archivos y aislados solo en la pila de memoria. Todavía comparten el mismo host y el sistema operativo bajo ellos arbitrará los ticks de la CPU.

Una máquina virtual es virtual a nivel de hardware, y ejecuta un sistema operativo dentro, un contenedor es virtual a nivel de sistema operativo y ejecuta un proceso dentro.

Tensibai
fuente
1
Hm, entonces algo como una imagen VirtualBox (o como se llame en VirtualBox) también podría calificar como un "contenedor", ¿o no lo entiendo?
Pierre.Vriens
Vi que había olvidado una parte de la pregunta, agregué la diferencia mientras extendía la respuesta.
Tensibai
3

De la definición de AWS :

Los contenedores son un método de virtualización del sistema operativo que le permite ejecutar una aplicación y sus dependencias en procesos aislados de recursos. Los contenedores le permiten empaquetar fácilmente el código, las configuraciones y las dependencias de una aplicación en bloques de construcción fáciles de usar que brindan consistencia ambiental, eficiencia operativa, productividad del desarrollador y control de versiones. Los contenedores pueden ayudar a garantizar que las aplicaciones se implementen de manera rápida, confiable y consistente, independientemente del entorno de implementación. Los contenedores también le brindan un control más granular sobre los recursos, lo que mejora la eficiencia de su infraestructura.

Contenedor es empacar todas las necesidades esenciales necesarias para realizar una tarea / entorno particular, de modo que sea autosuficiente y pueda ejecutarse en cualquier plataforma, lo que quita mucho dolor a la hora de configurar e instalar cosas.

Dawny33
fuente