Docker Compose: límits de memòria

Docker Compose Memory Limits



Docker compose és una potent utilitat. Estalvia temps i redueix els errors en desplegar l'aplicació Dockerized. Normalment, no és una bona idea executar tota la pila, inclòs el frontend, el servidor de bases de dades, etc. des d’un mateix contenidor.

Girem diferents contenidors per gestionar diferents càrregues de treball d’una aplicació i fem servir Docker Compose per fer-ho fàcilment. Cada càrrega de treball lògicament diferent apareix com a diferent servei . Per exemple, el servidor http de frontend apareixerà com a servei de frontend que executa un Apache o una imatge Nginx com a contenidor.







Tots els serveis, les seves necessitats de xarxa, requisits d'emmagatzematge, etc. es poden especificar en un fitxer docker-compose.yml. Ens centrarem en especificar la utilització de la memòria aquí.



Necessiteu les eines següents al vostre arsenal per seguir-les:



  1. Comprensió bàsica de Docker
  2. Docker per a Windows o Mac o si utilitzeu Linux, DockerCE per a Linux
  3. Binari Docker Compose y (els usuaris de Windows i Mac ja ho tindran instal·lat)

Ens complirem amb la versió 2.4 dels nostres fitxers docker-compose.yml, ja que és compatible amb la versió 17.12 i superior de Docker Engine i versions posteriors. Podríem haver anat amb la versió 3, que és més recent, però no admet la sintaxi antiga de limitació de memòria. Si intenteu utilitzar la sintaxi més recent, insisteix a utilitzar Docker en mode Swarm. Així, per simplificar la qüestió per als usuaris habituals de Docker, em mantindré a la versió 2.4





La majoria del codi funcionaria igual per a la versió 3 i, si hi haurà diferències, mencionaré la sintaxi més recent per als usuaris de Docker Swarm.

Exemple d'aplicació

Intentem executar un servei Nginx senzill al port 80 utilitzant primer la CLI i després un simple docker-compose.yml. A la següent secció, explorarem les seves limitacions i ús de la memòria i modificarem el nostre docker-compose.yml per veure com s’imposen les limitacions personalitzades.



Comencem un servidor nginx senzill amb Docker-CLI:

$ docker run -d --name my-nginx -p80:80nginx: últim

Podeu veure el servidor nginx funcionant visitant http: // localhost o substituïu lcoalhost

Amb l'adreça IP del vostre amfitrió Docker. Aquest contenidor pot utilitzar tota la memòria disponible al vostre amfitrió Docker (en el nostre cas és d’uns 2 GB). Per comprovar l’ús de la memòria, entre altres coses, podem utilitzar l’ordre:

$ docker estadístiques my-nginx

ID DE CONTENIDOR NOM CPU% MEM UTILITZACIÓ / LÍMIT MEM% BLOC E / S BLOC E / S PIDS
6eb0091c0cf2 my-nginx0.00% 2,133MiB / 1,934GiB0.11% 3,14kB / 2,13kB 0B / 0B2

El MEM USAGE / LIMIT és de 2.133MiB del total de 1.934GiB. Eliminem aquest contenidor i comencem a escriure scripts de composició de docker.

$ docker stop my-nginx
$ docker rm my-nginx

Fitxer ym equivalent

Es pot crear el contenidor exacte de l'anterior si seguim aquests passos:

$ mkdir my-compose
$ cd my-compose
$ vim docker-compose.yml

Creem un nou directori buit i hi creem un fitxer docker-compose.yml. Quan executem docker-compose des d’aquest directori, cercarà aquest fitxer específic (ignorant tota la resta) i crearà el nostre desplegament en conseqüència. Afegiu el contingut següent dins d’aquest fitxer .yml.

versió:'3'
serveis:
my-nginx:
imatge: nginx: última
ports:
-'80: 80 '

$ docker-compose up -d

S'afegeix el senyalador -d perquè els contenidors de nova creació s'executin en segon pla. En cas contrari, el terminal es connectarà als contenidors i començarà a imprimir-ne informes. Ara podem veure les estadístiques dels contenidors acabats de crear:

$ docker stats -tot

ID DE CONTENIDOR NOM CPU% MEM UTILITZACIÓ / LÍMIT MEM% BLOC E / S BLOC E / S PIDS
5f8a1e2c08ac my-compose_my-nginx_10.00% 2,25MiB / 1,934GiB0.11% 1,65kB / 0B 7,35MB / 0B2

Notareu que es va crear un contenidor similar a l'anterior amb límits de memòria similars i fins i tot utilització. Des del mateix directori que conté el fitxer yml. Executeu l'ordre següent per suprimir el contenidor acabat de crear, juntament amb la xarxa de ponts de clients que es va crear.

