Contenedor virtual (software)


Contenedor virtual (software)
Información sobre la plantilla
Contenedor virtual.png
CreadorSolomon Hykes
DesarrolladorDocker, Inc.
Fecha de Creación13 de marzo 2013
Última versión establedescargar última versión
Plataformas soportadasx86-64, ARM, MIPS, ppc64le y s390x
Sistemas Operativos compatiblesLinux, Windows y macOS
LicenciaApache License 2.0
Sitio web
URL

Un contenedor virtual o contenedor de software [1] es una tecnología que proporciona una capa adicional de abstracción y automatización de virtualización de aplicaciones en múltiples sistemas operativos. La misma proporción, entre otros beneficios, el aislamiento de recursos de tal forma que se hace posible que diferentes contenedores sean independientes en importantes aspectos (que permiten aplicaciones independientes) aunque sí emplean recursos comunes del sistema operativo en el que ejecutan. El soporte del kernell o núcleo del sistema operativo para los espacios de nombres aísla la vista que tiene una aplicación de su entorno operativo, incluyendo árboles de proceso, red, ID de usuario y sistemas de archivos montados, mientras que por otro lado el mismo proporciona aislamiento de recursos, incluyendo la CPU, la memoria, el bloque de E/S y de la red. Todo esto manteniendo el uso compartido de muchas facilidades y servicios que brinda el Kernel o núcleo y logrando con ello un entorno de virtualización más eficiente que el aportado por el sistema tradicional de máquinas virtuales.

Virtualización basada en hipervisores

Figura 1a. Hypervisor de Tipo 1[2]
Figura 1b. Hypervisor de Tipo 2[2]

