Digital Developer Conference: Hybrid Cloud 2021 | Capacitaciones gratuitas por expertos y partners | 21 de Setiembre ¡Inscríbete Ahora!

Una breve introducción al mágico mundo de contenedores

Introducción

En este artículo se brindarán las nociones y conceptos básicos para introducir al lector al mundo de contenedores.

Una vez finalizada la lectura, el lector:

  • Conocerá qué es un contenedor y por qué son más eficientes que las máquinas virtuales.

  • Poseerá conocimientos básicos sobre Docker y el proceso de creación de imágenes y contenedores.

  • Será capaz de brindar una definición de Container Registry.

  • Estará familiarizado con el concepto de orquestación de contenedores, así como la plataforma estándar para ello: Kubernetes.

  • Conocerá la el producto Red Hat OpenShift, sus funcionalidades y diferencias con Kubernetes.

¿Qué es un contenedor?

Un contenedor es una unidad ejecutable de software en la que se empaqueta el código de la aplicación, junto con sus librerías y dependencias, para que se pueda ejecutar en cualquier lugar, ya sea en un equipo local, en infraestructura tradicional, en cualquier ambiente de nube, o incluso en entornos de edge computing.

Para hacer esto, los contenedores emplean una forma de virtualización de sistema operativo que permite aislar procesos y controlar la cantidad de CPU, memoria y almacenamiento en disco a los que cada procesos puede acceder. En el caso de Linux, las primitivas de sistema operativo empleadas para ello son los namespaces y cgroups.

Contenedores vs. Máquinas Virtuales

Los contenedores son pequeños, ágiles y portables porque, a diferencia de las Máquinas Virtuales (VMs), no requieren un sistema operativo invitado (Guest OS) en cada instancia, haciendo uso del sistema operativo anfitrión (Host OS).

A continuación, se presenta un diagrama comparativo de contenedores y máquinas virtuales:

comparación de características de Máquinas Virtuales y Contenedores

El servidor que emplea máquinas virtuales está ejecutando tres sistemas operativos: el host, nativo del equipo, y dos sistemas «invitados» o guest, uno por cada instancia de máquina virtual.

El servidor que emplea contenedores por el contrario, en lugar de hacer uso de un Hypervisor y virtualizar el hardware, virtualiza el sistema operativo, ejecutando únicamente su sistema operativo nativo, compartiendo este núcleo con el resto de los contenedores.

Las secciones compartidas del sistema operativo son únicamente «de lectura» y cada contenedor contará con su propio espacio de despliegue, donde poseerá privilegios totales. Este es uno de los motivos fundamentales para afirmar que los contenedores son mucho más ligeros y emplean menos recursos que las máquinas virtuales.

¿Por qué contenedores?

Debido a lo explicado en la sección anterior, los contenedores son más ágiles, pequeños y portables que las máquinas virtuales, por lo que permiten optimizar recursos y ejecutar aplicaciones de forma más eficiente.

En lo que a desarrolladores refiere, los contenedores:

  • Proporcionan un entorno de ejecución limpio, seguro y portable.

  • Permiten desarrollar la aplicación una única vez, y desplegarla en un sinfín de entornos.

  • Hacen posible la ejecución de aplicaciones en contenedores aislados, facilitando el uso de varias versiones de librerías y dependencias.

  • Facilitan la automatización de pruebas, integración y empaquetado de aplicaciones.

  • Reducen o eliminan problemas de incompatibilidad entre plataformas.

Desde el punto de vista de operaciones:

  • Permiten que el ciclo de vida de la aplicación sea más eficiente, consistente y reproducible.

  • Aumentan la calidad del código producido por los desarrolladores.

  • Eliminan inconsistencias entre entornos de desarrollo, prueba y producción.

  • Contribuyen a la alta cohesión y bajo acoplamiento.

  • Poseen una alta compatibilidad con arquitecturas de micro-servicios, procesos DevOps y metodologías ágiles.

  • Mejoran significativamente la velocidad y confiabilidad de la implementación e integración continua (CI/CD).

¿Qué es Docker?

Logo de Docker

Docker es una plataforma de contenedores de código abierto que permite crear y ejecutar contenedores ligeros y portables independientemente del sistema operativo host que se esté empleando. Es la plataforma estándar de la industria y cuenta con más de 11 millones de usuarios y 7 millones de aplicaciones.

Para más información, se recomienda visitar el sitio oficial de Docker.

¿Qué es un Dockerfile?

Para poder ejecutar un contenedor Docker, el primer paso es crear un dockerfile. Un dockerfile es simplemente un archivo de texto que contiene todos los comandos que un usuario llamaría en consola (CLI) para crear y ejecutar la aplicación.

