How do I set resource limits in Docker?

Establecer límites de recursos en Docker es esencial para optimizar el rendimiento y evitar el acaparamiento de recursos. Utiliza banderas como `--memory`, `--cpus` y `--cpuset-cpus` al crear contenedores para gestionar de manera efectiva la asignación de CPU y memoria.
Índice
Cómo configurar límites de recursos en Docker 2

Cómo Establecer Límites de Recursos en Docker: Guía Avanzada

Docker ha revolucionado la forma en que construimos, distribuimos y ejecutamos aplicaciones al permitir a los desarrolladores empaquetar sus aplicaciones y dependencias en contenedores. Esta tecnología de contenedores incluye multitud de funciones, entre las cuales la capacidad de establecer límites de recursos es crucial para garantizar que tus aplicaciones se ejecuten de manera eficiente y no consuman recursos del sistema excesivos. En este artículo, profundizaremos en cómo gestionar los límites de recursos en los contenedores de Docker, exploraremos las diversas opciones disponibles y comprenderemos las implicaciones de estas configuraciones.

Understanding Docker Resource Management

Antes de profundizar en los detalles de cómo establecer límites de recursos, es fundamental comprender qué implica la gestión de recursos en Docker. Esta gestión permite especificar la cantidad de CPU, memoria y E/S que puede consumir un contenedor de Docker. Al imponer límites, se puede evitar que un solo contenedor monopolice los recursos del sistema, garantizando así que otros contenedores y el sistema anfitrión mantengan un alto rendimiento y estabilidad.

Docker utiliza tanto límites duros como suaves para la gestión de recursos:

  • Límites absolutos: Estos límites son estrictos y no pueden ser superados bajo ninguna circunstancia. Por ejemplo, si estableces un límite de memoria, el contenedor será terminado si intenta exceder ese límite.

  • Soft Limits: Estos límites permiten cierta flexibilidad. Por ejemplo, con las CPU shares, un contenedor puede utilizar más recursos de CPU cuando están disponibles, pero se limitará cuando compita con otros contenedores por el tiempo de CPU.

Setting Resource Limits for CPU

Docker ofrece varias opciones para controlar la asignación de recursos de CPU, incluyendo:- **CPU Shares**: Permite establecer una proporción relativa de CPU que se asignará a un contenedor en comparación con otros contenedores. Por ejemplo, si un contenedor tiene 1024 shares y otro tiene 512, el primero recibirá el doble de tiempo de CPU que el segundo.- **CPU Period**: Define el período de tiempo (en microsegundos) para el cual se mide el uso de CPU. El valor predeterminado es 100000 (100ms).- **CPU Quota**: Especifica la cantidad máxima de tiempo de CPU (en microsegundos) que un contenedor puede usar durante cada período de CPU. Por ejemplo, si el período es 100000 y la cuota es 50000, el contenedor puede usar hasta el 50% de un núcleo de CPU.- **CPU Set**: Permite restringir un contenedor a un conjunto específico de núcleos de CPU. Por ejemplo, puedes asignar un contenedor para que solo use los núcleos 0 y 1.- **CPU Affinity**: Similar al CPU Set, pero permite una mayor flexibilidad al especificar qué núcleos de CPU puede usar un contenedor.- **CPU CFS (Completely Fair Scheduler)**: Es el programador de CPU predeterminado en Linux. Docker utiliza CFS para gestionar la asignación de CPU entre contenedores.- **CPU Limit**: Establece un límite máximo en el uso de CPU para un contenedor. Por ejemplo, puedes limitar un contenedor para que no use más del 80% de un núcleo de CPU.- **CPU Reservation**: Garantiza que un contenedor recibirá una cantidad mínima de tiempo de CPU, incluso si otros contenedores están usando la mayoría de los recursos.- **CPU Priority**: Permite establecer una prioridad para un contenedor, lo que influye en la cantidad de tiempo de CPU que recibe en comparación con otros contenedores.- **CPU Burst**: Permite que un contenedor use más CPU de la que se le ha asignado durante un corto período de tiempo, si los recursos están disponibles.Estas opciones se pueden combinar para crear configuraciones de CPU personalizadas que se adapten a las necesidades específicas de tus aplicaciones y cargas de trabajo. --cpus, --cpu-shares, and --cpus del conjunto de cpus.

1. Usando --cpus

El --cpus La opción --cpus te permite limitar el número total de CPUs que puede utilizar un contenedor. Por ejemplo, si quieres restringir un contenedor para que use solo 2 CPUs, puedes ejecutar:```bash docker run --cpus=2 ```Esto garantiza que el contenedor no consuma más de 2 CPUs, lo que es útil para controlar el uso de recursos en entornos compartidos.

docker run --cpus="2.0" mi_app

You can specify fractional values as well. If you set it to 0.5, the container will be allowed to use half of one CPU core.

2. Using --cpu-shares

El --cpu-shares La opción es una forma de especificar el peso relativo de la asignación de CPU para un contenedor. Por defecto, Docker establece la participación de CPU en 1024. Si ejecutas un contenedor con --cpu-shares=512, it will receive half the CPU time compared to containers with the default share under heavy load.

