Docker Compose - Minnegrenser

Docker Compose Memory Limits



Docker compose er et kraftig verktøy. Det sparer tid og reduserer feil når du distribuerer Dockerized -appen din. Vanligvis er det ikke en god idé å kjøre hele bunken inkludert frontend, databaseserver osv. Fra en enkelt beholder.

Vi spinner opp forskjellige beholdere for å håndtere forskjellige arbeidsmengder i et program, og vi bruker Docker Compose for å gjøre dette enkelt. Hver logisk forskjellig arbeidsmengde er oppført som en annen service . For eksempel vil frontend -http -serveren din bli oppført som en frontend -tjeneste som kjører et Apache- eller et Nginx -bilde som en beholder.







Alle tjenestene, nettverksbehov, lagringskrav osv. Kan spesifiseres i en docker-compose.yml-fil. Vi vil fokusere på å spesifisere minnebruk her.



Du trenger følgende verktøy i arsenalet ditt for å følge med:



  1. Grunnleggende forståelse av Docker
  2. Docker for Windows eller Mac eller hvis du kjører Linux, DockerCE for Linux
  3. Docker Compose binar y (Windows- og Mac -brukere vil allerede ha dette installert)

Vi holder oss til versjon 2.4 for våre docker-compose.yml-filer som støtter versjon 17.12 og nyere av Docker Engine og høyere. Vi kunne ha gått med versjon 3 som er nyere, men den støtter ikke gammel minnebegrensningssyntaks. Hvis du prøver å bruke den nyere syntaksen, insisterer den på å bruke Docker i svermemodus i stedet. Så for å holde saken enkel for vanlige Docker -brukere, vil jeg holde meg til versjon 2.4





Det meste av koden vil fungere akkurat det samme for versjon 3, og hvor det vil være en forskjell, vil jeg nevne den nyere syntaksen for Docker Swarm -brukere.

Eksempelapplikasjon

La oss prøve å kjøre en enkel Nginx-tjeneste på port 80 ved å bruke først CLI og deretter en enkel docker-compose.yml. I neste avsnitt skal vi utforske minnebegrensninger og utnyttelse og endre docker-compose.yml for å se hvordan de tilpassede begrensningene pålegges.



La oss starte en enkel nginx-server ved hjelp av Docker-CLI:

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

Du kan se nginx -serveren fungere ved å besøke http: // localhost eller bytt ut lcoalhost

Med IP -adressen til Docker -verten din. Denne beholderen kan potensielt utnytte hele tilgjengelig minne på Docker -verten din (i vårt tilfelle er det omtrent 2 GB). For å kontrollere blant annet minnebruk, kan vi bruke kommandoen:

$ docker stats my-nginx

CONTAINER ID NAME CPU % MEM BRUK/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 BRUK/LIMIT er på 2.133MiB av den totale 1.934GiB. La oss fjerne denne beholderen og begynne å skrive docker-komponere skript.

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

Tilsvarende ym -fil

Den nøyaktige beholderen som ovenfor kan opprettes hvis vi følger disse trinnene:

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

Vi oppretter en ny tom katalog og lager en fil docker-compose.yml i den. Når vi skal kjøre docker-compose fra denne katalogen, vil den se etter denne spesifikke filen (ignorere alt annet) og opprette distribusjonen vår deretter. Legg til følgende innhold i denne .yml -filen.

versjon:'3'
tjenester:
min-nginx:
bilde: nginx: siste
porter:
-'80: 80 '

$ docker -compose up -d

Flagget -d legges til slik at de nyopprettede beholderne kjøres i bakgrunnen. Ellers vil terminalen feste seg til beholderne og begynne å skrive ut rapporter fra den. Nå kan vi se statistikken for de nyopprettede beholderne:

$ docker statistikk -all

CONTAINER ID NAME CPU% MEM BRUK/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 legge merke til at en lignende beholder som før ble opprettet med lignende minnegrenser og til og med utnyttelse. Fra den samme katalogen som inneholder yml -filen. Kjør følgende kommando for å slette den nylig opprettede beholderen, sammen med kundebro -nettverket som ble opprettet.

$docker-komponer ned