$acoblador-redactar

Això tornarà el docker a un estat net, a excepció de tots els volums que s’hagin creat (no en vam crear cap, de manera que no ens preocupa).

Límits de memòria i reserves de memòria

Els límits de memòria i les reserves de memòria són dos aspectes diferents per garantir un bon funcionament de les vostres aplicacions i de l’amfitrió Docker que esteu executant.

A grans trets, Memory Limit imposa un límit superior a la quantitat de memòria que pot ser utilitzada per un contenidor Docker. Per defecte, un contenidor Docker, com qualsevol altre procés del sistema, pot utilitzar tota la memòria disponible de l'amfitrió Docker. Això pot provocar una excepció fora de memòria i el sistema pot fallar. Fins i tot si no s’arriba mai a això, encara pot morir de fam altres processos (inclosos altres contenidors) de recursos valuosos, perjudicant de nou el rendiment. Memory Limits garanteix que els contenidors que necessiten recursos no superin un límit determinat. Això limita el radi d'explosió d'una aplicació mal escrita a uns quants contenidors, no a tot l'amfitrió.

Les reserves de memòria, en canvi, són menys rígides. Quan el sistema es queda sense memòria i intenta recuperar-ne una part. Intenta que el consum de memòria del contenidor sigui inferior o inferior al límit de reserva. Tanmateix, si hi ha molta memòria, l’aplicació es pot expandir fins al límit de memòria establert.

Resumir:

  1. Límit de memòria: un límit estricte superior a la quantitat de memòria disponible per a un contenidor.
  2. Reserva de memòria: s'hauria d'establir com la quantitat mínima de memòria que necessita una aplicació per funcionar correctament. Per tant, no es bloqueja ni es comporta malament quan el sistema intenta recuperar part de la memòria.

Si la reserva de memòria és superior al límit de memòria, el límit de memòria té prioritat.

Especificació de límits de memòria i reserva

Versió 2

Tornem al docker-compose.yml que vam escriure anteriorment i hi afegim un límit de memòria. Canvieu la versió a 2.4 per les raons que es descriuen a la secció de requisits previs.

versió:'2.4'
serveis:
my-nginx:
imatge: nginx: última
ports:
-'80: 80 '
mem_limit: 300 m

L'última línia estableix el límit del servei my-nginx a 300 MB. Podeu utilitzar k per KiB, g per GiB eb per només bytes. Tanmateix, el nombre anterior ha de ser un nombre enter. No podeu fer servir valors com els 2,4 m, en lloc d’això hauríeu d’utilitzar 2400 k. Ara si corre:

$ docker stat --all

ID DE CONTENIDOR NOM CPU% MEM UTILITZACIÓ / LÍMIT MEM% BLOC E / S BLOC E / S PIDS
44114d785d0a my-compose_my-nginx_10.00% 2,141MiB / 300MiB0.71% 1,16kB / 0B 0B / 0B2

Notareu que el límit de memòria està establert a 300 MiB. Configurar la reserva de memòria és igual de senzill, només cal afegir una línia mem_reservation: xxx al final.

versió:'2.4'
serveis:
my-nginx:
imatge: nginx: última
ports:
-'80: 80 '
mem_limit: 300 m
mem_reservation: 100m

Versió 3 (opcional)

Per utilitzar la versió tres, cal que executeu Docker en mode swarm. Per a Windows i Mac, podeu habilitar-lo mitjançant el menú de configuració de Docker. Els usuaris de Linux haurien d’executar el docker swarm init. Es pot trobar més informació sobre això aquí . Però no és un pas necessari i, si no l’heu activat, també està bé. Aquesta secció és per a persones ja s’executa en mode eixam i pot fer ús de la versió més recent.

versió:'3'
serveis:
my-nginx:
imatge: nginx: última
ports:
-'80: 80 '
desplegar:
recursos:
límits:
memòria: 300m
reserves:
memòria: 100 m

Tot això ho definim a l’opció de recursos. Els límits i la reserva es converteixen en claus pròpies i la memòria és només un dels molts recursos que s’estan gestionant aquí. La CPU és un altre paràmetre important.

Més informació

Podeu obtenir més informació sobre Docker-Compose a la documentació oficial enllaçat aquí . Un cop obtingueu el resum de com escriure un fitxer de composició, la documentació us pot ajudar amb els paràmetres específics.

No ho heu de saber tot, només cal que cerqueu la vostra aplicació i la referència us guiarà a l’hora d’implementar-la.