Cuando creamos un contenedor, los procesos que se ejecuten en él pueden usar todos los recursos del Host Docker en el que se está ejecutando. Puedes limitar los recursos de CPU y memoria al crear un contenedor en Docker utilizando las opciones --cpus y --memory respectivamente.

Limitando el uso de CPU

Lo primero que podemos averiguar es el número de CPUs que tiene el Host Docker, para ello ejecutamos el comando:

$ nproc --all

Para limitar la cantidad de recursos de CPU que puede utilizar un contenedor, puedes utilizar la opción --cpus. Puedes especificar la cantidad de CPUs que deseas asignar al contenedor, ya sea en términos de núcleos completos o fracciones de núcleos. Por ejemplo, para limitar un contenedor a utilizar un núcleo completo:

docker run -d --cpus 1 --name servidor_web httpd:2.4

Podríamos indicar que utilice medio núcleo (--cpus=0.5), o usar 2 núcleos (--cpus=2) o usar una fracción de cpu, por ejemplo el 75% (--cpus=0.75).

Cuando inspeccionas un contenedor Docker con el comando docker inspect, puedes utilizar el campo NanoCpus para ver la cantidad de CPU asignada al contenedor en unidades de nanocpus. Un nanocpu es una unidad de medida que representa la fracción de tiempo de CPU.

$ docker inspect --format '{{.HostConfig.NanoCpus}}' servidor_web

Este comando mostrará la cantidad de CPU asignada al contenedor en unidades de nanocpus. Ten en cuenta que la interpretación de estos valores puede no ser intuitiva, pero representan la capacidad de procesamiento relativa asignada al contenedor en comparación con la capacidad total del sistema.

Si deseas obtener información más legible, puedes convertir los nanocpus a CPUs utilizando los siguientes comandos:

nano_cpus=$(docker inspect --format '{{.HostConfig.NanoCpus}}' servidor_web)
cpus=$(echo "scale=2; $nano_cpus / 1000000000" | bc)
echo "CPUs asignadas al contenedor: $cpus"

Este fragmento de código convierte los nanocpus a CPUs dividiendo por 1000000000 (mil millones) utilizando la herramienta bc (calculadora de línea de comandos). La variable cpus contendrá la cantidad de CPUs asignadas al contenedor.

Limitando el uso de memoria

Para limitar la cantidad de memoria que puede utilizar un contenedor, puedes utilizar la opción --memory. Puedes especificar la memoria en bytes, kilobytes, megabytes, gigabytes, o utilizando el formato abreviado con las letras b, k, m, g. Por ejemplo para limitar un contenedor a 512 megabytes de memoria:

$ docker run -d --memory 512m --name servidor_web httpd:2.4

Con el comando docker stats podemos ver los recursos que está consumiendo un contenedor, y además vemos el límite de RAM que le hemos configurado:

$ docker stats servidor_web
CONTAINER ID   NAME           CPU %     MEM USAGE / LIMIT   MEM %     NET I/O       BLOCK I/O    PIDS
fd2ee83e755a   servidor_web   0.01%     6MiB / 512MiB       1.17%     4.25kB / 0B   0B / 4.1kB   82

También podemos usar docker inspect para ver el límite de memoria que hemos configurado en un contenedor:

$ docker inspect --format '{{.HostConfig.Memory}}' servidor_web

Este comando te dará el límite de memoria en bytes. Si deseas convertirlo a un formato más legible, puedes hacerlo utilizando las siguientes instrucciones en bash:

memory_limit=$(docker inspect --format '{{.HostConfig.Memory}}' servidor_web)
memory_limit_mb=$(echo "scale=2; $memory_limit / 1048576" | bc)
echo "Límite de memoria asignado al contenedor: $memory_limit_mb MB"

En este fragmento de código, estoy dividiendo el límite de memoria en bytes por 1048576 (que es 1024 al cubo) para convertirlo a megabytes.

Modificando los límites en tiempo de ejecución

Evidentemente podemos limitar la memoria y el número de CPUs utilizadas al mismo tiempo al crear un contenedor:

$ docker run -d --memory 512m --cpus 0.5 --name servidor_web httpd:2.4

Con la instrucción docker update podemos cambiar distintos parámetros de configuración de un contenedor que se está ejecutando, entre ellos podemos cambiar los límites de memoria y CPUs:

$ docker update --memory 1g --cpus 1.5 servidor_web

```

Actualizado: