Conecta con nosotros

A Fondo

Contenedores: casi todo lo que tienes que saber

Publicado el

El uso de contenedores ha supuesto un antes y un después en el mundo IT, revolucionando áreas como el despliegue y entrega de aplicaciones, la adopción de la nube híbrida en todo tipo organizaciones o en el uso mucho más eficaz de los recursos disponibles en los centros de datos.

¿Pero qué es exactamente un contenedor? Una de las formas más sencillas de definirlo podría pasar por afirmar que un contenedor «desacopla» aplicaciones y otros elementos de software del sistema operativo en el que se ejecutan, de modo que cada una de estas aplicaciones o servicios se ejecutan en su propio sandbox de forma aislada, sin interferir con el resto de procesos y aplicaciones.

Este aislamiento impide que los procesos que se ejecutan dentro de un contenedor determinado supervisen o afecten a los procesos que se ejecutan en otro contenedor, al mismo tiempo que tampoco influyen ni afectan al funcionamiento del equipo o el sistema operativo sobre los que se despliegan.

Una de las principales ventajas que ofrece esta tecnología y por la que ha popularizado su uso en los centros de datos, es que permite consolidar en un único servidor muchos de los servicios y aplicaciones que hasta entonces podían encontrarse dispersos en muchos otros, optimizando de esta forma los recursos disponibles y evitando «interferencias». Algunas de las características propias y por las que se define un contenedor, son las siguientes:

  • Seguridad: En el teórico caso de que un atacante fuese capaz de explotar con éxito un agujero de seguridad, el daño ocasionado se limitaría a la aplicación o el código que se ejecuta dentro de ese contenedor, permaneciendo el resto del sistema inalterado.
  • Aislamiento: Un contenedor permite el despliegue de una o más aplicaciones en la misma máquina física, incluso si esas aplicaciones deben operar bajo diferentes dominios. Por ejemplo, varias aplicaciones que se ejecutan en contenedores diferentes pueden unirse a la misma interfaz de red física mediante el uso de direcciones IP distintas asociadas a cada contenedor.
  • Virtualización y transparencia: Los contenedores proporcionan al sistema un entorno virtualizado que puede ocultar o limitar la visibilidad de los dispositivos físicos o la configuración concreta de los servidores sobre los que se asientan. El objetivo es limitar la dependencia de la ejecución de aplicaciones, del propio entorno en el que se ejecutan.
  • Contenedores con y sin privilegios: Dentro del amplio mundo de los contenedores de software, encontramos una clara distinción entre los contenedores «con privilegios» y aquellos que no los tienen. Los contenedores sin privilegios se consideran mucho más seguros, ya que su ejecución se realiza directamente sobre la raíz del mismo y no sobre la del sistema host sobre el que se despliega.

    Los contenedores con privilegios en cambio son más vulnerables a ataques externos, en el sentido de que si un atacante es capaz de explotar una vulnerabilidad de una aplicación que se encuentre en este tipo de contenedores, eventualmente podría escalar privilegios hasta llegar atacar a la propia máquina host.

    Esto es por lo que los administradores suelen limitar al máximo el número de contenedores «privilegiados» que emplean, asegurándose en estos casos que lo hacen más seguros.

docker

Docker: el contenedor más utilizado

De todas las que en los últimos años se han presentado, Docker es sin lugar a dudas, la solución de contenedores más utilizada en todo el mundo. Diseñado como solución de «contenedorización» open-source, uno de los grandes motivos que justifican su popularidad es que trata los contenedores como si fueran máquinas virtuales extremadamente ligeras y modulares lo que ofrece una mejor experiencia de usuario frente al «contenedor clásico» y favorece el trabajo de los desarrolladores, por ejemplo, automatizando la tarea repetitiva de crear y desplegar microservicios dentro de los mismos.