Para visualizar más claramente lo antes mencionado es apropiado analizar cómo es la estructura funcional de un sistema que implementa la virtualización [3] con máquinas virtuales como el mostrado en las figuras 1a y 1b. Donde se representan tres máquinas virtuales ejecutándose sobre un sistema operativo huésped. Estas máquinas posen su propio sistema operativo y son independientes entre sí. Asimismo se emplea un elemento de software conocido como hipervisor (‘’Virtual Machine Monitor’’ ó ‘’VMM’’) [4] y que tiene sus raíces ya a finales de 1960 y principios de los años 1970 cuando, para reducir costos, se consolidaban varias computadoras aisladas o independientes en una sola y más grande conocida como mainframe. El hipervisor es una capa de software destinado a realizar una virtualización de hardware sobre el propio hardware físico con el fin de lograr emplear simultáneamente diferentes sistemas operativos. Existen dos tipos de hipervisores básicos. Son los mostrados en la figuras 1a y 1b y conocidos como hypervisor tipo 1 (‘’bare metal’’ o ‘’nativo’’) e hipervisor tipo 2 (ḧipervisor hospedado). También existen otros conocidos como ‘’hibridos’’. Ejemplos del tipo 1 son: Xen, Kernel-based Virtual Machine (KVM), Microsoft Hyper-V, VMware ESXi y Oracle VM Server. Ejemplos del tipo 2 son: VMware Workstation, VirtualBox, VMware Player, QEMU y Bhyve. Los hipervisores pueden ofrecer diferentes formas de implementar la virtualización. Las mismas son:

  • Virtualización completa, Virtualización de hardware o Virtualización nativa. El hipervisor simula un hardware suficiente para permitir un sistema operativo no adaptado que es ejecutado de forma aislada. Ejemplos: VMware Workstation, VMware ESXi, VMware vSphere, Virtualbox, Kernel-based Virtual Machine (KVM). Microsoft Hyper-V, Microsoft Virtual Server y Xen.
  • Virtualización parcial o paravirtualización. El hipervisor en este caso ofrece un interfaz especial para acceder a los recursos del hardware físico. Por esta razón el sistema operativo de la máquina virtual tiene que ser uno especialmente modificado o adaptado para ser empleado exitosamente.
  • Emulación. El hipervisor en esta variante logra imitar o suplantar con el hardware real que posee la computadora huésped. Ejemplos: Bochs (emula CPU's, dispositivos de E/S y BIOS), QEMU (emula un sistema operativo dentro de otro), Microsoft Virtual PC.

Virtualización basada en contenedores

En este tipo de virtualización sobre el núcleo o kernel del sistema operativo se ejecuta una capa de virtualización que permite que existan múltiples instancias aisladas de espacios de usuario, en lugar de solo uno. Estas instancias se conocen como contenedores, y su funcionalidad resulta ser análoga a la de un sistema operativo real, independiente. Existen diversas variantes de contenedores. De ellas una muy popular es la denominada Docker. La misma surgió en el 2013 y se caracteriza porque logra gestionar el ciclo de vida de los contenedores de forma sencilla y eficaz. Hay que destacar que aunque es posible implementar la gestión de contenedores a nivel de comandos y terminales, se han creado para facilitar la gestión de contenedores los denominados Orquestadores de contenedores”. Los contenedores como Docker permiten empaquetar y distribuir aplicaciones y con ello adoptar una arquitectura de microservicios. Así puede ocurrir que esta arquitectura en algunos sistemas sea compleja y difícil de gestionar de manera no automática y por ello se han desarrollado los orquestadores de contenedores. Los mismos permiten:

  • Automatizar el despliegue de aplicaciones.
  • Gestionar la escalabilidad de aplicaciones y operaciones de mantenimiento.
  • Gestionar y asignar los recursos disponibles del sistema.
  • Balancear la carga.
  • Monitorizar el estado de los contenedores.

Docker como contenedor

Docker [2] utiliza características de aislamiento de recursos del kernel Linux, tales como cgroups y espacios de nombres (namespaces) para permitir que "contenedores" independientes se ejecuten dentro de una sola instancia de Linux, evitando la sobrecarga de iniciar y mantener máquinas virtuales.[5]

El soporte del kernel Linux para los espacios de nombres aísla la vista que tiene una aplicación de su entorno operativo,[6] incluyendo árboles de proceso, red, ID de usuario y sistemas de archivos montados, mientras que los cgroups del kernel proporcionan aislamiento de recursos, incluyendo la CPU, la memoria, el bloque de E/S y de la red. Desde la versión 0.9, Docker incluye la biblioteca libcontainer como su propia manera de utilizar directamente las facilidades de virtualización que ofrece el kernel Linux, además de utilizar las interfaces abstraídas de virtualización mediante libvirt, LXC (Linux Containers) y systemd-nspawn.[7][8][9]

De acuerdo con la firma analista de la industria 451 Research, "Docker es una herramienta que puede empaquetar una aplicación y sus dependencias en un contenedor virtual que se puede ejecutar en cualquier servidor Linux. Esto ayuda a permitir la flexibilidad y portabilidad en donde la aplicación se puede ejecutar, ya sea en las instalaciones físicas, la nube pública, nube privada, etc."[10]

Funcionamiento

Docker puede utilizar diferentes interfaces para acceder a las capacidades de virtualizacion del kernel Linux.[9]

Docker implementa una API de alto nivel para proporcionar contenedores livianos que ejecutan procesos de manera aislada.[11]

Construido sobre las facilidades proporcionadas por el kernel Linux (principalmente cgroups y namespaces), un contenedor Docker, a diferencia de una máquina virtual, no requiere incluir un sistema operativo independiente.[10] En su lugar, se basa en las funcionalidades del kernel y utiliza el aislamiento de recursos (CPU, la memoria, el bloque E / S, red, etc.) y namespaces separados para aislar la vista de una aplicación del sistema operativo. Docker accede a la virtualización del kernel Linux ya sea directamente a través de la biblioteca libcontainer (disponible desde Docker 0.9), o indirectamente a través de libvirt, LXC o systemd-nspawn. [9][12]

Mediante el uso de contenedores, los recursos pueden ser aislados, los servicios restringidos, y se otorga a los procesos la capacidad de tener una visión casi completamente privada del sistema operativo con su propio identificador de espacio de proceso, la estructura del sistema de archivos, y las interfaces de red. Contenedores múltiples comparten el mismo núcleo, pero cada contenedor puede ser restringido a utilizar solo una cantidad definida de recursos como CPU, memoria y E / S.

Usar Docker para crear y gestionar contenedores puede simplificar la creación de sistemas altamente distribuidos, permitiendo que múltiples aplicaciones, las tareas de los trabajadores y otros procesos funcionen de forma autónoma en una única máquina física o en varias máquinas virtuales. Esto permite que el despliegue de nodos se realice a medida que se dispone de recursos o cuando se necesiten más nodos, lo que permite una plataforma como servicio (PaaS - Platform as a Service) de estilo de despliegue y ampliación de los sistemas como Apache Cassandra, MongoDB o Riak. Docker también simplifica la creación y el funcionamiento de las tareas de carga de trabajo o las colas y otros sistemas distribuidos. [13][14]

Instalación en Ubuntu Linux

La última versión de largo término (LTS) de ubuntu es la Focal Fossa (20.04) [1]. Esta distribución aporta en sus repositorios oficiales la posibilidad de instalar Docker. Por ello el procedimiento de instalación es simple:

Actualización del Ubuntu

  • $ sudo apt update
  • $ sudo apt upgrade

Con la introducción secuencial de estos dos comandos se logra actualizar el sistema a partir de la conectividad a algún repositorio de Ubuntu.

Instalación en modo consola

  • $ sudo apt-get install docker.io Uso del comando apt para installar docker
  • $ sudo systemctl enable –now docker Habilitación o inicio de docker y configuración para que inicie despues de un reinio o comienzo del sistema operativo
  • $ sudo usermod -aG docker USUARIO USUARIO: nombre del usuario Linux. Con el comando se le da acceso al USUARIO al grupo de usuarios Docker
  • REINICIO del sistema o del usuario.

Verificación de la instalación

$ docker --version Con este comando la respuesta debe ser análoga a la siguiente: Docker version 19.03.8, build afacb8b7f0 Por supuesto los datos que devuelve dependen de la versión de docker instalada. Docker posee todo un amplio conjunto de comandos que facilitan el manejo de los contenedores y su gestión [15]

Imágenes para crear contenedores

Los dos elementos fundamentales de Docker son las imágenes y los propios contenedores creados con ellas. En su esencia, una imagen es una especie de plantilla, con la que se pueden crear contenedores y en este proceso nunca cambian. Claro que un contenedor puede ser modificado y con él se puede a su vez crear una plantilla. También con una plantilla puede ser creada otra que resultaría ser una versión modificada de la misma. Así dada una imagen “padre” pueden crearse diversas modificadas.

Una imagen dada se personaliza con un identificados numérico (ID) mas una designación alfanumérica. Ejemplo debian:latest. Existen disponibles numerosas imágenes públicas en internet. Las imágenes se hallan almacenadas en registros (Repositorios) que pueden ser locales (creados localmente) o remotos (internet o en redes privadas).[16].

El registro que quizás sea el más empleado públicamente se nombre Dockerhub [2] De este registro es posible no sólo extraer imágenes sino también “subir” imágenes creadas por usuarios. En el caso de que se disponga del acceso al sitio el comando de obtención de una imagen dada es simple: $ docker pull <nombre de la imagen> Ejemplo: $ docker pull debian En este caso se descarga de dockerhub la versión última estable de la distribución debian. Si se desea es posible especificar la variante de la distribución que interese. Por ejemplo: $ docker pull ubuntu:14.04 descarga de dockerhub la versión 14.04 de Ubuntu. Las distribuciones más importantes de Linux mantienen en dockerhub versiones “oficiales” de sus sistemas operativos. Asimismo existen numerosas imágenes compartidas por infinidad de desarrolladores orientadas a servicios específicos. No obstante si no se dispone del acceso antes mencionado se pueden localizar imágenes en diversos sitios de internet. Por ejemplo la imagen “oficial“ de ubuntu se puede descargar (enero 2021) desde: tianon docker-brew-ubuntu-core .

Integración

Docker se puede integrar con diferentes herramientas de infraestructura, como Amazon Web Services,[17] [2]],[18] CFEngine,[19] Chef,[20] Google Cloud Platform,[21] DigitalOcean,[22] IBM Bluemix,[23] Jelastic,[24] Jenkins,[25] Microsoft Azure,[26] OpenStack Nova,[27] OpenSVC,[28] Puppet (software),[29] Salt,[30] y [[3]].[31]