Ejemplo:

docker run --cpu-shares=512 my_app

En este caso, el contenedor recibirá tiempo de CPU en función del peso que haya asignado en relación con los demás.

3. Usando --cpus del conjunto de cpus

El --cpus del conjunto de cpus option allows you to specify which logical CPUs (cores) a container can run on. This is especially useful for multi-core systems where you may want to restrict a container to a specific set of CPUs.

Ejemplo:

docker run --cpuset-cpus="0,1" mi_app

En este caso, el contenedor solo puede ejecutarse en los núcleos de CPU 0 y 1.

Establecer límites de recursos para la memoriaEn este capítulo, aprenderá a establecer límites de recursos para la memoria. Los límites de recursos para la memoria se establecen de la misma manera que los límites de recursos para la CPU. Para establecer límites de recursos para la memoria, utilice la opción --memory. Por ejemplo, para establecer un límite de memoria de 128 MB para un contenedor, ejecute el siguiente comando:``` # docker run -d --name ch5_mariadb --memory 128m \ -v /var/ch5_mariadb:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=mypass \ -e MYSQL_DATABASE=my_data \ -e MYSQL_USER=vsftpd \ -e MYSQL_PASSWORD=mypass \ mariadb:latest ```En este ejemplo, el límite de memoria se establece en 128 MB. El contenedor no podrá utilizar más de 128 MB de memoria. Si el contenedor intenta utilizar más de 128 MB de memoria, se detendrá.También puede establecer un límite de memoria suave utilizando la opción --memory-reservation. Un límite de memoria suave es un límite que el contenedor puede superar temporalmente. Sin embargo, si el contenedor supera el límite de memoria suave durante un período prolongado de tiempo, se detendrá.Por ejemplo, para establecer un límite de memoria suave de 64 MB para un contenedor, ejecute el siguiente comando:``` # docker run -d --name ch5_mariadb --memory 128m \ --memory-reservation 64m \ -v /var/ch5_mariadb:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=mypass \ -e MYSQL_DATABASE=my_data \ -e MYSQL_USER=vsftpd \ -e MYSQL_PASSWORD=mypass \ mariadb:latest ```En este ejemplo, el contenedor puede utilizar hasta 128 MB de memoria. Sin embargo, si el contenedor utiliza más de 64 MB de memoria durante un período prolongado de tiempo, se detendrá.Es importante tener en cuenta que los límites de recursos para la memoria no son absolutos. El contenedor puede utilizar más memoria de la que se ha establecido si el sistema operativo host tiene memoria disponible. Sin embargo, si el sistema operativo host se queda sin memoria, el contenedor se detendrá.

Memory limits can be set using the --memoria and --memoria-de-intercambio options.

1. Usando --memoria

El --memoria La opción de bandera te permite limitar la cantidad de memoria que puede utilizar un contenedor. Si un contenedor excede este límite, será eliminado y potencialmente reiniciado si tienes una política de reinicio establecida.

Ejemplo:

docker run --memory="512m" mi_aplicación

Este comando limita el contenedor a usar un máximo de 512 MB de RAM.

2. Using --memoria-de-intercambio

El --memoria-de-intercambio La opción te permite establecer un límite en la cantidad total de memoria más swap que puede utilizar un contenedor. Si se establece en -1, el contenedor puede usar swap ilimitado.

Ejemplo:

docker run --memory="512m" --memory-swap="1g" my_app

En este escenario, el contenedor puede utilizar hasta 512 MB de memoria física y hasta 1 GB de memoria de intercambio.

Establecer límites de E/S

In addition to CPU and memory, Docker also allows you to set limits on block I/O using the --blkio-weight Esta opción define el peso de las E/S de bloques del contenedor en relación con otros contenedores.

Usando --blkio-weight

El --blkio-weight La opción acepta un valor entre 10 y 1000, donde 10 es la prioridad más baja y 1000 es la más alta.

Ejemplo:

docker run --peso-de-e-s-de-bloque=500 my_app

Este comando establece una prioridad media para las operaciones de E/S del contenedor, permitiendo que funcione de manera razonable sin sobrecargar el sistema.

