Límites y reservas de recursos en Docker
Si algo nos permite Docker, es compartir infraestructura y recursos entre varios contenedores. Pero, ¿qué pasaría si un contenedor consume todos los recursos de la máquina? ¿Cómo se puede limitar el uso de recursos de un contenedor para evitar un fallo en un servidor o incluso la caída todal del mismo?
Peronalmente, ya me ha pasado alguna vez estar en en servidor personal haciendo pruebas en un contenedor, este consumir toda la memoria RAM del servidor y tirar todas las páginas web que tenía alojadas. Y, como de errores se aprende, en su momento no sabía que podía limitar los recursos de un contenedor, pero no me volverá a pasar (espero).
En este capítulo vamos a ver las distintas opciones que nos da Docker para limitar y controlar los recursos de nuestros contenedores. Además, este será el primer capítulo de la parte más avanzada del curso.
Opcciones de limitación de recursos
Docker nos permite limitar los recursos de CPU y memoria RAM principalmente, pero también podemos limitar otros recursos como la red o el disco.
Esto lo podemos hacer de varias formas, ya sea al crear el contenedor, con docker run
, o en un fichero compose.yml
con utilizando docker compose
. Aunque también podemos modificar estos límites en caliente con docker update
.
Vamos por partes.
Limitar CPU y memoria
Podemos limitar la cantidad de CPU y memoria que un contenedor puede utilizar. Para ello, utilizamos las opciones --cpus
y --memory
en el comando docker run
.
Por ejemplo, para limitar un contenedor a 1 CPU y 512MB de memoria, ejecutaríamos:
docker run -d --name my-container --cpus 1 --memory 512m nginx
En docker compose, lo haríamos de la siguiente forma:
version: '3'
services:
my-container:
image: nginx
deploy:
resources:
limits:
cpus: '1'
memory: 512m
Reservas de recursos
Además de limitar los recursos de un contenedor, también podemos reservar una cantidad mínima de recursos para un contenedor. Esto es útil para garantizar que contenedor los recursos que necesita para arrancar
La reserva de CPUs no funciona en docker run, pero sí en docker compose. Por ejemplo, para reservar 256MB de memoria, ejecutaríamos:
docker run -d --name my-container --memory-reservation 256m nginx
También podríamos completar el fichero compose.yml
anterior con estas opciones y también con la reserva de CPU:
version: '3'
services:
my-container:
image: nginx
deploy:
resources:
limits:
cpus: '1'
memory: 512m
reservations:
cpus: '0.5'
memory: 256m
Esto no signfica que el contenedor solo consumirá 256MB de memoria, sino que garantiza que siempre tendrá al menos 256MB de memoria disponible.
Modificar los límites en caliente
Si necesitamos modificar los límites de un contenedor en caliente, podemos hacerlo con el comando docker update
. Por ejemplo, para modificar la memoria de un contenedor a 1GB, ejecutaríamos:
docker update --memory 1g my-container
También podríamos con la cpu:
docker update --cpus 2 my-container
Conclusión
Limitar los recursos de un contenedor es una buena práctica para evitar que un contenedor consuma todos los recursos de la máquina y deje de funcionar. Del mismo modo, reservar una cantidad mínima de recursos garantiza que el contenedor tenga siempre los recursos necesarios para funcionar correctamente.
- Lista de vídeos en Youtube: Curso de Docker