Docker Compose - Límites de memoria

Docker Compose - Límites de memoria
Docker Compose es una poderosa utilidad. Ahorra tiempo y reduce los errores al implementar su aplicación dockerized. Por lo general, no es una gran idea ejecutar toda la pila, incluida la frontend, el servidor de la base de datos, etc. desde el interior de un solo contenedor.

Giramos diferentes contenedores para manejar diferentes cargas de trabajo de una aplicación y usamos Docker Compose para hacerlo fácilmente. Cada carga de trabajo lógicamente diferente se enumera como una servicio. Por ejemplo, su servidor HTTP frontend se enumerará como un servicio frontend que ejecuta un Apache o una imagen NGINX como contenedor.

Todos los servicios, sus necesidades de red, requisitos de almacenamiento, etc. se pueden especificar en un Docker-Compose.archivo YML. Nos centraremos en especificar la utilización de la memoria aquí.

Requisitos previos

Necesitaría las siguientes herramientas en su arsenal para seguir:

  1. Comprensión básica de Docker
  2. Docker para Windows o Mac o si está ejecutando Linux, Dockerce para Linux
  3. Docker Compose Binary (los usuarios de Windows y Mac ya tendrán esto instalado)

Nos apegaremos a la versión 2.4 para nuestro Docker-Compose.Archivos YML como lo admite la versión 17.12 y superior del motor Docker y más alto. Podríamos haber ido con la versión 3, que es más reciente, pero no admite la antigua sintaxis de limitación de memoria. Si intenta usar la sintaxis más nueva, insiste en usar Docker en modo enjambre, en su lugar. Entonces, para mantener la materia simple para los usuarios regulares de Docker, me quedaré con la versión 2.4

La mayor parte del código funcionaría igual para la versión 3, y donde habrá una diferencia, mencionaré la sintaxis más nueva para los usuarios de Docker Swarm.

Aplicación de muestra

Intentemos ejecutar un servicio Nginx simple en el puerto 80 utilizando primero la CLI y luego un Docker-Compose simple.YML. En la siguiente sección, exploraremos sus limitaciones y utilización de memoria y modificaremos nuestro Docker-Compose.YML para ver cómo se imponen las limitaciones personalizadas.

Comencemos un servidor NGINX simple usando Docker-Cli:

$ docker run -d - -name my -nginx -p 80:80 nginx: Último

Puede ver que el servidor NGINX funcione visitando http: // localhost o reemplazar lcoalhost

Con la dirección IP de su host de Docker. Este contenedor puede utilizar toda la memoria disponible en su host de Docker (en nuestro caso es de aproximadamente 2 GB). Para verificar la utilización de la memoria, entre otras cosas, podemos usar el comando:

$ Docker estadísticas my-nginx
Nombre de ID de contenedor CPU % MEM Uso/Límite MEM % PID de E/S NET de bloqueo de E/S
6EB0091C0CF2 my-nginx 0.00% 2.133MIB / 1.934GIB 0.11% 3.14kb / 2.13kb 0b / 0b 2

El uso/límite de MEM está en las 2.133MIB fuera del total 1.934GIB. Eliminemos este contenedor y comencemos a escribir scripts de compuesto Docker.

$ Docker Stop my-nginx
$ docker rm my-nginx

Archivo YML equivalente

El contenedor exacto como se puede crear si seguimos estos pasos:

$ mkdir mi compuesta
$ CD My-Compose
$ Vim Docker-Compose.YML

Creamos un nuevo directorio vacío y creamos un archivo Docker-Compose.yml en él. Cuando ejecutaremos Docker-Compose desde este directorio, buscará este archivo específico (ignorando todo lo demás) y creará nuestra implementación en consecuencia. Agregue el siguiente contenido dentro de este .archivo YML.

Versión: '3'
servicios:
my-nginx:
Imagen: Nginx: Último
Puertos:
- "80:80"
$ Docker -Compose Up -d

Se agrega la bandera -d para que los contenedores recién creados se ejecuten en segundo plano. De lo contrario, el terminal se adjuntará a los contenedores y comenzará a imprimir informes desde. Ahora podemos ver las estadísticas de los contenedores recién creados:

$ Docker Stats -LOl
Nombre de ID de contenedor CPU% MEM Uso/Límite MEM% PID de E/S NET de bloqueo de E/S
5F8A1E2C08AC MY-Compose_My-Nginx_1 0.00% 2.25MIB/1.934GIB 0.11% 1.65kb/0b 7.35mb/0b 2

Notará que se creó un contenedor similar como antes con límites de memoria similares e incluso utilización. Del mismo directorio que contiene el archivo YML. Ejecute el siguiente comando para eliminar el contenedor recién creado, junto con la red de puentes del cliente que se creó.

