Docker Compose - Minnesgränser

Docker Compose Memory Limits



Docker compose är ett kraftfullt verktyg. Det sparar tid och minskar fel när du distribuerar din Dockerized -applikation. Vanligtvis är det ingen bra idé att köra hela stacken inklusive frontend, databaseserver, etc. inifrån en enda container.

Vi snurrar upp olika behållare för att hantera olika arbetsbelastningar för en applikation och vi använder Docker Compose för att göra detta enkelt. Varje logiskt olika arbetsbelastning listas som en annan service . Till exempel visas din frontend -http -server som en frontend -tjänst som kör en Apache- eller en Nginx -avbildning som en behållare.







Alla tjänster, deras nätverksbehov, lagringskrav etc. kan specificeras i en docker-compose.yml-fil. Vi kommer att fokusera på att specificera minnesanvändning här.



Du behöver följande verktyg i din arsenal för att följa med:



  1. Grundläggande förståelse för Docker
  2. Docker för Windows eller Mac eller om du kör Linux, DockerCE för Linux
  3. Docker Compose binar y (Windows- och Mac -användare har redan detta installerat)

Vi kommer att hålla fast vid version 2.4 för våra docker-compose.yml-filer eftersom det stöder version 17.12 och senare av Docker Engine och högre. Vi kunde ha gått med version 3 som är nyare men den stöder inte gammal minnesbegränsningssyntax. Om du försöker använda den nyare syntaxen, insisterar den på att använda Docker i svärmläge istället. Så för att hålla saken enkel för vanliga Docker -användare håller jag mig till version 2.4





Det mesta av koden skulle fungera precis samma för version 3, och där det blir skillnad kommer jag att nämna den nyare syntaxen för Docker Swarm -användare.

Provapplikation

Låt oss försöka köra en enkel Nginx-tjänst på port 80 med först CLI och sedan en enkel docker-compose.yml. I nästa avsnitt ska vi utforska dess minnesbegränsningar och utnyttjande och ändra vår docker-compose.yml för att se hur de anpassade begränsningarna införs.



Låt oss starta en enkel nginx-server med Docker-CLI:

$ docker run -d --name my -nginx -p80:80nginx: senaste

Du kan se nginx -servern fungera genom att besöka http: // localhost eller byt ut lcoalhost

Med din Docker -värd IP -adress. Den här behållaren kan eventuellt använda hela tillgängligt minne på din Docker -värd (i vårt fall handlar det om 2 GB). För att bland annat kontrollera minnesutnyttjandet kan vi använda kommandot:

$ docker stats my-nginx

CONTAINER ID NAME CPU % MEM ANVÄNDNING/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 ANVÄNDNING/LIMIT är på 2.133MiB av den totala 1.934GiB. Låt oss ta bort den här behållaren och börja skriva docker-komponera skript.

$ docker stoppa my-nginx
$ docker rm my-nginx

Motsvarande ym -fil

Den exakta behållaren enligt ovan kan skapas om vi följer dessa steg:

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

Vi skapar en ny tom katalog och skapar en fil docker-compose.yml i den. När vi kör docker-komponera upp från den här katalogen, kommer den att leta efter den här specifika filen (ignorerar allt annat) och skapa vår distribution därefter. Lägg till följande innehåll i denna .yml -fil.

version:'3'
tjänster:
min-nginx:
bild: nginx: senaste
hamnar:
-'80: 80 '

$ docker -komponera upp -d

Flaggan -d läggs till så att de nyskapade behållarna körs i bakgrunden. Annars kommer terminalen att ansluta sig till behållarna och börja skriva ut rapporter från den. Nu kan vi se statistiken för de nyskapade behållarna:

$ docker statistik -all

CONTAINER ID NAME CPU% MEM ANVÄNDNING/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 kommer att märka att en liknande behållare som tidigare skapades med liknande minnesgränser och till och med utnyttjande. Från samma katalog som innehåller yml -filen. Kör följande kommando för att ta bort den nyskapade behållaren tillsammans med det kundbryggnätverk som skapades.

$docker-komponera ner

