Docker Compose - Hukommelsesgrænser

Docker Compose Memory Limits



Docker compose er et kraftfuldt værktøj. Det sparer tid og reducerer fejl, når du implementerer din Dockerized -applikation. Normalt er det ikke en god idé at køre hele stakken inklusive frontend, databaseserver osv. Inde fra en enkelt container.

Vi spinder forskellige containere op til at håndtere forskellige arbejdsbelastninger i en applikation, og vi bruger Docker Compose til at gøre dette let. Hver logisk forskellige arbejdsbyrde er angivet som en anden service . For eksempel vises din frontend -http -server som en frontend -service, der kører en Apache eller et Nginx -billede som en container.







Alle tjenesterne, deres netværksbehov, lagerkrav osv. Kan specificeres i en docker-compose.yml-fil. Vi vil fokusere på at specificere hukommelsesudnyttelse her.



Du skal bruge følgende værktøjer i dit arsenal til at følge med:



  1. Grundlæggende forståelse af Docker
  2. Docker til Windows eller Mac eller hvis du kører Linux, DockerCE til Linux
  3. Docker Compose binar y (Windows- og Mac -brugere vil allerede have dette installeret)

Vi holder os til version 2.4 for vores docker-compose.yml-filer, da det understøtter version 17.12 og nyere af Docker Engine og højere. Vi kunne have gået med version 3, som er nyere, men den understøtter ikke gammel hukommelsesbegrænsningssyntaks. Hvis du prøver at bruge den nyere syntaks, insisterer den på at bruge Docker i sværmtilstand i stedet. Så for at holde sagen enkel for almindelige Docker -brugere vil jeg holde mig til version 2.4





Det meste af koden ville fungere det samme for version 3, og hvor der vil være en forskel, vil jeg nævne den nyere syntaks for Docker Swarm -brugere.

Prøve ansøgning

Lad os prøve at køre en simpel Nginx-service på port 80 ved først at bruge CLI og derefter en simpel docker-compose.yml. I det næste afsnit skal vi undersøge dets hukommelsesbegrænsninger og udnyttelse og ændre vores docker-compose.yml for at se, hvordan de brugerdefinerede begrænsninger pålægges.



Lad os starte en simpel nginx-server ved hjælp af Docker-CLI:

$ docker run -d --navn my -nginx -p80:80nginx: seneste

Du kan se nginx -serveren fungere ved at besøge http: // localhost eller udskift lcoalhost

Med din Docker -værts IP -adresse. Denne beholder kan potentielt udnytte hele den tilgængelige hukommelse på din Docker -vært (i vores tilfælde er det cirka 2 GB). For at kontrollere hukommelsesudnyttelsen kan vi blandt andet bruge kommandoen:

$ docker stats my-nginx

CONTAINER ID NAME CPU % MEM BRUG/LIMIT MEM % NET I/O BLOCK I/O PIDS
6eb0091c0cf2 my-nginx0,00%2.133MiB / 1.934GiB0,11% 3,14 kB / 2,13 kB 0B / 0B2

MEM BRUG/LIMIT er på 2.133MiB ud af de samlede 1.934GiB. Lad os fjerne denne beholder og begynde at skrive docker-komponere scripts.

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

Tilsvarende ym -fil

Den nøjagtige beholder som ovenfor kan oprettes, hvis vi følger disse trin:

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

Vi opretter en ny tom mappe og opretter en fil docker-compose.yml i den. Når vi kører docker-compose fra denne mappe, vil den lede efter denne specifikke fil (ignorere alt andet) og oprette vores implementering i overensstemmelse hermed. Tilføj følgende indhold inde i denne .yml -fil.

version:'3'
tjenester:
min-nginx:
billede: nginx: seneste
havne:
-'80: 80 '

$ docker -komponer op -d

Flagget -d tilføjes, så de nyoprettede containere kører i baggrunden. Ellers vil terminalen knytte sig til containerne og begynde at udskrive rapporter fra den. Nu kan vi se statistikken for de nyoprettede containere:

$ docker statistik -all

CONTAINER ID NAME CPU% MEM BRUG/LIMIT MEM% NET I/O BLOCK I/O PIDS
5f8a1e2c08ac my-compose_my-nginx_10,00% 2,25MiB/1,934GiB0,11% 1,65 kB/0B 7,35 MB/0B2

Du vil bemærke, at en lignende beholder som før blev oprettet med lignende hukommelsesgrænser og endda udnyttelse. Fra den samme mappe, der indeholder yml -filen. Kør følgende kommando for at slette den nyoprettede container sammen med det kundebro -netværk, der blev oprettet.

$docker-komponer ned

