Kubernetes vs. Docker: ¿por qué no ambos?

Cámara de pruebas de RF de IBM® Spectrum Fusion con equipo de ingenieros

¿Es Kubernetes o Docker la mejor opción (o realmente no hay elección)?

Cuando hablamos de tecnologías de contenedores, dos nombres emergen como líderes de código abierto: Kubernetes y Docker. Y aunque son tecnologías básicamente diferentes que ayudan a los usuarios con la gestión de contenedores, son complementarias entre sí y pueden ser potentes cuando se combinan. En este sentido, elegir utilizar Kubernetes o Docker no es una cuestión de decidir qué opción es mejor; en realidad, no compiten entre sí y pueden utilizarse en tándem. Así pues, a la pregunta de si Kubernetes o Docker es la mejor opción, la respuesta es ninguna de las dos.

El hecho de que Kubernetes y Docker sean tecnologías de contenedores complementarias aclara otra pregunta frecuente: ¿reemplaza Kubernetes a Docker?

En pocas palabras, no. Dado que Kubernetes no es una tecnología que compita con Docker, es probable que esta pregunta derive de la noticia que saltó en 2021 de que Kubernetes dejaría de dar soporte a Docker como opción de tiempo de ejecución de contenedores (es decir, un componente de contenedor que se comunica con el núcleo del sistema operativo o SO durante todo el proceso de contenerización). Sin embargo, Kubernetes y Docker siguen siendo compatibles y ofrecen claros beneficios cuando se utilizan juntos, como exploraremos en mayor detalle más adelante en esta publicación. En primer lugar, es importante comenzar con la tecnología fundacional que une a Kubernetes y Docker: los contenedores.

 

¿Qué es un contenedor?

Un contenedor es una unidad ejecutable de software que empaqueta el código de la aplicación con sus dependencias, lo que le permite ejecutarse en cualquier infraestructura de TI. Un contenedor es independiente; se abstrae del sistema operativo anfitrión (normalmente Linux), lo que lo hace portátil en todos los entornos de TI.

Una forma de entender el concepto de contenedor es compararlo con una máquina virtual (VM). Ambos se basan en tecnologías de virtualización, pero mientras que un contenedor virtualiza un SO, una VM aprovecha un hipervisor (una capa ligera de software entre la VM y el hardware de un ordenador) para virtualizar el hardware físico. 

Con la virtualización tradicional, cada VM contiene una copia completa de un sistema operativo (SO) invitado, una copia virtual del hardware necesario para ejecutar el sistema operativo y una aplicación (y sus bibliotecas y dependencias asociadas). Un contenedor, por otro lado, incluye solo una aplicación y sus bibliotecas y dependencias. La ausencia de un host invitado reduce significativamente el tamaño de un contenedor, haciéndolo ligero, rápido y portátil. Además, un contenedor utiliza automáticamente la configuración DNS del host.

Los ingenieros pueden utilizar contenedores para desarrollar rápidamente aplicaciones que se ejecuten de forma coherente en un gran número de sistemas distribuidos y entornos multiplataforma. La portabilidad de los contenedores elimina muchos de los conflictos que surgen de las diferencias en herramientas y software entre equipos funcionales. 

Esto los hace especialmente adecuados para los flujos de trabajo de DevOps, lo que facilita el trabajo conjunto de los desarrolladores y las operaciones de TI en todos los entornos. Pequeños y ligeros, los contenedores también son ideales para arquitecturas de microservicios, en las que las aplicaciones se componen de servicios más pequeños y poco acoplados. Y la contenerización suele ser el primer paso para modernizar las aplicaciones on-premises e integrarlas con los servicios cloud.

¿Qué es Docker?

Docker es una plataforma de contenerización de código abierto. Básicamente, es un kit de herramientas que hace que sea más fácil, seguro y rápido para los desarrolladores crear, implementar y gestionar contenedores. Este kit de herramientas también se conoce como containerd.

Aunque comenzó como un proyecto de código abierto, hoy en día Docker también hace referencia a Docker, Inc., la empresa que produce el producto comercial Docker. Actualmente, es la herramienta más popular para crear contenedores, tanto si los desarrolladores utilizan Windows, Linux o MacOS.

De hecho, las tecnologías de contenedores estuvieron disponibles durante décadas antes del lanzamiento de Docker en 2013. En sus inicios, los contenedores de Linux (o LXC) eran los más extendidos. Docker se basó en LXC, pero la tecnología personalizada de Docker superó rápidamente a LXC para convertirse en la plataforma de contenerización más popular. 

Entre los atributos clave de Docker se encuentra su portabilidad. Los contenedores Docker pueden ejecutarse en cualquier entorno de escritorio, centro de datos o entorno en la nube. Solo puede ejecutarse un proceso en cada contenedor, por lo que una aplicación puede funcionar de forma continua mientras una parte de la misma se somete a una actualización o se repara.