Detta kommer att återställa dockaren till ett rent tillstånd med undantag för alla volymer som skapades (vi skapade inga så det är inget problem.)

Minnesgränser och minnesreservationer

Minnesgränser och minnesreservationer är två olika aspekter för att säkerställa en smidig funktion av dina applikationer och Docker -värden du kör ovanpå.

I stort sett sätter Memory Limit en övre gräns för mängden minne som eventuellt kan användas av en Docker -behållare. Som standard kan en Docker -behållare, precis som alla andra systemprocesser, använda hela tillgängligt minne för Docker -värden. Detta kan orsaka out-of-memory-exception och ditt system kan mycket väl krascha. Även om det aldrig kommer till det kan det fortfarande svälta andra processer (inklusive andra behållare) från värdefulla resurser, vilket igen skadar prestandan. Minnesgränser säkerställer att resurssugna behållare inte överskrider en viss gräns. Detta begränsar sprängradien för en dåligt skriven applikation till några behållare, inte hela värden.

Minnesreservationer är å andra sidan mindre styva. När systemet håller på att ta slut på minne och försöker ta tillbaka en del av det. Den försöker få behållarens minnesförbrukning till eller under bokningsgränsen. Om det finns ett överflöd av minne kan programmet dock expandera upp till den hårda uppsatta minnesgränsen.

För att sammanfatta:

  1. Minnesgräns: En strikt övre gräns för mängden minne som görs tillgänglig för en behållare.
  2. Minnesreservation: Detta bör anges som den minsta minsta mängden minne som en applikation behöver för att fungera korrekt. Så det kraschar inte eller uppför sig fel när systemet försöker ta tillbaka en del av minnet.

Om minnesreservationen är större än minnesgränsen har minnesgränsen företräde.

Ange minnesgränser och reservationer

Version 2

Låt oss gå tillbaka till docker-compose.yml vi skrev tidigare och lägga till en minnesgräns för den. Ändra versionen till 2,4 av skäl som diskuteras i avsnittet förkunskaper.

version:'2.4'
tjänster:
min-nginx:
bild: nginx: senaste
hamnar:
-'80: 80 '
mem_limit: 300m

Den sista raden sätter gränsen för my-nginx-tjänsten till 300MiB. Du kan använda k för KiB och g för GiB och b för bara byte. Antalet före det måste dock vara ett heltal. Du kan inte använda värden som 2,4 m, du måste istället använda 2400k. Nu om du kör:

$ docker stat --all

CONTAINER ID NAME CPU % MEM ANVÄNDNING/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 kommer att märka att minnesgränsen är inställd på 300 MiB. Att ställa in minnesreservation är lika enkelt, lägg bara till en rad mem_reservation: xxx i slutet.

version:'2.4'
tjänster:
min-nginx:
bild: nginx: senaste
hamnar:
-'80: 80 '
mem_limit: 300m
mem_reservation: 100m

Version 3 (tillval)

För att använda version tre måste du köra Docker i svärmläge. För Windows och Mac kan du aktivera det med Docker -inställningsmenyn. Linux -användare skulle behöva köra docker swarm init. Mer information om det finns här . Det är dock inte ett nödvändigt steg, och om du inte har aktiverat det är det också bra. Detta avsnitt är för människor redan körs i svärmläge och kan använda den nyare versionen.

version:'3'
tjänster:
min-nginx:
bild: nginx: senaste
hamnar:
-'80: 80 '
distribuera:
Resurser:
gränser:
minne: 300m
bokningar:
minne: 100m

Vi definierar allt detta under resursalternativ. Gränser och reservationer blir sina egna primära nycklar och minnet är bara en av de många resurser som hanteras här. CPU är ännu en viktig parameter.

Vidare information

Du kan lära dig mer om docker-komponera från den officiella dokumentationen länkad här . När du väl har fått kärnan i hur du skriver en komponeringsfil kan dokumentationen hjälpa dig med specifika parametrar.

Du behöver inte veta allt, sök bara efter vad din applikation kräver och referensen hjälper dig att implementera det.