Dette vil bringe dockeren tilbage til en ren tilstand med undtagelse af alle mængder, der blev oprettet (vi har ikke oprettet nogen, så det er ikke en bekymring.)

Hukommelsesgrænser og hukommelsesreservationer

Hukommelsesgrænser og hukommelsesreservationer er to forskellige aspekter for at sikre en gnidningsløs funktion af dine applikationer og den Docker -vært, du kører oven på.

Generelt pålægger Memory Limit en øvre grænse for mængden af ​​hukommelse, der potentielt kan bruges af en Docker -container. Som standard kan en Docker -container, ligesom enhver anden systemproces, bruge hele tilgængelig hukommelse for Docker -værten. Dette kan forårsage Out-of-Memory-Exception, og dit system kan meget vel gå ned. Selvom det aldrig kommer til det, kan det stadig sulte andre processer (herunder andre containere) fra værdifulde ressourcer og igen skade ydelsen. Hukommelsesgrænser sikrer, at ressourcehungrende containere ikke overskrider en vis grænse. Dette begrænser eksplosionsradius for en dårligt skrevet applikation til et par containere, ikke hele værten.

Hukommelsesreservationer er derimod mindre stive. Når systemet er ved at løbe tør for hukommelse og forsøger at genvinde noget af det. Det forsøger at bringe beholderens hukommelsesforbrug til eller under reservationsgrænsen. Hvis der er masser af hukommelse, kan applikationen dog udvide op til den hårdt indstillede hukommelsesgrænse.

At opsummere:

  1. Hukommelsesgrænse: En streng øvre grænse for mængden af ​​hukommelse, der stilles til rådighed for en beholder.
  2. Hukommelsesreservation: Dette bør indstilles som den minimale mængde hukommelse, som et program skal køre korrekt. Så det går ikke ned eller opfører sig forkert, når systemet forsøger at genvinde noget af hukommelsen.

Hvis hukommelsesreservation er større end hukommelsesgrænse, har hukommelsesgrænse forrang.

Angivelse af hukommelsesgrænser og forbehold

Version 2

Lad os gå tilbage til docker-compose.yml, vi skrev tidligere, og tilføje en hukommelsesgrænse til den. Skift version til 2.4 af grunde, der er beskrevet i afsnittet forudsætninger.

version:'2.4'
tjenester:
min-nginx:
billede: nginx: seneste
havne:
-'80: 80 '
mem_limit: 300m

Den sidste linje sætter grænsen for my-nginx service til 300MiB. Du kan bruge k til KiB og g til GiB og b til bare byte. Tallet før det skal dog være et heltal. Du kan ikke bruge værdier som 2,4 m, du skulle bruge 2400k i stedet. Nu hvis du kører:

$ docker stat --all

CONTAINER ID NAME CPU % MEM BRUG/LIMIT MEM % NET I/O BLOCK I/O PIDS
44114d785d0a my-compose_my-nginx_10,00% 2.141MiB/300MiB0,71% 1,16 kB/0B 0B/0B2

Du vil bemærke, at hukommelsesgrænsen er sat til 300 MiB. Det er lige let at indstille hukommelsesreservation, bare tilføj en linje mem_reservation: xxx i slutningen.

version:'2.4'
tjenester:
min-nginx:
billede: nginx: seneste
havne:
-'80: 80 '
mem_limit: 300m
mem_reservation: 100m

Version 3 (valgfri)

For at bruge version tre skal du køre Docker i sværmtilstand. For Windows og Mac kan du aktivere det ved hjælp af menuen Docker -indstillinger. Linux -brugere skal køre docker swarm init. Mere information om det kan findes her . Det er dog ikke et nødvendigt trin, og hvis du ikke har aktiveret det, er det også fint. Dette afsnit er for mennesker allerede kører i sværmetilstand og kan gøre brug af den nyere version.

version:'3'
tjenester:
min-nginx:
billede: nginx: seneste
havne:
-'80: 80 '
indsætte:
ressourcer:
grænser:
hukommelse: 300m
forbehold:
hukommelse: 100 m

Vi definerer alt dette under ressourcemulighed. Grænser og forbehold bliver deres egne primære nøgler, og hukommelse er kun en af ​​de mange ressourcer, der administreres her. CPU er endnu en vigtig parameter.

Yderligere information

Du kan lære mere om docker-compose fra den officielle dokumentation linket her . Når du først har forstået, hvordan du skriver en komponentfil, kan dokumentationen hjælpe dig med de forskellige parametre.

Du behøver ikke at vide alt, bare søg efter, hvad din applikation kræver, og referencen vil guide dig i implementeringen af ​​det.