Algunas de las herramientas y la terminología utilizadas habitualmente con Docker son las siguientes:

  • Docker Engine: el entorno de tiempo de ejecución que permite a los desarrolladores crear y ejecutar contenedores.
  • Dockerfile: un archivo de texto simple que define todo lo necesario para crear una imagen de contenedor Docker, como las especificaciones de red del SO y las ubicaciones de los archivos. Básicamente es una lista de comandos que el motor Docker ejecutará para ensamblar la imagen.
  • Docker Compose: una herramienta para definir y ejecutar aplicaciones de varios contenedores. Crea un archivo YAML para especificar qué servicios se incluyen en la aplicación y puede implementar y ejecutar contenedores con un solo comando a través de la CLI de Docker.

Ahora veamos por qué Kubernetes dejó de dar soporte a Docker como tiempo de ejecución de contenedores. Como se ha indicado al principio de esta sección, Docker es un containerd y no un tiempo de ejecución de contenedores. Esto significa que Docker se asienta sobre un tiempo de ejecución de contenedores subyacente para proporcionar a los usuarios características y herramientas a través de una interfaz de usuario. Para soportar Docker como tiempo de ejecución, Kubernetes tuvo que soportar e implementar un tiempo de ejecución separado conocido como Docker Shim, que esencialmente se situaba entre las dos tecnologías y las ayudaba a comunicarse.

Esto se hizo en una época en la que no había muchos tiempos de ejecución de contenedores disponibles. Sin embargo, ahora que los hay (con CRI-O como ejemplo), Kubernetes puede ofrecer a los usuarios numerosas opciones de tiempo de ejecución de contenedores, muchas de las cuales utilizan la interfaz estándar de tiempo de ejecución de contenedores (CRI), una forma de que Kubernetes y el tiempo de ejecución de contenedores se comuniquen de forma fiable sin una capa intermedia que actúe como intermediario.

Sin embargo, aunque Kubernetes ya no ofrece un soporte especial a Docker como tiempo de ejecución, todavía puede ejecutar y gestionar contenedores creados con la Open Container Initiative (OCI), el formato de imagen propio de Docker que permite utilizar Dockerfiles y crear imágenes Docker. En otras palabras, Docker todavía tiene mucho que ofrecer en el ecosistema Kubernetes.

¿Cuáles son las ventajas de Docker?

La plataforma de contenerización Docker ofrece todos los beneficios mencionados anteriormente de los contenedores, incluidos los siguientes:

  • Portabilidad ligera: las aplicaciones contenerizadas pueden pasar de cualquier entorno a otro (dondequiera que funcione Docker), y funcionarán independientemente del SO.
  • Desarrollo ágil de aplicaciones: la contenerización facilita la adopción de procesos de CI/CD y se beneficia de metodologías ágiles, como DevOps. Por ejemplo, las aplicaciones contenerizadas pueden probarse en un entorno e implementarse en otro en respuesta a los rápidos cambios de las demandas empresariales.
  • Escalabilidad: los contenedores Docker pueden crearse rápidamente y pueden gestionarse varios contenedores de forma eficaz y simultánea.

Otras características de la API de Docker incluyen la capacidad de rastrear y revertir automáticamente imágenes de contenedores, utilizar contenedores existentes como imágenes base para crear otros nuevos y crear contenedores basados en el código fuente de las aplicaciones. Docker está respaldado por una dinámica comunidad de desarrolladores que comparte miles de contenedores en internet a través del Docker Hub.

Pero mientras que Docker funciona bien con aplicaciones más pequeñas, las grandes aplicaciones empresariales pueden implicar un gran número de contenedores (a veces cientos o incluso miles), lo que resulta abrumador para los equipos de TI encargados de gestionarlos. Ahí es donde entra en juego la orquestación de contenedores. Docker tiene su propia herramienta de orquestación, Docker Swarm, pero la opción más popular y robusta con diferencia es Kubernetes.

Docker dispone de varios comandos utilizados en la creación y ejecución de contenedores:

  • docker build : este comando crea una nueva imagen Docker a partir del código fuente (es decir, a partir de un Dockerfile y los archivos necesarios).
  • docker create : este comando crea una nueva imagen Docker a partir de una imagen sin iniciarla, lo que implica crear una capa de contenedor escribible sobre la imagen y prepararla.
  • docker run : este comando funciona exactamente igual que el comando docker create  , salvo que da el paso añadido de ejecutarlo tras la creación.
  • docker exec : este comando se utiliza para ejecutar un nuevo comando dentro de un contenedor que ya se está ejecutando.

¿Qué es Kubernetes?