El dockerfile es la materia prima que permite construir una imagen.

Para más información sobre dockerfiles, se recomienda consultar la documentación oficial de Docker.

¿Qué es una imagen?

Una imagen es un archivo inmutable que contiene el código fuente, las librerías y dependencias necesarias para ejecutar la aplicación. Podría considerarse a una imagen como una plantilla de un contenedor.

Se dice que las imágenes son archivos inmutables debido a que son de sólo lectura: si se realizan cambios en la aplicación, se debe crear una nueva imagen. Es por ello que se cuenta con una capa de escritura encima de las imágenes, permitiendo así la ejecución del contenedor.

Un contenedor es, esencialmente, una imagen en ejecución.

Creación y ejecución de contenedores Docker

Para desplegar una aplicación en un contenedor Docker bastará con realizar tres sencillos pasos.

Diagrama representando el proceso de building en Docker

  1. El primero será escribir el dockerfile, indicando los pasos a seguir para instalar dependencias y ejecutar la aplicación.

  2. Construir la imagen a partir de este dockerfile. Esta operación se denomina build. Docker cuenta con un comando para ello. La imagen puede ser almacenada de forma local o en un Container Registry.

  3. Asignar los recursos computacionales para correr un contenedor a partir de la imagen. Esta operación se denomina «Run» y Docker también provee un comando para ello.

¿Qué es un Container Registry?

Un Container Registry o registro de contenedores es un repositorio, o colección de repositorios, utilizado para almacenar imágenes de contenedores. Estos repositorios pueden ser públicos, o privados.

Los repositorios públicos son ideales para personas o equipos pequeños que desean comenzar a trabajar lo más rápido posible. Son básicos en sus habilidades/ofertas y son fáciles de usar. Hoy en día existen una inmensa variedad de aplicaciones de código abierto disponibles para utilizar en el desarrollo de soluciones. Sin embargo, como este tipo de repositorios son accesibles para todo público, pueden no ser los ideales para aplicaciones de código privado, donde la privacidad y control de acceso son indispensables.

Los registros privados solucionan esta problemática, proporcionando formas de incorporar seguridad y privacidad en el almacenamiento de imágenes de contenedores empresariales, ya sea se encuentren alojados localmente o de forma remota. Las organizaciones pueden implementar sus propios repositorios o utilizar servicios de diversos proveedores que suelen incluir funcionalidades extras como medidas avanzadas de seguridad y controles de acceso, así como soporte técnico.

IBM cuenta con un servicio en la nube para este propósito, llamado IBM Container Registry.

IBM Container Registry

Logo de IBM Container Registry

IBM Container Registry es un servicio de IBM Cloud para almacenar y distribuir imágenes de contenedores en un registro privado y completamente administrado. Gracias a las herramientas de seguridad de IBM, las imágenes allí almacenadas pueden ser revisadas para detectar vulnerabilidades de seguridad y, de ser así, recibir un informe preciso junto a una serie de medidas a tomar.

El servicio permite almacenar hasta 0.5GB de forma gratuita. Luego, el costo del servicio dependerá del tamaño de las imágenes a almacenar.

Para más información se recomienda visitar el sitio oficial de IBM.

Orquestación de Contenedores

La adopción de contenedores por parte de empresas implicó un pasaje de contenedores individuales a arquitecturas con cientos de ellos en sistemas distribuidos. Para abordar el desafío de administrarlos surge la orquestación de contenedores, permitiendo llevar un control preciso de grandes volúmenes de contenedores a lo largo de su ciclo de vida.

La orquestación de contenedores:

  1. Ayuda en el aprovisionamiento e implementación de contenedores haciendo de este un proceso más automatizado, unificado y fluido.

  2. Garantiza que los contenedores sean redundantes y se encuentren disponibles para que las aplicaciones experimenten un tiempo de inactividad mínimo.

  3. Escala los contenedores hacia arriba y hacia abajo para satisfacer la demanda y equilibra la carga de las solicitudes entre las instancias para que ninguna se vea abrumada.

  4. Maneja la planificación de contenedores a la infraestructura subyacente.

  5. Permite realizar comprobaciones de estado para garantizar que las aplicaciones se estén ejecutando, y tomar las medidas necesarias cuando no es así.

¿Qué es Kubernetes?

Logo de Kubernetes

Kubernetes (K8S) la plataforma de orquestación de contenedores estándar de la industria. Es portátil, extensible y de código abierto y perite administrar cargas de trabajo y servicios en contenedores.