$ Docker-Compose Down

Esto devolverá a Docker a un estado limpio con la excepción de cualquier volumen que se creó (no creamos ninguno, por lo que no es una preocupación.)

Límites de memoria y reservas de memoria

Los límites de memoria y las reservas de memoria son dos aspectos diferentes para garantizar un funcionamiento suave de sus aplicaciones y el host de Docker que está ejecutando encima.

En términos generales, el límite de memoria impone un límite superior a la cantidad de memoria que puede ser utilizada por un contenedor Docker. Por defecto, un contenedor Docker, como cualquier otro proceso del sistema, puede usar toda la memoria disponible del host de Docker. Esto puede causar una excepción fuera de memoria y su sistema puede muy bien bloquearse. Incluso si nunca llega a eso, aún puede morir de hambre de otro proceso (incluidos otros contenedores) de recursos valiosos, nuevamente lastimando el rendimiento. Los límites de memoria aseguran que los contenedores hambrientos de recursos no superen un cierto límite. Esto limita el radio de explosión de una aplicación mal escrita a algunos contenedores, no todo el host.

Las reservas de memoria, por otro lado, son menos rígidas. Cuando el sistema se está quedando sin memoria e intenta reclamar algo de él. Intenta llevar el consumo de memoria del contenedor a o por debajo del límite de reserva. Sin embargo, si hay una gran cantidad de memoria, la aplicación puede expandirse hasta el límite de memoria de conjunto duro.

Para resumir:

  1. Límite de memoria: un límite superior estricto para la cantidad de memoria disponible para un contenedor.
  2. Reserva de la memoria: esto debe establecerse como la cantidad mínima de memoria que una aplicación debe ejecutarse correctamente. Por lo tanto, no se bloquea ni se porta mal cuando el sistema intenta reclamar parte de la memoria.

Si la reserva de memoria es mayor que el límite de memoria, el límite de memoria tiene prioridad.

Especificando los límites de memoria y la reserva

Versión 2

Volvamos al Docker-Compose.YML escribimos anteriormente y le agregamos un límite de memoria. Cambiar la versión a 2.4 por razones discutidas en la sección de requisitos previos.

versión 2.4 '
servicios:
my-nginx:
Imagen: Nginx: Último
Puertos:
- "80:80"
MEM_LIMIT: 300m

La última línea establece el límite para el servicio My-Nginx a 300MIB. Puedes usar k para kib y g para gib y b para solo bytes. Sin embargo, el número anterior debe ser un entero. No puedes usar valores como 2.4m, tendrías que usar 2400k en su lugar. Ahora si corres:

$ Docker STAT -Enlly
Nombre de ID de contenedor CPU % MEM Uso/Límite MEM % PID de E/S NET de bloqueo de E/S
44114d785d0a my-compose_my-nginx_1 0.00% 2.141MIB/300MIB 0.71% 1.16kb/0b 0b/0b 2

Notarás que el límite de memoria está configurado en 300 MIB. Configuración de la reserva de memoria es igualmente fácil, solo agregue una línea mem_reservación: xxx al final.

versión 2.4 '
servicios:
my-nginx:
Imagen: Nginx: Último
Puertos:
- "80:80"
MEM_LIMIT: 300m
MEM_RESERVACIÓN: 100m

Versión 3 (opcional)

Para usar la versión tres, debe ejecutar Docker en modo enjambre. Para Windows y Mac, puede habilitarlo usando el menú Configuración de Docker. Los usuarios de Linux deberían ir a ejecutar Docker Swarm Init. Más información sobre eso se puede encontrar aquí. Sin embargo, no es un paso necesario, y si no lo ha habilitado, también está bien. Esta sección es para personas ya Ejecutar en modo enjambre y puede hacer uso de la versión más nueva.

Versión: '3'
servicios:
my-nginx:
Imagen: Nginx: Último
Puertos:
- "80:80"
desplegar:
recursos:
Límites:
Memoria: 300m
Reservas:
Memoria: 100m

Definimos todo esto bajo la opción de recursos. Los límites y la reserva se convierten en claves principales y la memoria son solo uno de los muchos recursos que se gestionan aquí. CPU es otro parámetro importante.

Más información

Puede obtener más información sobre Docker-Compose de la documentación oficial vinculada aquí. Una vez que obtenga la esencia de cómo escribir un archivo de composición, la documentación puede ayudarlo con los detalles de varios parámetros.

No tiene que saberlo todo, solo busque lo que requiere su aplicación y la referencia lo guiaría para implementar que.