Kubernetes es una plataforma de orquestación de contenedores de código abierto para programar y automatizar la implementación, la gestión y el escalado de aplicaciones contenerizadas. Los contenedores operan en una arquitectura de múltiples contenedores llamada “clúster”. Un clúster de Kubernetes incluye un contenedor designado como plano de control que programa las cargas de trabajo para el resto de contenedores (o nodos de trabajo) del clúster.

El nodo maestro determina dónde alojar las aplicaciones (o contenedores Docker), decide cómo agruparlas y gestiona su orquestación. Al agrupar los contenedores que componen una aplicación en clústeres, Kubernetes facilita el descubrimiento de servicios y permite gestionar grandes volúmenes de contenedores a lo largo de su ciclo de vida. 

Google introdujo Kubernetes como proyecto de código abierto en 2014. Ahora, lo gestiona una fundación de software de código abierto llamada Cloud Native Computing Foundation (CNCF). Diseñado para la orquestación de contenedores en entornos de producción, Kubernetes es popular debido en parte a su robusta funcionalidad, una activa comunidad de código abierto con miles de colaboradores y el apoyo y la portabilidad a través de los principales proveedores de nubes públicas (p. ej., IBM® Cloud, Google, Azure y AWS).

¿Cuáles son las ventajas de Kubernetes?

  • Implementación automatizada: Kubernetes programa y automatiza la implementación de contenedores en varios nodos de computación, que pueden ser VM o servidores bare metal. 
  • Descubrimiento de servicios y equilibrio de carga: expone un contenedor en internet y emplea el equilibrio de carga cuando se producen picos de tráfico para mantener la estabilidad.
  • Características de autoescalado: pone en marcha automáticamente nuevos contenedores para manejar cargas pesadas, ya sea basándose en el uso de la CPU, en umbrales de memoria o en métricas personalizadas.
  • Capacidades de autorreparación: Kubernetes reinicia, sustituye o reprograma los contenedores cuando fallan o cuando dejan de funcionar los nodos, y elimina los contenedores que no responden a las comprobaciones de estado definidas por el usuario.
  • Implementaciones y reversiones automatizadas: implementa los cambios de la aplicación y monitoriza su estado para detectar cualquier problema, revirtiendo los cambios si algo va mal.
  • Orquestación del almacenamiento: monta automáticamente un sistema de almacenamiento persistente local o en la nube de su elección según sea necesario para reducir la latencia y mejorar la experiencia del usuario.
  • Aprovisionamiento dinámico de volúmenes: permite a los administradores de clústeres crear volúmenes de almacenamiento sin tener que realizar manualmente llamadas a sus proveedores de almacenamiento o crear objetos.

Kubernetes y Docker: encontrar la mejor solución de contenedores

Aunque Kubernetes y Docker son tecnologías distintas, son muy complementarias y forman una potente combinación. Docker proporciona la pieza de contenerización, lo que permite a los desarrolladores empaquetar fácilmente aplicaciones en contenedores pequeños y aislados a través de la línea de comandos. Los desarrolladores pueden ejecutar esas aplicaciones en su entorno de TI, sin tener que preocuparse por problemas de compatibilidad. Si una aplicación se ejecuta en un solo nodo durante las pruebas, se ejecutará en cualquier lugar.

Cuando aumenta la demanda, Kubernetes proporciona orquestación de contenedores Docker, programándolos e implementándolos automáticamente en entornos de TI para garantizar una alta disponibilidad. Además de ejecutar contenedores, Kubernetes ofrece los beneficios del equilibrio de carga, la autorreparación y las implementaciones y reversiones automatizadas. Además, cuenta con una interfaz gráfica de usuario que facilita su uso.

Para las empresas que prevén escalar su infraestructura en el futuro, podría tener sentido utilizar Kubernetes desde el principio. Y para aquellos que ya utilizan Docker, Kubernetes hace uso de los contenedores y cargas de trabajo existentes a la vez que aborda los complejos problemas relacionados con el escalado. 

Integración para automatizar y gestionar mejor las aplicaciones

Las versiones posteriores de Docker llevan incorporada la integración con Kubernetes. Esta característica permite a los equipos de desarrollo automatizar y gestionar de forma más eficaz todas las aplicaciones contenerizadas que Docker les ayudó a crear.

Al final, se trata de saber qué combinación de herramientas necesita su equipo para alcanzar sus objetivos empresariales. Compruebe cómo dar sus primeros pasos con estos tutoriales de Kubernetes y explore el IBM® Cloud Kubernetes Service para más información.

Gane una insignia a través de tutoriales sin coste de Kubernetes basados en navegador con IBM® CloudLabs.

Autor

Dé el siguiente paso

Comience con una plataforma Red Hat OpenShift totalmente gestionada o explore la flexibilidad del ecosistema IBM Cloud Kubernetes. Acelere su proceso de desarrollo e implementación con soluciones escalables y seguras adaptadas a sus necesidades.

Descubra Red Hat OpenShift Explore Kubernetes