Skip to content
BotServBotServ
DockerrunccruncontainerdContainer Runtime

Docker Container Runtimes

Entiende runc, crun y containerd. Diferencias, rendimiento y cambio de runtime.

S

schutzgeist

3 min read
Docker Container Runtimes

Docker Container-Runtimes

Qué cubre este artículo sobre Container-Runtimes

  • Qué es una Container-Runtime.
  • Qué runtimes utiliza Docker.
  • Diferencias entre runc y crun.
  • Qué son containerd y shim.
  • Cómo cambiar y verificar la runtime.

Introducción: Docker Container-Runtimes

Docker es para muchos el primer paso en el mundo de los contenedores. Pero quien trabaja en producción con contenedores necesita entender qué sucede bajo el capó. Docker utiliza containerd, un gestor de contenedores ligero, y una runtime de bajo nivel como runc o crun. Esta runtime inicia y aísla los procesos reales de los contenedores. La elección de la runtime puede tener impacto en velocidad, consumo de recursos y seguridad.

Este artículo explica las principales runtimes de Docker y muestra cómo cambiarlas.

Términos clave

  • Container-Runtime: Software que ejecuta y aísla procesos de contenedores.
  • containerd: Gestión de contenedores de alto nivel.
  • runc: Runtime estándar para Docker, escrita en Go.
  • crun: Runtime alternativa en C, más rápida y eficiente en recursos.
  • shim: Conexión entre containerd y el contenedor en ejecución.
  • CRI: Container Runtime Interface.
  • cgroups: Control Groups para la gestión de recursos.
  • Namespaces: Aislamiento de procesos, red y sistema de archivos.

Arquitectura de Docker

Docker funciona en varias capas:

  1. Docker Engine: API, CLI y daemon.
  2. containerd: Gestiona el ciclo de vida de los contenedores.
  3. Runtime: Inicia y aísla los procesos de contenedores.

Un inicio típico de contenedor se ve así:

docker run → Docker Engine → containerd → runc/crun → Container

runc

runc es la runtime estándar de Docker. Es estable, ampliamente utilizada y compatible con muchas características:

  • Especificación OCI.
  • Cgroups v1 y v2.
  • Namespaces.
  • Seccomp, AppArmor, SELinux.

Desventajas:

  • Escrita en Go, lo que resulta en archivos binarios más grandes y mayor consumo de memoria.
  • El inicio puede ser más lento que con crun.

crun

crun es una alternativa a runc escrita en C. Ventajas:

  • Archivo binario más pequeño.
  • Inicio más rápido.
  • Menor consumo de memoria.
  • Mejor compatibilidad con cgroups v2.
  • Soporte para componentes WebAssembly.

Desventajas:

  • Menos extendida.
  • Algunas herramientas o integraciones de Kubernetes necesitan probar crun.
  • Ocasionalmente contiene bugs más recientes.

Instalar crun

En Debian/Ubuntu:

sudo apt-get install -y crun

Cambiar la runtime en Docker

Docker puede configurar una runtime a través de daemon.json:

{
  "runtimes": {
    "crun": {
      "path": "/usr/bin/crun"
    }
  },
  "default-runtime": "crun"
}

Después:

sudo systemctl restart docker

Verificación:

docker info | grep "Default Runtime"

Iniciar contenedores individuales con crun

docker run --runtime=crun hello-world

containerd

containerd es una runtime estándar en la industria, utilizada no solo por Docker sino también por Kubernetes y muchas otras herramientas. Gestiona:

  • Images.
  • Procesos de contenedores.
  • Almacenamiento.
  • Plugins de red.

containerd por sí solo no inicia contenedores para el usuario final, sino que proporciona una API utilizada por Docker, Kubernetes o la CLI crictl.

Diferencias en el día a día

Aspectorunccrun
LenguajeGoC
Tamañomás grandemás pequeño
Tiempo de iniciorápidoa menudo más rápido
Memoriaalgo másalgo menos
cgroups v2compatibleoptimizado
Distribuciónmuy altaen crecimiento

Para la mayoría de homelabs, la elección apenas marca diferencia. Con muchos contenedores o hardware limitado, crun puede aportar ventajas.

Seguridad

  • La runtime debe actualizarse regularmente.
  • Las características de seguridad como Seccomp, AppArmor y cgroups deben mantenerse activas.
  • Docker rootless también puede requerir una runtime que sea compatible con namespaces rootless.

Tropiezos típicos

  • crun no instalado: El contenedor no inicia.
  • Rutas incorrectas: daemon.json apunta a un archivo inexistente.
  • Incompatibilidades: Algunas herramientas esperan runc.
  • Kubernetes: crun debe registrarse en la configuración de CRI.
  • Actualizaciones olvidadas: La runtime permanece en una versión antigua.

Enlaces y recursos adicionales

FAQ: Container-Runtimes

¿Debo usar crun en lugar de runc? Si tienes muchos contenedores o hardware limitado, vale la pena. De lo contrario, runc es suficiente.

¿Tengo que gestionar containerd manualmente? No, Docker se encarga de ello.

¿Es seguro crun? Sí, utiliza los mismos mecanismos de seguridad de Linux que runc.

¿Cómo cambio la runtime? Registra la runtime en /etc/docker/daemon.json y reinicia Docker.

¿Qué es OCI? Open Container Initiative, el estándar que siguen runc y crun.

Fuentes y lecturas adicionales

Resumen: Docker Container-Runtimes

Docker utiliza containerd y una runtime de bajo nivel como runc o crun. runc es el estándar probado, mientras que crun ofrece ventajas en velocidad y consumo de recursos. Para la mayoría de homelabs, runc es suficiente, pero crun es una buena alternativa cuando tienes muchos contenedores o hardware limitado. Cambiar la runtime a través de daemon.json es simple. Quien comprende la arquitectura puede depurar Docker de forma más efectiva, optimizarlo y operarlo con mayor seguridad.

Volver al blog
Share:

Entradas relacionadas