Los contenedores todavía significan "Docker" para muchas personas. Docker popularizó el uso moderno de contenedores en el desarrollo y distribución de software. En estos días, también existen otras tecnologías. Así es como se relacionan Containerd, Docker y Kubernetes.
Los inicios
A su lanzado en 2013, Docker era un proyecto independiente con todo lo necesario para crear y ejecutar contenedores. Lo que faltaba era una forma sencilla de organizar las implementaciones de contenedores en la nube.
A finales de 2013, varios empleados de Google ya estaban Lidia con esto con un prototipo de lo que se convertiría en Kubernetes. Kubernetes tiene como objetivo simplificar la operación de cargas de trabajo en contenedores en grandes flotas de máquinas.
En aquel entonces, Kubernetes estaba indisolublemente vinculado a Docker. Usó Docker directamente para interactuar con los contenedores, aunque solo necesitaba un subconjunto de funcionalidades: las partes responsables de ejecutar realmente los contenedores.
La interfaz de usuario centrada en el desarrollador de Docker ha obstaculizado a Kubernetes. Tuvo que eludir los aspectos amigables para los humanos del proyecto utilizando una herramienta dedicada, Dockershim. Los problemas se vieron agravados por las diferentes direcciones que tomaron Docker y Kubernetes. Docker ha lanzado Swarm, su alternativa a Kubernetes, que ofrece orquestación como un Docker "modo".
El surgimiento de Containerd
A medida que Kubernetes creció y las herramientas de terceros se desarrollaron alrededor de Docker, las limitaciones de su arquitectura se hicieron evidentes. Al mismo tiempo, el Iniciativa de contenedor abierto (OCI) comenzó a estandarizar formatos de contenedores y tiempos de entrega. Esto llevó a una especificación de OCI que define un contenedor que podría ser utilizado por múltiples tiempos de ejecución, de los cuales Docker es un ejemplo.
Docker luego extrajo el tiempo de ejecución del contenedor en un nuevo proyecto, contenedord. Esto incluye la funcionalidad de Docker para ejecutar contenedores, administrar el almacenamiento de bajo nivel y administrar las transferencias de imágenes. Containerd fue donado a Base de computación nativa en la nube (CNCF) con el fin de proporcionar a la comunidad de contenedores una base para construir nuevas soluciones de contenedores.
La aparición de containerd facilita que proyectos como Kubernetes accedan a los elementos "Docker" de bajo nivel que necesitan. En lugar de usar Docker, ahora tienen una interfaz más accesible para el tiempo de ejecución del contenedor. La estandarización OCI de las tecnologías de contenedores significa que también se pueden utilizar otros plazos de entrega.
Comprender el papel de Containerd
Para comprender completamente los contenedores, es necesario examinar la naturaleza de los contenedores. Los contenedores son realmente una abstracción de varias características del kernel de Linux. Para ejecutar un contenedor, debe usar syscalls para configurar el entorno en contenedor. Los pasos varían según la plataforma y la distribución.
Containerd interviene para abstraer este cableado de bajo nivel. Está destinado como "nivel de cliente" ese software contenedor se construye luego en la parte superior. Esto podría ser software orientado a desarrolladores, como Docker, o herramientas Devops orientadas a la nube como Kubernetes.
Anteriormente, el desarrollo de Kubernetes se quedaba con dos opciones muy malas: seguir escribiendo shims alrededor de la pesada interfaz de Docker o comenzar a interactuar directamente con las funciones del kernel de Linux. Al romper containerd de Docker, una tercera alternativa estuvo disponible: usar containerd como la capa de abstracción del sistema, sin involucrar a Docker.
A continuación, se muestra un resumen de cómo se combinan las tres tecnologías:
- Estibador - Un software orientado al desarrollador con una interfaz de alto nivel que le permite crear y ejecutar contenedores fácilmente desde su terminal. Ahora use containerd como el tiempo de ejecución del contenedor.
- Contenedor - Una abstracción de la funcionalidad del kernel que proporciona una interfaz de contenedor de nivel relativamente alto. Otros proyectos de software pueden usarlo para ejecutar contenedores y administrar imágenes de contenedores.
- Gobernadores - Un orquestador de contenedores que funciona con múltiples tiempos de ejecución de contenedores, incluido containerd. Kubernetes se centra en la implementación de contenedores en forma agregada en uno o más "nodos" físicos. Históricamente, Kubernetes estaba vinculado a Docker.
Containerd es solo un backend de contenedor. Otros contenedores que implementan el Especificaciones de Open Containers Runtime para incluir runC es CRI-O. Estos tiempos de ejecución también se pueden usar con Docker y Kubernetes; cada uno tiene sus propias distinciones.
La OCI
La OCI es el organismo responsable de la definición contenedor estándar. Su trabajo fue fundamental para facilitar la interoperabilidad entre diferentes tecnologías de componentes.
La especificación de la imagen OCI define cómo debería verse un contenedor. La especificación de tiempo de ejecución define una interfaz para ejecutar contenedores. Los proyectos como containerd implementan estas especificaciones.
Es importante destacar que una de las prioridades de OCI es respaldar la experiencia de uso de contenedores popularizada por Docker. Sus imágenes deben ser ejecutables en la plataforma de destino sin ningún argumento definido por el usuario (p. Ej. docker run hello-world:latest
). Por lo tanto, las imágenes OCI deben contener suficientes metadatos para permitir esta configuración automática.
También puede ver referencias a Interfaz de tiempo de ejecución del contenedor (CRI). Esta es una abstracción específica de Kubernetes de la especificación OCI. El CRI se basa en la especificación OCI para permitir la compatibilidad con tiempos de ejecución de contenedores intercambiables dentro de Kubernetes.
¿Qué pasa con mis imágenes de Docker?
Las imágenes que crea con Docker no son "imágenes de Docker" en absoluto. Dado que Docker ahora usa el tiempo de ejecución en contenedor, las imágenes se crean en el formato estandarizado Open Container Initiative (OCI).
No debe preocuparse por las incompatibilidades entre las imágenes de Docker y el entorno en el que se utilizan. Las imágenes que crea con Docker aún se pueden implementar con Kubernetes. Esto se debe a que Kubernetes también admite imágenes OCI mediante el uso de containerd (y otros tiempos de ejecución que cumplen con los estándares). Depende de tiempo de ejecución para manejar la extracción y ejecución de imágenes, no la interfaz de alto nivel proporcionada por herramientas como Docker y Kubernetes.
Kubernetes y Docker
Kubernetes dejó de utilizar el tiempo de ejecución de Docker a finales de 2020. será eliminado en una versión futura, actualmente programada para finales de 2021. A partir de entonces, Kubernetes ya no ofrecerá Docker tiempo de ejecución apoyo. En su lugar, deberá utilizar un tiempo de ejecución alternativo compatible con OCI, como containerd.
Este anuncio generó preocupación por las implicaciones para los desarrolladores. El cambio no debería afectar a la mayoría de los flujos de trabajo existentes. Como ya hemos visto, Docker produce imágenes compatibles con OCI que pueden ejecutarse con tiempos de ejecución compatibles con OCI. Cualquier imagen con la que construyas docker build
seguirá funcionando en Kubernetes, incluso después de eliminar el tiempo de ejecución de Docker.
Se consideran dos tecnologías diferentes: Docker interfaz de línea de comandos utilizado para crear y ejecutar contenedores y Docker tiempo de ejecución que envuelve la interfaz de línea de comandos.
¡Es demasiado confuso!
En solo unos años, los contenedores han transformado la cantidad de desarrolladores que trabajan. La expansión al ecosistema circundante fue un subproducto natural de este cambio. los Containers === Docker
la mentalidad resultó demasiado sofocante, ya que impedía que herramientas como Kubernetes mostraran todo su potencial.
El paso a la estandarización ha dado lugar a una plétora de nuevos términos, herramientas y tecnologías. Sin embargo, nada ha cambiado realmente para los desarrolladores, ya sea que esté interactuando con la CLI de Docker en su máquina o con un clúster de Kubernetes en la nube.
Cada interfaz de usuario de alto nivel (como Docker y Kubernetes) ahora se beneficia de una opción de tiempo de ejecución de contenedores de bajo nivel intercambiables (como containerd y runC). Esto permite un mayor grado de flexibilidad y permite que las nuevas tecnologías basadas en contenedores se establezcan de manera alineada con los estándares.
Descubre más contenido