Establecer límites de recursos en Docker
Qué cubre este artículo sobre límites de recursos en Docker
- Por qué son importantes los límites.
- Cómo limitar CPU y RAM.
- Diferencia entre
limitsyreservations. - Casos especiales como OOM-Killer y Swap.
- Ejemplos prácticos en Compose.
Introducción: Establecer límites de recursos en Docker
Los contenedores Docker comparten los recursos del host. Sin límites, un único contenedor puede consumir toda la CPU, toda la RAM o el ancho de banda de disco. Esto provoca que otros servicios funcionen lentamente, terminations por falta de memoria o incluso que el host se bloquee. Los límites de recursos garantizan que cada contenedor reciba solo lo que necesita y que el resto del sistema permanezca estable.
Este artículo muestra cómo establecer límites de CPU, RAM e I/O en Docker y Compose.
Términos clave
- cgroups: Grupos Linux para gestión de recursos.
- OOM: Out Of Memory, desbordamiento de memoria.
- Swap: Memoria de intercambio.
- limits: Recursos máximos.
- reservations: Recursos reservados.
- shares: Priorización de CPU.
- cpus: Tiempo máximo de CPU.
- mem_limit: Cantidad máxima de RAM.
Por qué establecer límites
- Estabilidad del host.
- Distribución justa de recursos.
- Predictibilidad.
- Protección contra aplicaciones defectuosas.
- Mejor control de costos en la nube.
Límite de CPU
En compose.yaml:
services:
app:
image: mein-app
deploy:
resources:
limits:
cpus: '1.5'
Esto limita a 1,5 núcleos de CPU.
Límite de RAM
services:
app:
image: mein-app
deploy:
resources:
limits:
memory: 512M
reservations:
memory: 128M
reservations le indica a Docker que reserve 128 MB, mientras que limits restringe a 512 MB.
CPU y RAM combinados
services:
app:
image: mein-app
deploy:
resources:
limits:
cpus: '2'
memory: 1G
reservations:
cpus: '0.5'
memory: 256M
docker run
docker run -d --name app --memory=512m --cpus=1.5 mein-app
Límite de Swap
docker run -d --name app --memory=512m --memory-swap=1g mein-app
--memory-swap es la suma de RAM y Swap. --memory-swap=512m desactiva Swap.
OOM-Killer
Cuando un contenedor excede su límite de RAM, el kernel lo termina. Docker lo reinicia según la política de reinicio. En caso de errores de OOM persistentes, debes aumentar el límite o corregir el error en la aplicación.
CPU-Shares
Para priorización suave:
services:
app:
deploy:
resources:
limits:
cpus: '1'
reservations:
cpus: '0.2'
Los límites duros con cpus tienen prioridad.
Limitar PIDs
docker run --pids-limit=1000 mein-app
Protege contra fork bombs.
Límites de I/O
docker run --device-read-bps /dev/sda:10mb --device-write-bps /dev/sda:10mb mein-app
En Compose, estas opciones están disponibles como blkio_config.
Despliegue en Swarm
En Swarm, limits y reservations son cruciales para la programación:
deploy:
resources:
limits:
cpus: '1'
memory: 512M
reservations:
cpus: '0.5'
memory: 256M
Swarm coloca contenedores solo en nodos con suficientes recursos reservados.
Consejos
- Prueba los límites exhaustivamente.
- No los establezcas demasiado ajustados.
- Define las reservas de forma más conservadora.
- Monitorea eventos de OOM.
- Desactiva Swap en contenedores sensibles a la latencia.
- Usa CPU-Shares para priorización suave, límites duros para restricción absoluta.
Trampas comunes
- Límites demasiado ajustados: El contenedor se bloquea con OOM.
- Sin reserva: Swarm coloca contenedores mal.
- Swap ignorado: Rendimiento lento por falta de memoria.
- Unidad incorrecta:
1Gvs.1024M. - Cgroups del kernel: Los cgroups v1 antiguos pueden interpretar algunas opciones de manera diferente.
Enlaces y referencias adicionales
- BotServ.de Docker Container Restarts
- BotServ.de Docker Monitoring
- BotServ.de Docker Security
- BotServ.de Docker Swarm
FAQ: Límites de recursos en Docker
¿Cuál es la diferencia entre limits y reservations?
limits restringe al máximo, reservations reserva recursos para Swarm y programación.
¿Qué sucede en caso de OOM? El contenedor se termina y se reinicia según la política de reinicio.
¿Debo desactivar Swap? Sí, en aplicaciones que no toleran retrasos.
¿Puedo limitar la RAM de GPU? No con herramientas estándar de Docker. MGX y NVIDIA MIG permiten particionamiento de GPU.
¿Existen límites también en docker run?
Sí, con --cpus, --memory y otras opciones.
Fuentes y lecturas adicionales
- Docker Resource Constraints: https://docs.docker.com/config/containers/resource_constraints/
- Compose Resources: https://docs.docker.com/compose/compose-file/05-services/#resources
- cgroups: https://docs.kernel.org/admin-guide/cgroup-v2.html
Resumen: Establecer límites de recursos en Docker
Los límites de recursos protegen los hosts Docker del consumo excesivo y garantizan una distribución justa. CPU, RAM e I/O pueden limitarse. En Compose a través de deploy.resources y en docker run con --cpus y --memory. Quien establece límites realistas, utiliza reservas en Swarm y considera Swap, logra un entorno de contenedores estable y predecible.


