Docker Compose - Memorijska ograničenja

Docker Compose Memory Limits

Docker Compose je moćan uslužni program. To štedi vrijeme i smanjuje pogreške pri postavljanju vaše Dockerized aplikacije. Obično nije dobra ideja pokrenuti cijeli hrpu, uključujući sučelje, poslužitelj baze podataka itd. Iz jednog kontejnera.

Razvijamo različite spremnike za rukovanje različitim radnim opterećenjima aplikacije i koristimo Docker Compose za to. Svako logički različito radno opterećenje navedeno je kao različito servis . Na primjer, vaš frontend http poslužitelj bit će naveden kao usluga sučelja koja izvodi Apache ili Nginx sliku kao spremnik.



Sve usluge, njihove potrebe za umrežavanjem, zahtjevi za pohranu itd. Mogu se navesti u datoteci docker-compose.yml. Ovdje ćemo se usredotočiti na navođenje upotrebe memorije.



Da biste slijedili, trebat će vam sljedeći alati u vašem arsenalu:



  1. Osnovno razumijevanje Dockera
  2. Docker za Windows ili Mac ili ako koristite Linux, DockerCE za Linux
  3. Docker Sastavi binar y (Korisnici sustava Windows i Mac ovo će već imati instalirano)

Držat ćemo se verzije 2.4 za naše datoteke docker-compose.yml jer podržava verziju 17.12 i noviju verziju Docker Engine-a i noviju. Mogli smo ići s novijom verzijom 3, ali ne podržava staru sintaksu ograničenja memorije. Ako pokušate upotrijebiti noviju sintaksu, ona inzistira na tome da se Docker koristi u Swarm načinu rada. Kako bih pojednostavio obične korisnike Dockera, zadržat ću se na verziji 2.4

Većina koda radila bi isto za verziju 3, a gdje će biti razlike, spomenut ću noviju sintaksu za korisnike Docker Swarma.

Uzorak prijave

Pokušajmo pokrenuti jednostavnu Nginx uslugu na portu 80 koristeći prvo CLI, a zatim jednostavan docker-compose.yml. U sljedećem odjeljku istražit ćemo ograničenja i korištenje memorije te izmijeniti naš docker-compose.yml da vidimo kako se nameću prilagođena ograničenja.



Pokrenimo jednostavan nginx poslužitelj koristeći Docker-CLI:

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

Posjetite stranicu nginx poslužitelj kako biste vidjeli da radi http: // localhost ili zamijenite lcoalhost

S IP adresom vašeg Docker hosta. Ovaj spremnik potencijalno može iskoristiti cijelu raspoloživu memoriju na vašem Docker hostu (u našem slučaju radi se o 2 GB). Za provjeru iskorištenosti memorije, između ostalog, možemo koristiti naredbu:

$ docker statistika my-nginx

ID KONTEJNERA CPU % MEM UPORABA/OGRANIČENJE MEM % NET I/O BLOK I/O PIDS
6eb0091c0cf2 moj-nginx0,00%2,133MiB / 1,934GiB0,11% 3,14 kB / 2,13 kB 0B / 0B2

KORIŠTENJE/OGRANIČENJE MEM -a je 2.133MiB od ukupno 1.934GiB. Uklonimo ovaj spremnik i počnimo pisati skripte za sastavljanje dokumenata.

$ docker zaustavi moj-nginx
$ docker rm moj-nginx

Ekvivalentna ym datoteka

Točan spremnik kao gore može se stvoriti ako slijedimo ove korake:

$ mkdir moje sastavljanje
$ cd moje sastavljanje
$ vim docker-compose.yml

Izrađujemo novi prazan direktorij i u njemu stvaramo datoteku docker-compose.yml. Kad pokrenemo docker-compose iz ovog direktorija, tražit će ovu određenu datoteku (zanemarujući sve ostalo) i prema tome stvoriti našu implementaciju. Dodajte sljedeći sadržaj u ovu .yml datoteku.

verzija:'3'
usluge:
moj-nginx:
slika: nginx: najnovija
luke:
-'80: 80 '

$ docker -sastavi gore -d

Zastavica -d dodaje se tako da se novonastali spremnici izvode u pozadini. U suprotnom će se terminal pričvrstiti na spremnike i početi ispisivati ​​izvješća s njega. Sada možemo vidjeti statistiku novonastalih spremnika (spremnika):

$ docker stats -svi

ID KONTEJNERA CPU% MEM UPORABA/OGRANIČENJE MEM% NET I/O BLOK I/O PIDS
5f8a1e2c08ac my-compose_my-nginx_10,00% 2,25MiB/1,934GiB0,11% 1,65 kB/0B 7,35 MB/0B2

Primijetit ćete da je sličan spremnik kao i prije stvoren sa sličnim ograničenjima memorije, pa čak i upotrebom. Iz istog direktorija koji sadrži datoteku yml. Pokrenite sljedeću naredbu za brisanje novostvorenog spremnika, zajedno s kreiranom mrežom korisničkog mosta.

