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:
- Docker Engine: API, CLI y daemon.
- containerd: Gestiona el ciclo de vida de los contenedores.
- 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
| Aspecto | runc | crun |
|---|---|---|
| Lenguaje | Go | C |
| Tamaño | más grande | más pequeño |
| Tiempo de inicio | rápido | a menudo más rápido |
| Memoria | algo más | algo menos |
| cgroups v2 | compatible | optimizado |
| Distribución | muy alta | en 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.jsonapunta 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
- BotServ.de Docker Befehle
- BotServ.de Docker Sicherheit
- BotServ.de Docker Rootless
- BotServ.de Docker Monitoring
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
- runc: https://github.com/opencontainers/runc
- crun: https://github.com/containers/crun
- containerd: https://containerd.io/
- OCI: https://opencontainers.org/
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.


