Skip to content
BotServBotServ
DockerRecursoscgroupsLímitesMemoria

Establecer límites de recursos en Docker

Límites de CPU, RAM e IO para contenedores Docker. cgroups, Compose y reservas de memoria.

S

schutzgeist

3 min read
Establecer límites de recursos en Docker

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 limits y reservations.
  • 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: 1G vs. 1024M.
  • Cgroups del kernel: Los cgroups v1 antiguos pueden interpretar algunas opciones de manera diferente.

Enlaces y referencias adicionales

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

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.

Volver al blog
Share:

Entradas relacionadas