El proyecto Cloud Foundry Diego integra Docker con Cloud Foundry PaaS.[32]

El proyecto GearD tiene como objetivo integrar Docker en el de Red Hat OpenShift. [33]

En respuesta a la disponibilidad de estas integraciones, la plataforma de monitoreo, Datadog, desarrolló un reportaje sobre la tasa de adopción de los servicios de Docker por 7 000 empresas con infraestructuras basadas en la nube.[34][35]

Historia

Solomon Hykes comenzó Docker como un proyecto interno dentro dotCloud,[36] empresa enfocado a una plataforma como un servicio (PaaS),[37] con las contribuciones iniciales de otros ingenieros de dotCloud, incluyendo Andrea Luzzardi y Francois-Xavier Bourlet. Jeff Lindsay también participó como colaborador independiente. Docker representa una evolución de la tecnología patentada de dotCloud, que es a su vez construida sobre proyectos de código abierto anteriores como Cloudlets.

Docker fue liberado como código abierto en marzo de 2013.[11] El 13 de marzo de 2014, con el lanzamiento de la versión 0.9, Docker dejó de utilizar LXC como el entorno de ejecución por defecto y lo reemplazó con su propia biblioteca, libcontainer, escrito en Go.[7][12] El 13 de abril de 2015, el proyecto tenía más de 20 700 estrellas de GitHub (haciéndolo uno de los proyectos con más estrellas de GitHub, en 20ª posición), más de 4 700 bifurcaciones (forks), y casi 900 colaboradores.[38]