Dette vil sette dockeren tilbake til en ren tilstand med unntak av alle volumer som ble opprettet (vi opprettet ikke noen, så det er ikke en bekymring.)

Minnegrenser og minneservasjoner

Minnegrenser og minneservasjoner er to forskjellige aspekter for å sikre at applikasjonene dine og Docker -verten du kjører på, fungerer problemfritt.

Generelt setter Memory Limit en øvre grense for mengden minne som potensielt kan brukes av en Docker -beholder. Som standard kan en Docker -beholder, som enhver annen systemprosess, bruke hele tilgjengelig minne til Docker -verten. Dette kan forårsake Out-of-Memory-Exception, og systemet ditt kan godt krasje. Selv om det aldri kommer til det, kan det fortsatt sulte andre prosesser (inkludert andre beholdere) fra verdifulle ressurser, og igjen skade ytelsen. Minnegrenser sikrer at ressurssultne beholdere ikke overskrider en viss grense. Dette begrenser eksplosjonsradiusen til en dårlig skrevet applikasjon til noen få beholdere, ikke hele verten.

Memory Reservations, derimot, er mindre stive. Når systemet har lite minne og prøver å gjenvinne noe av det. Den prøver å bringe beholderens minneforbruk på eller under reservasjonsgrensen. Hvis det er mye minne, kan programmet imidlertid utvide seg til den hardt angitte minnegrensen.

Å oppsummere:

  1. Minnegrense: En streng øvre grense for mengden minne som er gjort tilgjengelig for en beholder.
  2. Minnereservasjon: Dette bør angis som den minimale mengden minne som et program trenger for å kjøre skikkelig. Så det krasjer ikke eller oppfører seg ikke feil når systemet prøver å gjenvinne noe av minnet.

Hvis minnebestillingen er større enn minnegrensen, har minnegrensen forrang.

Spesifisere minnegrenser og reservasjoner

Versjon 2

La oss gå tilbake til docker-compose.yml vi skrev tidligere og legge til en minnegrense for den. Endre versjonen til 2,4 av årsaker som er omtalt i forutsetningsdelen.

versjon:'2.4'
tjenester:
min-nginx:
bilde: nginx: siste
porter:
-'80: 80 '
mem_limit: 300m

Den siste linjen setter grensen for my-nginx-tjenesten til 300MiB. Du kan bruke k for KiB, og g for GiB og b for bare byte. Tallet før det må imidlertid være et heltall. Du kan ikke bruke verdier som 2,4 m, du må bruke 2400k i stedet. Nå hvis du løper:

$ docker stat --all

CONTAINER ID NAME CPU % MEM BRUK/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 legge merke til at minnegrensen er satt til 300 MiB. Det er like enkelt å angi minne reservasjon, bare legg til en linje mem_reservation: xxx på slutten.

versjon:'2.4'
tjenester:
min-nginx:
bilde: nginx: siste
porter:
-'80: 80 '
mem_limit: 300m
mem_reservation: 100m

Versjon 3 (valgfritt)

For å bruke versjon tre må du kjøre Docker i svermemodus. For Windows og Mac kan du aktivere det ved hjelp av Docker -innstillingsmenyen. Linux -brukere må kjøre docker swarm init. Mer informasjon om det finner du her . Det er imidlertid ikke et nødvendig trinn, og hvis du ikke har aktivert det, er det også bra. Denne delen er for mennesker allerede kjører i svermemodus og kan bruke den nyere versjonen.

versjon:'3'
tjenester:
min-nginx:
bilde: nginx: siste
porter:
-'80: 80 '
utplassere:
ressurser:
grenser:
minne: 300m
reservasjoner:
minne: 100m

Vi definerer alt dette under ressursalternativet. Grenser og reservasjon blir deres egne hovednøkler, og minnet er bare en av de mange ressursene som administreres her. CPU er enda en viktig parameter.

Mer informasjon

Du kan lære mer om docker-compose fra den offisielle dokumentasjonen lenket her . Når du får kjennskapen til hvordan du skriver en komponentfil, kan dokumentasjonen hjelpe deg med de forskjellige parameterne.

Du trenger ikke å vite alt, bare søk etter hva søknaden din krever, og referansen vil veilede deg i implementeringen av det.