Contenedores

¿Qué es un contenedor de Linux?

Un contenedor de Linux® es un conjunto de procesos que están separados del resto del sistema, que se pueden ejecutar desde una imagen diferente que proporciona todos los archivos necesarios para dar soporte a los procesos. Al proporcionar una imagen que contiene todas las dependencias de una aplicación, es portátil y consistente mientras cambia de la etapa de desarrollo a la de prueba y, finalmente, a la de producción.

What is a container

Para decirlo de otra manera, imagine que debe desarrollar una aplicación. Usted hace su trabajo en una computadora portátil y su entorno tiene una configuración específica. Otros desarrolladores pueden tener configuraciones un poco diferentes. La aplicación que está desarrollando se basa en esa configuración y depende de archivos específicos. Mientras tanto, su empresa tiene entornos de prueba y producción que están estandarizados con sus propias configuraciones y sus propios conjuntos de archivos que soportan. Quiere emular esos entornos tanto como sea posible hacerlo de forma local, pero sin los gastos de recrear los entornos del servidor. Entonces, ¿cómo logra hacer que su aplicación funcione en estos entornos, apruebe el control de calidad y se implemente su aplicación sin demasiadas dificultades, sin reescribirla y tener que solucionar los problemas? La respuesta: contenedores. El contenedor que incluye su aplicación tiene las configuraciones necesarias (y los archivos necesarios) para que pueda cambiarlo de la etapa de desarrollo a la de prueba y a la de producción sin ninguno de los efectos adversos. Si se evita la crisis, todos son felices.

Este es un ejemplo sencillo, pero los contenedores de Linux se pueden aplicar a los problemas de muchas formas diferentes, en las que se requiere lo más avanzado en portabilidad, capacidad de configuración y aislamiento. Sin importar la infraestructura (in situ, en la nube o un híbrido de ambas), los contenedores satisfacen la demanda.

¿No sería esto solo virtualización?

Sí y no. A continuación encontrará una forma sencilla de pensar en ambos aspectos:

  • La virtualización permite que varios sistemas operativos se ejecuten simultáneamente en un solo sistema.
  • Los contenedores comparten el mismo kernel del sistema operativo y aíslan los procesos de las aplicaciones del resto del sistema.

virtualization vs containers

¿Qué significa esto? Para principiantes, el tener múltiples sistemas operativos ejecutándose en un hipervisor (el software que hace que la virtualización funcione) no es tan ligero como usar contenedores. Cuando se cuenta con recursos limitados con capacidades limitadas, se necesitan aplicaciones ligeras que puedan implementarse densamente. Los contenedores de Linux se ejecutan desde el sistema operativo simple y lo comparten con todos los contenedores para que sus aplicaciones y servicios se mantengan ligeros y se ejecuten en paralelo con prontitud.


Una breve historia sobre contenedores

Evolution of containers download button

La idea de lo que ahora llamamos "tecnología de contenedores" apareció por primera vez en el año 2000 como FreeBSD jail, una tecnología que permite el particionamiento de un sistema FreeBSD en múltiples subsistemas o jails (jaulas). Las jaulas se desarrollaron como entornos seguros que un administrador de sistemas podía compartir con múltiples usuarios dentro o fuera de una organización. En una jaula, el objetivo era que los procesos se crearan en un entorno chroot modificado, en el que el acceso al sistema de archivos, a las redes y a los usuarios está virtualizado y no puede dejar de depender o comprometer a todo el sistema. Las jaulas tenían una implementación limitada, pero finalmente se descubrieron los métodos para salir del entorno de jaulas.

El concepto era convincente.

En 2001, la implementación de un entorno aislado se introdujo en Linux, a través del proyecto VServer de Jacques Gélinas. Como Gélinas señala, este fue un intento de ejecutar "varios servidores Linux de uso general [sic] en una sola caja con un alto grado de independencia y seguridad". Una vez que esta base se estableció para múltiples espacios de usuarios controlados en Linux, las piezas comenzaron a armar el rompecabezas de lo que hoy es un contenedor de Linux.

Los contenedores se hacen más prácticos

De forma muy rápida, cada vez se combinan más tecnologías para hacer que este enfoque aislado sea una realidad. Los grupos de control (cgroups) son una función kernel que controla y limita el uso de recursos para un proceso o grupo de procesos. Además, los cgroups utilizan systemd, un sistema de inicialización que configura el espacio de usuario y gestiona sus procesos, para proporcionar un mayor control de estos procesos aislados. Ambas tecnologías, que añaden más control a Linux, también fueron el marco para determinar si los entornos fueron exitosos al permanecer separados.

