Los contenedores son unidades ejecutables de software donde se empaqueta el código de aplicación, junto con sus bibliotecas y dependencias, de forma común para que se pueda ejecutar en cualquier lugar, ya sea en el escritorio, en la TI tradicional o en la nube.
Para ello, los contenedores aprovechan una forma de virtualización del sistema operativo (SO) donde las características del kernel de SO (por ejemplo, los espacios de nombres y los cgroups de Linux o los silos y los objetos de trabajo de Windows) se pueden utilizar para aislar procesos y controlar la cantidad de CPU, memoria y disco a los que pueden acceder esos procesos.
Los contenedores son pequeños, rápidos y portátiles porque, a diferencia de una máquina virtual, no necesitan incluir un SO invitado en cada instancia y, en su lugar, pueden simplemente aprovechar las características y recursos del SO del host.
Los contenedores aparecieron por primera vez hace décadas con versiones como FreeBSD Jails y AIX Workload Partitions, pero la mayoría de los desarrolladores modernos recuerdan 2013 como el inicio de la era moderna del contenedor con la introducción de Docker.
Para entender mejor lo que es un contenedor, veamos en qué se diferencia de una máquina virtual (VM) tradicional. En la virtualización tradicional, ya sea en local o en la nube, se utiliza un hipervisor para virtualizar el hardware físico. Cada máquina virtual contiene un sistema operativo invitado, una copia virtual del hardware que el sistema operativo necesita para ejecutarse, junto con una aplicación y sus bibliotecas y dependencias asociadas.
En lugar de virtualizar el hardware subyacente, los contenedores virtualizan el sistema operativo (normalmente Linux) para que cada contenedor individual contenga únicamente la aplicación y sus bibliotecas y dependencias. La ausencia del sistema operativo invitado es la razón por la cual los contenedores son tan ligeros y, por lo tanto, rápidos y portátiles.
Para profundizar en esta comparación, consulte "Contenedores frente a máquinas virtuales: ¿en qué se diferencian?"
La ventaja principal de los contenedores, especialmente en comparación con una VM, es que proporcionan un nivel de abstracción que los hace ligeros y portátiles. Sus principales ventajas incluyen:
Ligeros: los contenedores comparten el kernel del SO de la máquina, lo que elimina la necesidad de una instancia de SO completa por aplicación y permite que los archivos de contenedor sean pequeños y utilicen pocos recursos. Su tamaño más pequeño, especialmente en comparación con las máquinas virtuales, implica que pueden iniciarse rápidamente y dar un mejor soporte a las aplicaciones nativas en la nube que se escalan horizontalmente.
Portátiles e independientes de la plataforma: los contenedores llevan todas sus dependencias con ellos, lo que significa que el software puede escribirse una vez y, a continuación, ejecutarse sin necesidad de reconfigurarse en los portátiles, en entornos informáticos en local y en la nube.
Dan soporte a un desarrollo y una arquitectura modernos: gracias a la combinación de portabilidad y coherencia de despliegue entre plataformas y su pequeño tamaño, los contenedores son una solución ideal para el desarrollo moderno y los patrones de aplicación como, por ejemplo, DevOps, sin servidor y microservicios que se crean como despliegues de código normales en pequeños incrementos.
Mejora la utilización: al igual que las máquinas virtuales antes que ellos, los contenedores permiten a los desarrolladores y operadores mejorar la utilización de la CPU y la memoria de las máquinas físicas. Donde los contenedores van aún más lejos es en que, gracias a su arquitectura de microservicios, los componentes de aplicación se pueden desplegar y escalar de forma más granulada, una alternativa atractiva a tener que escalar una aplicación monolítica completa porque un componente tenga problemas con la carga.
En una encuesta reciente de IBM (PDF, 1,4 MB), los desarrolladores y los ejecutivos de TI destacaron muchas otras ventajas de los contenedores.
Descargue el informe completo: Contenedores en la empresa (PDF, 1,4 MB)
Los contenedores son cada vez más predominantes, especialmente en entornos en la nube. Muchas organizaciones incluso están considerando los contenedores para sustituir a las máquinas virtuales como plataforma informática general para sus aplicaciones y cargas de trabajo. No obstante, en este ámbito general, hay casos de uso clave donde los contenedores son especialmente relevantes.
El software debe diseñarse y empaquetarse de forma diferente para poder aprovechar los contenedores, un proceso que se conoce normalmente como contenerización.
Cuando se conteneriza una aplicación, el proceso incluye el empaquetado de la aplicación con sus variables de entorno, archivos de configuración, bibliotecas y dependencias de software relevantes. El resultado es una imagen de contenedor que puede ejecutarse en una plataforma de contenedor.
Orquestación de contenedores con Kubernetes
A medida que las empresas empezaron a adoptar el uso de contenedores (a menudo como parte de arquitecturas modernas y nativas en la nube), la simplicidad del contenedor individual comenzó a chocar con la complejidad de gestionar cientos (incluso miles) de contenedores en un sistema distribuido.
Para resolver este reto, surgió la orquestación de contenedores como una forma de gestionar grandes volúmenes de contenedores en su ciclo de vida, lo que incluye:
Aunque se crearon muchas plataformas de orquestación de contenedores (como Apache Mesos, Nomad y Docker Swarm), Kubernetes, un proyecto de código abierto introducido por Google en 2014, se convirtió rápidamente en la plataforma de orquestación de contenedores más popular, y es la que la mayoría de la industria ha estandarizado.
Kubernetes permite a los desarrolladores y operadores declarar un estado deseado de su entorno de contenedores global mediante archivos YAML. A continuación, Kubernetes hace todo el trabajo duro para establecer y mantener ese estado, con actividades que incluyen el despliegue de un número especificado de instancias de una determinada aplicación o carga de trabajo, el reinicio de esa aplicación si falla, el equilibrio de carga, el escalado automático, despliegues de tiempo de inactividad cero, etc.
Kubernetes ahora está operado por Cloud Native Computing Foundation (CNCF), que es un grupo industrial independiente de proveedores bajo la supervisión de Linux Foundation.
El siguiente vídeo describe cómo funciona Kubernetes:
A medida que los contenedores continúan ganando fuerza como la forma más popular de empaquetar y ejecutar aplicaciones, el ecosistema de herramientas y proyectos diseñados para consolidar y expandir los casos de uso de la producción sigue creciendo. Más allá de Kubernetes, dos de los proyectos más conocidos en el ecosistema de contenedores son Istio y Knative.
Istio
Como los desarrolladores utilizan los contenedores para construir y ejecutar arquitecturas de microservicios, los problemas de gestión van más allá de las consideraciones del ciclo de vida de los contenedores individuales e incluyen la forma en la que grandes cantidades de servicios pequeños (a menudo conocidos como una "malla de servicios") se conectan y se relacionan entre sí. Istio se creó para facilitar a los desarrolladores la gestión de los retos asociados al descubrimiento, el tráfico, la supervisión, la seguridad, etc.
Knative
Las arquitecturas sin servidor son también cada vez más populares, especialmente en la comunidad de sistemas nativos en la nube. Knative, por ejemplo, ofrece un valor sustancial con su capacidad de desplegar servicios contenerizados como funciones sin servidor.
En lugar de ejecutarse todo el tiempo y responder cuando sea necesario (como lo hace un servidor), una función sin servidor puede "escalarse a cero", lo que significa que no se ejecuta en absoluto a menos que se invoque. Este modelo permite ahorrar grandes cantidades de potencia cuando se aplica a decenas de miles de contenedores.
El siguiente vídeo incluye una explicación más detallada de Knative:
Red Hat OpenShift on IBM Cloud aprovecha OpenShift en entornos públicos e híbridos para incrementar la velocidad, la capacidad de respuesta del mercado, la escalabilidad y la fiabilidad.
Con IBM Cloud Satellite, puede lanzar servicios en la nube coherentes en cualquier lugar: en local, en el borde y en entornos de nube pública.
Ejecute imágenes de contenedor, trabajos por lotes o código fuente como cargas trabajo sin servidor, sin necesidad de dimensionamiento, despliegue, conexión en red o escalado.
IBM Cloud Container Registry ofrece un registro privado que le permite gestionar sus imágenes y supervisarlas para detectar problemas de seguridad.