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í.
Necesitaría las siguientes herramientas en su arsenal para seguir:
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: ÚltimoPuede 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-nginxEl 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-nginxArchivo YML equivalente
El contenedor exacto como se puede crear si seguimos estos pasos:
$ mkdir mi compuestaCreamos 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'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 -LOlNotará 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:
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 '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 -EnllyNotará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 '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'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.
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.