¿Qué son los contenedores (virtualización basada en contenedores o contenedorización)?
Los contenedores son un tipo de software que permite empaquetar y aislar virtualmente aplicaciones para su implementación. Los contenedores agrupan el código y las dependencias de una aplicación, lo que permite que esta se ejecute de forma fiable en cualquier entorno informático.
Los contenedores comparten el acceso al núcleo de un sistema operativo (SO) sin la necesidad tradicional de máquinas virtuales (VM). Pueden utilizarse para ejecutar pequeños microservicios, aplicaciones más grandes o incluso sistemas operativos de contenedores ligeros.
La tecnología de contenedores tiene sus raíces en el particionamiento, que se remonta a la década de 1960, y en el aislamiento de procesos chroot, desarrollado como parte de Unix en la década de 1970. Su forma moderna se expresa en la contenedorización de aplicaciones, como Docker, y la contenedorización de sistemas, como LXC, parte del Proyecto de Contenedores de Linux. Ambos estilos de contenedores permiten al equipo de TI abstraer el código de la aplicación de la infraestructura subyacente, lo que simplifica la gestión de versiones y permite la portabilidad entre diversos entornos de implementación.
Los desarrolladores utilizan contenedores para entornos de desarrollo y prueba. Los equipos de operaciones de TI pueden implementar entornos de producción en vivo en contenedores, que pueden ejecutarse en servidores físicos, máquinas virtuales y la nube.
Cómo funcionan los contenedores
Los contenedores contienen los componentes necesarios para ejecutar el software deseado. Estos componentes incluyen archivos, variables de entorno, dependencias y bibliotecas. El sistema operativo host limita el acceso del contenedor a recursos físicos, como CPU, almacenamiento y memoria, por lo que un solo contenedor no puede consumir todos los recursos físicos del host.
Los archivos de imagen de contenedor son versiones completas, estáticas y ejecutables de una aplicación o servicio que difieren según la tecnología. Las imágenes de Docker, por ejemplo, se componen de varias capas. La primera capa, la imagen base, incluye todas las dependencias necesarias para ejecutar código en un contenedor. Cada imagen tiene una capa de lectura y escritura sobre capas estáticas inmutables. Dado que cada contenedor tiene su propia capa específica que lo personaliza, las capas de imagen subyacentes se pueden guardar y reutilizar en varios contenedores. Asimismo, varias instancias de una imagen pueden ejecutarse simultáneamente en un contenedor, y nuevas instancias pueden reemplazar las que fallan sin interrumpir el funcionamiento de la aplicación.
Una imagen de la Iniciativa de Contenedores Abiertos (OCI, por sus siglas en inglés) se compone de un manifiesto, capas del sistema de archivos y configuraciones. Una imagen OCI tiene dos especificaciones para operar: una especificación de tiempo de ejecución y una de imagen. Las especificaciones de tiempo de ejecución describen el funcionamiento de un paquete de sistema de archivos, que son archivos que contienen todos los datos necesarios para el rendimiento y los tiempos de ejecución. La especificación de imagen contiene la información necesaria para ejecutar una aplicación o servicio en el contenedor OCI.
El motor de contenedores ejecuta imágenes, y muchas organizaciones utilizan un programador de contenedores y tecnología de orquestación, como Kubernetes, para gestionar las implementaciones. Los contenedores ofrecen una alta portabilidad porque cada imagen incluye las dependencias necesarias para ejecutar el código. Por ejemplo, los usuarios de contenedores pueden ejecutar la misma imagen en una instancia en la nube de Amazon Web Services (AWS) durante una prueba y, posteriormente, en un servidor Dell local para producción sin modificar el código de la aplicación en el contenedor.
Contenedores vs. VM
La virtualización es la creación de una versión virtual de algo, como un sistema operativo o un servidor. La virtualización simula la funcionalidad del hardware para crear un sistema virtual abstraído de un sistema host. Este proceso puede utilizarse para operar múltiples sistemas operativos, más de un sistema virtual y diversas aplicaciones en un solo servidor, por ejemplo.