$docker-sastaviti dolje

Ovo će vratiti docker u čisto stanje s izuzetkom svih volumena koji su stvoreni (nismo ih stvorili pa to nije briga.)

Ograničenja memorije i rezervacije memorije

Ograničenja memorije i rezervacije memorije dva su različita aspekta koji osiguravaju nesmetano funkcioniranje vaših aplikacija i Docker hosta na kojem radite.

Općenito govoreći, Memorijsko ograničenje nameće gornju granicu količine memorije koju potencijalno može koristiti Docker spremnik. Prema zadanim postavkama, Docker spremnik, kao i svaki drugi sustav, može koristiti cijelu raspoloživu memoriju Docker hosta. To može uzrokovati iznimku nedostatka memorije i vaš bi se sustav mogao srušiti. Čak i ako do toga nikada ne dođe, može izgladnjeti druge procese (uključujući i druge spremnike) iz vrijednih resursa, što opet može naštetiti izvedbi. Ograničenja memorije osiguravaju da spremnici gladni resursa ne prelaze određenu granicu. To ograničava radijus eksplozije loše napisane aplikacije na nekoliko spremnika, a ne na cijeli host.

Rezerve memorije, s druge strane, manje su krute. Kad sustavu ponestaje memorije i pokušava vratiti dio nje. Pokušava smanjiti potrošnju memorije spremnika na ili ispod ograničenja rezervacije. Međutim, ako ima dovoljno memorije, aplikacija se može proširiti do čvrsto postavljenog ograničenja memorije.

Sažeti:

  1. Ograničenje memorije: Stroga gornja granica količine memorije koja je dostupna spremniku.
  2. Rezerviranje memorije: Ovo bi trebalo postaviti kao najmanju minimalnu količinu memorije koja je potrebna aplikaciji za pravilno pokretanje. Dakle, ne ruši se ili se loše ponaša kada sustav pokušava povratiti dio memorije.

Ako je rezervacija memorije veća od ograničenja memorije, memorijsko ograničenje ima prednost.

Određivanje memorijskih ograničenja i rezervacije

Verzija 2

Vratimo se na docker-compose.yml koji smo napisali ranije i dodajmo mu ograničenje memorije. Promijenite verziju na 2.4 iz razloga opisanih u odjeljku preduvjeti.

verzija:'2.4'
usluge:
moj-nginx:
slika: nginx: najnovija
luke:
-'80: 80 '
mem_limit: 300m

Zadnji redak postavlja ograničenje za uslugu my-nginx na 300 MB. Možete upotrijebiti k za KiB, a g za GiB i b za samo bajtove. Međutim, broj ispred njega mora biti cijeli broj. Ne možete koristiti vrijednosti poput 2,4 m, umjesto toga morali biste koristiti 2400k. Sada ako pokrenete:

$ docker stat -sve

ID KONTEJNERA CPU % MEM UPORABA/OGRANIČENJE MEM % NET I/O BLOK I/O PIDS
44114d785d0a my-compose_my-nginx_10,00% 2,141MiB/300MiB0,71% 1,16 kB/0B 0B/0B2

Primijetit ćete da je ograničenje memorije postavljeno na 300 MiB. Postavljanje rezervacije memorije jednako je jednostavno, samo dodajte redak mem_reservation: xxx na kraju.

verzija:'2.4'
usluge:
moj-nginx:
slika: nginx: najnovija
luke:
-'80: 80 '
mem_limit: 300m
mem_rezervacija: 100m

Verzija 3 (izborno)

Da biste koristili treću verziju, morate pokrenuti Docker u načinu roja. Za Windows i Mac možete ga omogućiti pomoću izbornika postavki Dockera. Korisnici Linuxa trebali bi pokrenuti docker swarm init. Više informacija o tome se može pronaći ovdje . To ipak nije nužan korak, a ako to niste omogućili, i to je u redu. Ovaj odjeljak je za ljude već radi u načinu roja i može koristiti noviju verziju.

verzija:'3'
usluge:
moj-nginx:
slika: nginx: najnovija
luke:
-'80: 80 '
rasporediti:
resursi:
ograničenja:
memorija: 300 m
rezervacije:
memorija: 100m

Sve to definiramo pod opcijom resursa. Ograničenja i rezervacije postaju vlastiti primarni ključevi, a memorija je samo jedan od mnogih resursa kojima se ovdje upravlja. CPU je još jedan važan parametar.

Daljnje informacije

Više o docker-composeu možete saznati iz službene dokumentacije ovdje povezano . Kada shvatite suštinu kako napisati datoteku za sastavljanje, dokumentacija vam može pomoći sa specifičnostima različitih parametara.

Ne morate znati sve, samo potražite ono što vaša aplikacija zahtijeva i referenca će vas voditi u provedbi toga.