Docker mejora no solo la ejecución de este tipo de tecnología, sino que ha conseguido simplificar al máximo el proceso de crear contenedores, generar imágenes, compartirlas y/o versionarlas. Algunas de las características que hacen de Docker un desarrollo único son las siguientes:

  • Portabilidad: Docker proporciona un modelo de implementación basado en imágenes. Este tipo de portabilidad permite una forma más fácil de compartir una aplicación o conjunto de servicios (con todas sus dependencias) a través de múltiples entornos.
  • Control de versiones: Una sola imagen Docker se compone de una serie de capas combinadas. De esta forma, se crea una nueva capa cada vez que se altera la imagen y Docker tiene la capacidad para reutilizar estas capas para la construcción de nuevos contenedores. La superposición de estas capas constituye su propio método de control de versiones.
  • Rollback: Como cada imagen de Docker está formada por varias capas, el usuario tiene la posibilidad de trabajar no solo sobre la última capa de la misma, sino sobre cualquiera de sus versiones. Esto facilita el trabajo de los equipos Devops, acostumbrados a procesos de entrega continua y actualizaciones.
  • Despliegue rápido: El aprovisionamiento de nuevo hardware puede llevar días y habitualmente, el esfuerzo y los gastos que conllevan la instalación, configuración, etc. no es precisamente bajo. Con Docker en cambio, puede ponerse en marcha una imagen en pocos segundos. Cuando el contenedor no se necesita, puede destruirse con la misma facilidad.
  • Gestión de procesos: Docker restringe la ejecución de contenedores a procesos únicos. Si una aplicación consta de un número X de procesos simultáneos, Docker requerirá que se ejecute un número X de contenedores, cada uno con su propio proceso. Por ejemplo, si queremos desplegar un servidor LAMP (Linux + Apache + MySQL + PHP), cada proceso de cada aplicación necesitará contar su propio contenedor.
  • Almacenamiento: Docker no admite el almacenamiento persistente. Es decir, cuando se crea una imagen Docker, estará formada por capas únicamente de lectura. Durante el tiempo de ejecución, si el proceso del contenedor realiza algún cambio en su estado interno, la diferencia se reflejará en una nueva capa.

Kubernetes: la mejor plataforma de orquestación

Si Docker es el contenedor de referencia, Kubernetes es la plataforma de orquestación de contenedores más popular. Solución open-source desarrollada originalmente por Google, su objetivo es automatizar las operaciones con todo tipo contenedores. Su principal ventaja es que elimina todos los procesos manuales involucrados en el despliegue y escalado de aplicaciones contenedorizadas.

Así, Kubernetes hace posible responder rápidamente a las demandas de los consumidores desplegando sus aplicaciones de forma eficiente, escalando esas mismas aplicaciones con facilidad y desplegando nuevas funciones sin problemas, todo ello al tiempo que limita el consumo de recursos de hardware. Otra de sus ventajas es que se trata de una plataforma extremadamente modular, por lo que admite la integración de nuevos servicios o su uso en distintos frameworks con mucha facilidad. En este sentido, las principales compañías tecnológicas del mercado ofrecen a las empresas sus propias soluciones de gestión basadas en Kubernetes. Red Hat OpenShift por ejemplo, es una de las más utilizadas.

Curiosamente, también existe una plataforma desarrollada por los chicos de Docker y que cumple con la misma función: Swarm. El hecho de que sin embargo Swarm no sea tan conocida y que en cambio Kubernetes se haya convertido en un estándar en la industria no es tanto a que la segundo ofrezca funciones mejores o diferentes, sino que mientras que Swarm «únicamente» es capaz de orquestar el despliegue y el escalado de contenedores Docker, Kubernetes puede trabajar con contenedores de todo tipo.

Para su funcionamiento, Kubernetes se ejecuta sobre la capa superior de un sistema operativo (Red Hat Enterprise Server, SUSE Linux Enterprise Server, etc.), formando una unidad de control (una máquina física o virtual) que controla los nodos que forma parte de la red y desde la que (habitualmente un equipo DevOps) ordena las distintas tareas de despliegue, escalado y orquestación.

Periodista tecnológico con más de una década de experiencia en el sector. Editor de MuyComputerPro y coordinador de MuySeguridad, la publicación de seguridad informática de referencia.

Lo más leído