Aunque comparten algunas similitudes básicas, los contenedores y la virtualización se diferencian en que una arquitectura virtualizada emula un sistema de hardware. En la virtualización se utiliza una capa de software, denominada hipervisor, para emular el hardware de CPU, memoria, almacenamiento y recursos de red agrupados, que pueden ser compartidos numerosas veces por varias instancias de máquinas virtuales.
Las VM pueden requerir una sobrecarga considerable de recursos, como memoria, disco y entrada/salida de red, ya que cada una ejecuta un sistema operativo invitado. Esto significa que las VM pueden ser grandes y tardar más en crearse que los contenedores.
Dado que los contenedores comparten el núcleo del sistema operativo, una instancia de este puede ejecutar varios contenedores aislados. Los contenedores que admiten el sistema operativo también pueden ser más pequeños y tener menos funciones que un sistema operativo para una máquina virtual.
A diferencia de la virtualización del hardware subyacente, los contenedores virtualizan el sistema operativo, de modo que cada contenedor individual alberga únicamente la aplicación, sus bibliotecas y dependencias. Los contenedores son más ligeros que las máquinas virtuales, ya que no requieren un sistema operativo invitado.
Contenedores de aplicaciones y contenedores de sistema
Los contenedores de aplicaciones, como Docker, encapsulan los archivos, las dependencias y las bibliotecas de una aplicación para su ejecución en un sistema operativo. Permiten al usuario crear y ejecutar un contenedor independiente para múltiples aplicaciones o servicios que conforman una sola aplicación. Por ejemplo, un contenedor de aplicaciones sería ideal para una aplicación de microservicios, donde cada servicio que la compone se ejecuta de forma independiente.
Los contenedores de sistema, como LXC, son tecnológicamente similares a los contenedores de aplicaciones y a las máquinas virtuales. Un contenedor de sistema puede ejecutar un sistema operativo, de la misma forma que un sistema operativo se ejecutaría encapsulado en una máquina virtual. Sin embargo, los contenedores de sistema no emulan el hardware de un sistema. En cambio, funcionan de forma similar a los contenedores de aplicaciones, y el usuario puede instalar diferentes bibliotecas, lenguajes y bases de datos del sistema.
Beneficios de los contenedores
Los contenedores ofrecen los siguientes beneficios:
- Eficiencia. Dado que los contenedores comparten el mismo kernel del sistema operativo que el host, son más eficientes que las VM, que requieren instancias del sistema operativo independientes.
- Portabilidad. Los contenedores ofrecen mayor portabilidad que otras tecnologías de alojamiento de aplicaciones. Pueden moverse entre cualquier sistema que comparta el tipo de sistema operativo anfitrión sin necesidad de modificar el código. Esta encapsulación del código operativo de la aplicación en el contenedor implica que no hay que gestionar variables de entorno del sistema operativo invitado ni dependencias de bibliotecas.
- Mejoras en memoria, CPU y almacenamiento. Quienes defienden la contenedorización señalan las mejoras en la eficiencia de memoria, CPU y almacenamiento como ventajas clave de este enfoque en comparación con la virtualización tradicional. Dado que los contenedores no tienen la sobrecarga que requieren las VM, como instancias de SO independientes, es posible admitir muchos más contenedores en la misma infraestructura. Un host físico promedio podría admitir docenas de VM o cientos de contenedores. Sin embargo, en operaciones reales, el tamaño del host, el contenedor y la VM es muy variable y está sujeto a las demandas de una o varias aplicaciones específicas.
- Consistencia. Los contenedores son consistentes durante todo el ciclo de vida de la aplicación. Esto fomenta un entorno ágil y facilita nuevos enfoques, como la integración y la entrega continuas (CI/CD). Además, se aceleran más que las VM, lo cual es importante para las aplicaciones distribuidas.
Desventajas de los contenedores
Los contenedores tienen las siguientes desventajas:
- Falta de aislamiento. Una posible desventaja de la contenedorización es la falta de aislamiento del sistema operativo host. Dado que los contenedores comparten un sistema operativo host, las amenazas de seguridad tienen acceso más fácil a todo el sistema en comparación con la virtualización basada en hipervisor. Una estrategia para abordar este problema de seguridad ha sido crear contenedores desde un sistema operativo que se ejecuta en una VM. Este enfoque garantiza que, si se produce una brecha de seguridad a nivel de contenedor, el atacante solo pueda acceder al sistema operativo de esa VM, no a otras VM ni al host físico.
- Falta de flexibilidad del sistema operativo. En implementaciones típicas, cada contenedor debe usar el mismo sistema operativo que el sistema operativo base, mientras que las instancias de hipervisor ofrecen mayor flexibilidad. Por ejemplo, un contenedor creado en un host basado en Linux no podría ejecutar una instancia del sistema operativo Windows Server ni aplicaciones diseñadas para ejecutarse en Windows Server.
- Dificultad para supervisar la visibilidad. Con cientos o más contenedores ejecutándose en un servidor, puede resultar difícil ver qué sucede en cada uno.
Diversas tecnologías de contenedores y otros proveedores, así como proyectos de código abierto, están disponibles y en desarrollo para abordar los desafíos operativos de los contenedores. Estas incluyen sistemas de seguimiento de seguridad, sistemas de monitorización basados en datos de registro, así como orquestadores y programadores que supervisan las operaciones.
Usos comunes de los contenedores
Los contenedores frecuentemente se combinan con microservicios y la nube, pero también ofrecen beneficios a las aplicaciones monolíticas y a los centros de datos locales.
Los contenedores están bien adaptados para trabajar con microservicios. Cada servicio que compone la aplicación se empaqueta en un contenedor escalable de forma independiente. Por ejemplo, una aplicación de microservicios puede estar compuesta por servicios en contenedores que generan alertas, registran datos, gestionan la identificación de usuarios y ofrecen muchos otros servicios.
Cada servicio opera en el mismo sistema operativo, manteniéndose aislado individualmente. Cada servicio puede escalar verticalmente para responder a la demanda. La infraestructura en la nube está diseñada para un escalamiento elástico e ilimitado.
Las arquitecturas tradicionales de aplicaciones monolíticas están diseñadas para que todo el código de un programa se escriba en un único archivo ejecutable. Las aplicaciones monolíticas no escalan fácilmente como las distribuidas, pero sí pueden contenerizarse. Por ejemplo, el programa Docker Modernize Traditional Applications ayuda a los usuarios a migrar aplicaciones monolíticas a contenedores Docker tal cual, con adaptaciones para un mejor escalado, o mediante una reconstrucción y reestructuración completas.
Los contenedores también se utilizan para ejecutar aplicaciones en diferentes entornos. Dado que todo el código y las dependencias de una aplicación están incluidos en el contenedor, los desarrolladores pueden adaptar la aplicación sin necesidad de rediseñarla para que funcione en un nuevo entorno. Si es necesario realizar cambios, las aplicaciones contenedorizadas podrían solo necesitar una refactorización de código, donde solo se deben reestructurar pequeños segmentos del código.
Proveedores de plataformas y herramientas de contenedores
Numerosos proveedores ofrecen plataformas de contenedores y herramientas de gestión de contenedores, como servicios en la nube y orquestadores. Docker y Kubernetes son productos reconocidos en el ámbito de la tecnología de contenedores, y estas tecnologías sustentan muchos otros productos.
- Docker es una plataforma de contenedores de aplicaciones de código abierto diseñada para Linux y, más recientemente, para sistemas operativos Windows, Apple y mainframes. Docker utiliza funciones de aislamiento de recursos, como cgroups y kernels de Linux, para crear contenedores aislados. Docker es una empresa homónima fundada para vender productos de alojamiento y gestión de contenedores con soporte empresarial. En noviembre de 2019, la empresa vendió el negocio de Docker Enterprise a Mirantis.
- Kubernetes, el orquestador de contenedores de código abierto creado por Google, se ha convertido en el estándar de facto para la orquestación de contenedores. Organiza los contenedores en pods en nodos, que son los recursos de alojamiento. Kubernetes puede automatizar, implementar, escalar, mantener y operar contenedores de aplicaciones. Numerosos productos se basan en Kubernetes con funciones o soporte adicionales, como Rancher, adquirido por SUSE en diciembre de 2020; Red Hat OpenShift; y Platform9.
- Microsoft ofrece tecnologías de contenedorización, incluyendo Hyper-V y contenedores de Windows Server. Ambos tipos se crean, mantienen y operan de forma similar, ya que utilizan las mismas imágenes de contenedor. Sin embargo, los servicios difieren en el nivel de aislamiento. El aislamiento en los contenedores de Windows Server se logra mediante espacios de nombres, control de recursos y otras técnicas. Los contenedores de Hyper-V proporcionan aislamiento mediante instancias de contenedor que se ejecutan dentro de una VM ligera, lo que convierte al producto en un contenedor de sistema.
- Amazon Elastic Container Service (ECS) es un servicio de computación en la nube de AWS que gestiona contenedores y permite a los desarrolladores ejecutar aplicaciones en la nube sin tener que configurar un entorno para la ejecución del código. Amazon ECS lanza contenedores a través de AWS Fargate o Amazon Elastic Compute Cloud. Sus funciones incluyen programación, integración con Docker, despliegue de contenedores, recuperación automática de contenedores y seguridad de contenedores.
Además de estas, también están disponibles otras herramientas de orquestación de contenedores, como DC/OS de D2iQ –anteriormente Mesosphere– y LXC.
Los principales proveedores de nube también ofrecen diversos productos de contenedores como servicio, como Amazon ECS y Amazon Elastic Kubernetes Service, Google Kubernetes Engine, Microsoft Azure Container Instances , Azure Kubernetes Service e IBM Cloud Kubernetes Service. Los contenedores también pueden implementarse en infraestructuras de nube pública o privada sin necesidad de utilizar productos de contenedores dedicados del proveedor.
El futuro de los contenedores
Las empresas han incrementado gradualmente la implementación de software de contenedores en producción, más allá del desarrollo y las pruebas de aplicaciones. Para la mayoría de las organizaciones, su enfoque se ha centrado en la orquestación de contenedores, y especialmente en Kubernetes, compatible ahora con la mayoría de los proveedores. A medida que las organizaciones consolidan sus procesos y herramientas para las operaciones de TI, buscan un control más granular para supervisar y proteger el contenido de los contenedores.
La adopción de software de contenedores se ha extendido a diversas áreas de TI, desde seguridad hasta redes y almacenamiento. Algunas organizaciones han implementado aplicaciones con estado, como bases de datos y aplicaciones de aprendizaje automático (ML), en contenedores y Kubernetes para garantizar una gestión consistente. Por ejemplo, el ML en contenedores no ralentiza tanto una máquina como el ML sin contenedores y consume menos recursos a lo largo del tiempo.
Algunas organizaciones utilizan contenedores como parte de transformaciones más amplias de agile o DevOps. Un ejemplo es la contenedorización de microservicios en un entorno de CI/CD. Otro uso potencial es extender el uso de contenedores y Kubernetes al borde de la red para implementar y gestionar software de forma remota en diversas ubicaciones y dispositivos.
Es poco probable que los contenedores reemplacen la virtualización de servidores, ya que ambas tecnologías se complementan. Dado que los contenedores se ejecutan en entornos ligeros y las máquinas virtuales consumen más recursos, la virtualización de hardware facilita la gestión de la infraestructura necesaria para los contenedores.
Además de las adquisiciones mencionadas anteriormente, otros grandes proveedores han adquirido startups más pequeñas para reforzar su oferta de cadenas de herramientas. Por ejemplo, Cisco adquirió Portshift –ahora Panoptica– en octubre de 2020, y Red Hat adquirió StackRox en enero de 2021.
Gartner predice que, para 2024, el 15 % de todas las aplicaciones empresariales se ejecutarán en un entorno de contenedores. Esto supone un aumento de más del 10 % desde 2020.