Prácticas recomendadas para límites de recursosEn este capítulo, aprenderá a establecer límites de recursos para sus pods. Los límites de recursos son una parte importante de la administración de recursos en Kubernetes. Los límites de recursos le permiten controlar la cantidad de recursos que un pod puede usar. Esto es importante porque evita que un pod use demasiados recursos y afecte negativamente a otros pods en el mismo nodo.Los límites de recursos se establecen en el archivo de manifiesto del pod. El archivo de manifiesto es un archivo YAML que describe el pod y sus recursos. El archivo de manifiesto incluye una sección de especificación que define los recursos que el pod necesita. La sección de especificación incluye los límites de recursos que el pod puede usar.Los límites de recursos se establecen utilizando las siguientes claves:- requests.cpu: La cantidad mínima de CPU que el pod necesita. - requests.memory: La cantidad mínima de memoria que el pod necesita. - limits.cpu: La cantidad máxima de CPU que el pod puede usar. - limits.memory: La cantidad máxima de memoria que el pod puede usar.Los límites de recursos se establecen en unidades de medida específicas. Las unidades de medida para CPU son milicores. Un milicore es 1/1000 de un núcleo de CPU. Las unidades de medida para memoria son bytes. Puede usar las siguientes abreviaturas para especificar la cantidad de memoria:- K: Kilobyte - M: Megabyte - G: Gigabyte - T: Terabyte - P: Petabyte - E: ExabytePor ejemplo, si desea establecer un límite de CPU de 500 milicores y un límite de memoria de 128 megabytes, puede usar el siguiente archivo de manifiesto:```yaml apiVersion: v1 kind: Pod metadata: name: my-pod spec: containers: - name: my-container image: my-image resources: requests: cpu: 500m memory: 128Mi limits: cpu: 1000m memory: 256Mi ```En este ejemplo, el pod solicita 500 milicores de CPU y 128 megabytes de memoria. El pod también tiene un límite de 1000 milicores de CPU y 256 megabytes de memoria.Los límites de recursos son importantes porque evitan que un pod use demasiados recursos y afecte negativamente a otros pods en el mismo nodo. Si un pod intenta usar más recursos de los que se le han asignado, el kubelet matará el pod y lo reiniciará.Los límites de recursos también son importantes porque permiten que Kubernetes planifique los pods de manera más eficiente. Kubernetes utiliza los límites de recursos para determinar qué nodos son adecuados para ejecutar un pod. Si un pod tiene límites de recursos altos, Kubernetes intentará programarlo en un nodo con suficientes recursos disponibles.En resumen, los límites de recursos son una parte importante de la administración de recursos en Kubernetes. Los límites de recursos le permiten controlar la cantidad de recursos que un pod puede usar. Los límites de recursos se establecen en el archivo de manifiesto del pod y se utilizan para evitar que un pod use demasiados recursos y afecte negativamente a otros pods en el mismo nodo.

Setting resource limits in Docker is essential for maintaining a stable and efficient environment. Here are some best practices to consider:

1. Analizar el uso de recursos

Antes de establecer límites, monitorea el uso de recursos de tus aplicaciones para comprender sus requisitos. Herramientas como docker stats puede proporcionar una visión en tiempo real del consumo de recursos de los contenedores en ejecución.

2. Comience con Límites Conservadores

Inicialmente, establezca límites conservadores y ajústelos gradualmente en función del rendimiento de la aplicación y las necesidades de recursos. Este enfoque puede ayudar a prevenir la degradación del rendimiento y garantizar la estabilidad del sistema.

3. Prueba bajo carga

Prueba tus contenedores bajo carga para determinar cómo se comportan con los límites impuestos. Esta prueba puede ayudar a identificar cuellos de botella o problemas antes de desplegar en un entorno de producción.

4. Use Resource Quotas in Swarm Mode

Si estás utilizando Docker Swarm, considera usar cuotas de recursos para limitar los recursos totales disponibles para un servicio. Esto puede ayudar a gestionar los recursos en múltiples contenedores que se ejecutan en un Swarm.

Advanced Resource Management Techniques

Además de los límites básicos de recursos, Docker admite características avanzadas para administrar los recursos de manera efectiva.

1. Cgroups

Docker utilizes Linux Control Groups (cgroups) for resource management. Cgroups allow you to allocate resources and enforce limits on a group of processes. While Docker handles cgroup configurations automatically, understanding how cgroups work can help you troubleshoot issues and optimize settings.

2. Monitoring and Alerts

Implementa herramientas de monitoreo que puedan rastrear el uso de recursos a lo largo del tiempo y alertarte cuando se acerquen los límites. Herramientas como Prometheus y Grafana pueden integrarse con Docker para proporcionar información integral sobre el rendimiento de los contenedores.

3. Resource Limits in Docker Compose

When defining services in a Docker Compose file, you can also specify resource limits directly in the YAML configuration. Here’s an example:

versión: '3.8'
servicios:
  my_app:
    imagen: my_app_image
    implementación:
      recursos:
        límites:
          cpus: '0.5'
          memoria: 512M

Conclusión

Setting resource limits in Docker is a vital aspect of application management that ensures efficient resource utilization and maintains system stability. By leveraging CPU, memory, and I/O constraints, you can create a more predictable and manageable environment for your applications. Understanding the nuances of each option and implementing best practices will enable you to harness the full potential of Docker without sacrificing performance.

A medida que las aplicaciones nativas de la nube siguen creciendo en complejidad y escala, dominar la gestión de recursos en Docker será cada vez más valioso. Con las técnicas y el monitoreo adecuados, puedes crear aplicaciones robustas, eficientes y escalables que puedan prosperar en un entorno contenerizado. Ya sea que estés gestionando un puñado de contenedores u orquestando miles a través de un clúster, la gestión efectiva de recursos es clave para tu éxito.