Los avances realizados con los espacios de nombres proporcionaron el próximo paso para los contenedores. Los espacios de nombres de usuarios "permiten asignaciones por espacio de nombre de usuario y grupos de id. En el contexto de los contenedores, esto significa que los usuarios y los grupos pueden tener privilegios para ciertas operaciones dentro del contenedor sin tener esos privilegios fuera del contenedor". Esto es similar al concepto de una jaula, pero con la seguridad agregada de mayor aislamiento de los procesos, en lugar del concepto de jaula de un entorno modificado.

El proyecto de contenedores de Linux (LXC) añadió entonces algunas de las herramientas, plantillas, bibliotecas y enlaces entre lenguajes necesarios para estos avances, lo que mejora la experiencia del usuario al usar contenedores.

Entra Docker

En el 2008, Docker apareció en escena (mediante dotCloud) con su tecnología para contenedores del mismo nombre. La tecnología Docker combina el trabajo de LXC con herramientas mejoradas para desarrolladores, lo que facilita el uso de contenedores. Docker, una tecnología de open source, es actualmente el proyecto y el método más conocido para implementar y administrar los contenedores de Linux.

En la actualidad, Red Hat y Docker, entre otros, son miembros de la Iniciativa Open Container (OCI), para trabajar en pro de una estandarización del sector abierta de tecnologías de contenedor.


La estandarización y la Iniciativa Open Container

La Iniciativa Open Container (OCI), que es parte de Linux Foundation, fue lanzada en 2015 "con el propósito expreso de crear estándares abiertos del sector para los formatos y el tiempo de ejecución de los contenedores". Este proyecto está enfocado en determinar y establecer especificaciones, que actualmente son dos: tiempo de ejecución e imagen.

La especificación de tiempo de ejecución establece estándares abiertos en relación con un paquete de sistemas de archivos, la estructura de los archivos de soporte y los artefactos en un contenedor, y cómo ese paquete es desempaquetado por un tiempo de ejecución compatible. Básicamente, la especificación existe para garantizar que los contenedores funcionen de la forma prevista y que todos los activos de soporte estén disponibles y en el lugar correcto.

La especificación de imagen de OCI define cómo se crean las imágenes de contenedor. Esta creación da como resultado "un manifiesto de imagen, una serialización de sistema de archivos y una configuración de imagen".

Estas especificaciones funcionan en conjunto para definir lo que contiene una imagen de contenedor y sus dependencias, entornos, argumentos, etc., necesarios para que la imagen se ejecute correctamente.


Los contenedores son una abstracción

Los contenedores de Linux son otro paso en la evolución sobre cómo desarrollamos, implementamos y administramos las aplicaciones. Las imágenes de contenedores de Linux proporcionan portabilidad y control de versión, lo que permite garantizar que lo que funciona en el portátil del desarrollador también funciona en la producción.

Un contenedor de Linux en ejecución tiene un uso menos intensivo de los recursos que una máquina virtual, pero retiene mucho del aislamiento de las aplicaciones y se administra más fácilmente como parte de una aplicación mayor.

La cuestión de los contenedores de Linux es poder desarrollar más rápido y satisfacer las demandas de las empresas a medida que surgen, más que el software que se utiliza para hacer ese trabajo. No debe limitarse a pensar que los contenedores solo retienen una aplicación única; los contenedores se pueden aplicar para retener partes de una aplicación o servicios. Entonces puede utilizar otras tecnologías, como Kubernetes, para automatizar y orquestar sus aplicaciones en contenedores. Un contenedor alberga la lógica de la aplicación, un tiempo de ejecución y las dependencias, para que el contenedor pueda incluir todo, o bien, puede crear una aplicación que comprima varios contenedores que funcionen como microservicios.


Los contenedores en los entornos de producción

Los contenedores son una excelente manera de entregar software y aplicaciones a sus clientes más rápido. Esto supone utilizarlos en los entornos de producción. Y esto conlleva mayor participación de los procesos que se ejecutan en esos contenedores.

Afortunadamente, Red Hat está para ayudarlo. Red Hat goza de una larga trayectoria de trabajo en la comunidad de open source para hacer que las tecnologías, por ejemplo, los contenedores, sean seguras, estables y fiables. A esto nos dedicamos. Y luego brindamos soporte para esas tecnologías. Por eso, estamos para ayudarlo si lo necesita.

Las tecnologías de Red Hat eliminan las conjeturas en cuanto a la forma correcta de hacer contenedores. Tanto si se trata de involucrar a sus equipos de desarrollo en una plataforma creada pensando en los contenedores, de ejecutar su infraestructura de contenedores en un sistema operativo de primera categoría, o de ofrecer soluciones de almacenamiento para la gran cantidad de datos que generan los contenedores, las soluciones Red Hat le brindan cobertura.

Hay mucho más para hacer con los contenedores