Kubernetes ofrece diversas herramientas y funcionalidades para orquestar contenedores, entre ellas:

  • Publicación de servicios y balanceo de carga garantizando una implementación estable.

  • Orquestación de almacenamiento para montar automáticamente un sistema de almacenamiento, sea local, de nube pública, u otros.

  • Implementaciones y reversiones automatizadas mediante un paradigma declarativo (se especifica el estado deseado del clúster y Kubernetes se asegura que siempre sea así).

  • Empaquetado automático de contenedores, especificando cuánta CPU y memoria (RAM) necesita cada uno.

  • Capacidades de auto-reparación, reiniciando y/o reemplazando contenedores fallidos, haciéndolos visibles a clientes sólo cuando están funcionando correctamente.

  • Funcionalidades de seguridad que permiten almacenar y administrar información confidencial, como contraseñas, tokens OAuth y claves SSH.

Para más información se recomienda visitar el sitio oficial de Kubernetes.

Orquestación de Contenedores en OpenShift

Logo de Red Hat OpenShift

Red Hat OpenShift es una plataforma de aplicaciones de Kubernetes empresarial en la nube híbrida.

Además de organizar contenedores, proporciona herramientas adicionales para todo el ciclo de vida de las aplicaciones, desde la compilación y CI/CD hasta la supervisión y el registro.

OpenShift proporciona una plataforma común para que las unidades empresariales alojen sus aplicaciones en la nube sin preocuparse por el sistema operativo subyacente. Esto hace que sea muy fácil de usar, desarrollar e implementar aplicaciones en la nube. Una de las características clave es que proporciona hardware administrado y recursos de red para todo tipo de desarrollo y pruebas. OpenShift también ofrece una versión local llamada OpenShift Enterprise.

En OpenShift, los desarrolladores tienen la posibilidad de diseñar aplicaciones escalables y no escalables y estos diseños se implementan utilizando servidores HAproxy.

Sus características incluyen:

  • Soporte de múltiples bases de datos

  • Administración de versiones de código

  • Despliegue con un clic

  • Soporte Multi Ambiente

  • Flujo de trabajo de desarrolladores estandarizado

  • Escalado Automático de Aplicaciones

  • Consola web

  • Inicio de sesión SSH remoto para aplicaciones

  • Integración continua y gestión de despliegues

  • Integración IDE

  • Depuración remota de aplicaciones

  • Open Source

Kubernetes vs. OpenShift

Si bien ambas son herramientas de orquestación de contenedores y son software de código abierto, OpenShift no es necesariamente una herramienta para usar con Kubernetes, como lo sería un Container Registry, sino que es una extensión de Kubernetes: se basa en él para proporcionar una plataforma más sólida para las aplicaciones.

Como OpenShift emplea Kubernetes, las capacidades nativas de Kubernetes también están presentes en OpenShift. OpenShift incluye casi todo lo que ofrece Kubernetes, así como funciones adicionales.

Sin embargo, hay algunas diferencias importantes:

  • OpenShift es un producto, Kubernetes es un proyecto.

  • Si bien los objetos de implementación de Kubernetes todavía están presentes en OpenShift, los objetos de DeploymentConfig son específicos de OpenShift. Los mismos se basan, no en los ReplicaSets, sino en otro objeto de Kubernetes más antiguo llamado ReplicationController.

  • OpenShift posee un enfoque único: el usuario crea aplicaciones y proyectos, y OpenShift realizar todo el trabajo de back-end. Esto permite a las organizaciones realizar menos trabajo, pero perdiendo parte de la flexibilidad que ofrece Kubernetes.

  • OpenShift posee una consola web que es mucho más amigable e interactiva que la CLI de Kubernetes.

  • OpenShift cuenta con una serie de workflows automatizados, no disponibles en Kubernetes, que permiten automatizar operaciones y facilitar el proceso de configuración manual.

  • Kubernetes requiere contenerizar una aplicación para ejecutarla. OpenShift ofrece esta posibilidad pero, además, cuenta con una funcionalidad «Source-To-Image» (S2I) que puede crear y desplegar una imagen a partir de código fuente, con un solo click.

Para más información se recomienda visitar este artículo de IBM Developer (Inglés).

Contenedores & IBM Cloud

Es posible trabajar con todos estos servicios, basados en tecnologías y estándares abiertos, en IBM Cloud, facilitando y acelerando aún más el viaje a la nube. En IBM Cloud, pueden crearse aplicaciones en contenedores mediante herramientas de integración y entrega continuas (CI/CD), administrar y orquestar contenedores mediante los servicios de Red Hat OpenShift o Kubernetes, e incluso modernizar aplicaciones existentes mediante IBM Cloud Paks.

¿Qué estás esperando? ¡Regístrate en IBM Cloud y comienza tu viaje hacia la nube!