Un análisis en 2018 mostró las siguientes organizaciones como las principales contribuyentes de Docker: Red Hat (mayores contribuyentes, aún más que el equipo de Docker en sí), el equipo de Docker, Microsoft, IBM, Google, Cisco Systems y Amadeus IT Group.[39]

El 29 de julio de 2020 se dio a conocer la existencia de Doki, un malware que corre en el sistema operativo Linux que tiene por finalidad infectar la API de los contenedores Docker mal configurado. Algunas de sus acciones son las siguientes[40]:

  • Crea URL única con vidas cortas para descargar payloads durante el ataque.
  • Ha sido creado para ejecutar comandos recibidos desde sus operadores.
  • Usa la biblioteca TLS para funciones criptograficas.

Colaboración

  • El 23 de julio de 2013, dotCloud Inc., la entidad comercial detrás de Docker, anunció que el ex CEO de Gluster y Plaxo, Ben Golub se había unido a la compañía, citando Docker como el principal foco de la empresa en adelante.[41]
  • El 23 de julio de 2014, Docker adquirió la Orchard, hacedores de Fig.[44]
  • El 16 de septiembre de 2014, Docker anunció que había completado una ronda de US$ 40 M de la Serie C, liderado por Sequoia Capital.[45]
  • El 15 de octubre de 2014, Microsoft anunció la integración del motor acoplable a la liberación de Windows Server 2016 y soporte nativo para el rol de cliente Docker en Windows.[46][47]
  • El 4 de diciembre de 2014, IBM anunció una alianza estratégica con Docker que permite a las empresas la más eficiente, rápida y rentable generación y ejecución de la próxima generación de aplicaciones en la nube de IBM ("IBM Cloud").[48]
  • El 7 de junio de 2016, HPE (Hewlett Packard Enterprise) anunció una alianza empresarial mundial con Docker que incluye una aproximación conjunta al mercado, venta de soluciones, ingeniería, soporte, servicios e intercambio de conocimientos para ayudar a los clientes a transformar y modernizar sus centros de datos, así como beneficiarse de un entorno de desarrollo más ágil. En el corazón de esta alianza está el programa HPE Docker Ready Server, único en la industria de los servidores, lo que garantiza que los servidores de HPE llevarán acoplado Docker y contarán con soporte comercial.[49]

Véase también

Enlaces externos

Referencias