Docker Compose - Pomnilniške omejitve

Docker Compose Memory Limits



Docker Compose je zmogljiv pripomoček. Prihrani čas in zmanjša napake pri uvajanju aplikacije Dockerized. Običajno ni dobra ideja zagnati celoten sklad, vključno s prednjim delom, strežnikom baz podatkov itd., Znotraj enega samega vsebnika.

Za obdelavo različnih delovnih obremenitev aplikacije razdelimo različne vsebnike in za preprosto uporabo uporabljamo Docker Compose. Vsaka logično drugačna obremenitev je navedena kot drugačna storitev . Na primer, vaš frontend http strežnik bo naveden kot storitev frontend, ki izvaja vsebino Apache ali Nginx kot vsebnik.







Vse storitve, njihove potrebe po omrežju, zahteve po shranjevanju itd. Je mogoče določiti v datoteki docker-compose.yml. Tu se bomo osredotočili na določanje uporabe pomnilnika.



V svojem arzenalu boste potrebovali naslednja orodja:



  1. Osnovno razumevanje Dockerja
  2. Docker za Windows ali Mac ali če uporabljate Linux, DockerCE za Linux
  3. Docker Sestavi binar y (uporabniki operacijskega sistema Windows in Mac bodo to že imeli nameščeno)

Za datoteke docker-compose.yml se bomo držali različice 2.4, saj podpira različico 17.12 in novejšo različico Docker Engine in novejšo. Lahko bi uporabili novejšo različico 3, ki pa ne podpira stare sintakse omejevanja pomnilnika. Če poskušate uporabiti novejšo skladnjo, namesto tega vztraja pri uporabi Dockerja v načinu Swarm. Zato, da bom preprost za običajne uporabnike Dockerja, se bom držal različice 2.4





Večina kode bi delovala enako za različico 3, in kjer bo razlika, bom omenil novejšo sintakso za uporabnike Docker Swarma.

Vzorec prijave

Poskusimo zagnati preprosto storitev Nginx na vratih 80 z uporabo najprej CLI in nato preprostega docker-compose.yml. V naslednjem razdelku bomo raziskali njegove omejitve in uporabo pomnilnika ter spremenili naš docker-compose.yml, da vidimo, kako se nalagajo omejitve po meri.



Zaženimo preprost strežnik nginx z uporabo Docker-CLI:

$ docker run -d --name my -nginx -p80:80nginx: najnovejše

Strežnik nginx lahko vidite tako, da obiščete http: // localhost ali zamenjajte lcoalhost

Z naslovom IP vašega gostitelja Docker. Ta vsebnik lahko potencialno izkoristi ves razpoložljiv pomnilnik na vašem gostitelju Docker (v našem primeru gre za približno 2 GB). Za preverjanje porabe pomnilnika lahko med drugim uporabimo ukaz:

$ docker stats my-nginx

ID VOZILNIKA CPU % MEM UPORABA/OMEJITEV MEM % NET I/O BLOCK V/I PIDS
6eb0091c0cf2 moj-nginx0,00% 2,133MiB / 1,934GiB0,11% 3,14 kB / 2,13 kB 0B / 0B2

UPORABA/OMEJITEV MEM je 2,133 MB od skupnih 1,934 GB. Odstranimo to posodo in začnimo pisati skripte, sestavljene iz dockerja.

$ docker ustavi moj-nginx
$ docker rm moj-nginx

Enakovredna datoteka ym

Natančen vsebnik, kot je opisano zgoraj, lahko ustvarite, če sledite tem korakom:

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

Ustvarimo nov prazen imenik in v njem ustvarimo datoteko docker-compose.yml. Ko bomo iz tega imenika zagnali docker-compose, bo poiskal to specifično datoteko (pri tem zanemaril vse ostalo) in ustrezno ustvaril našo namestitev. V to datoteko .yml dodajte naslednjo vsebino.

različica:'3'
storitve:
moj-nginx:
slika: nginx: najnovejša
pristanišča:
-'80: 80 '

$ docker -compose up -d

Zastavica -d je dodana, tako da se novo ustvarjeni vsebniki izvajajo v ozadju. V nasprotnem primeru se bo terminal pritrdil na vsebnike in iz njega začel tiskati poročila. Zdaj lahko vidimo statistiko novo ustvarjenih vsebnikov:

$ docker stats -vse

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

Opazili boste, da je bil ustvarjen podoben vsebnik kot prej s podobnimi omejitvami pomnilnika in celo uporabo. Iz istega imenika, ki vsebuje datoteko yml. Zaženite naslednji ukaz za brisanje na novo ustvarjenega vsebnika skupaj z ustvarjenim omrežjem premostitve odjemalcev.

$docker-compose down

S tem se bo docker vrnil v čisto stanje, razen vseh ustvarjenih nosilcev (nismo ustvarili nobenega, zato to ni skrb.)

Omejitve pomnilnika in rezervacije spomina

Omejitve pomnilnika in rezervacije pomnilnika sta dva različna vidika, ki zagotavljata nemoteno delovanje vaših aplikacij in gostitelja Docker, ki ga uporabljate.

Na splošno velja, da omejitev pomnilnika določa zgornjo mejo količine pomnilnika, ki jo potencialno lahko uporabi vsebnik Docker. Privzeto lahko vsebnik Docker, tako kot kateri koli drug sistemski proces, uporabi celoten razpoložljivi pomnilnik gostitelja Docker. To lahko povzroči izjemo pomnilnika in vaš sistem se lahko zelo zruši. Tudi če do tega nikoli ne pride, lahko še vedno izloči druge procese (vključno z drugimi vsebniki) iz dragocenih virov, kar spet škoduje zmogljivosti. Omejitve pomnilnika zagotavljajo, da vsebniki, lačni virov, ne presežejo določene meje. To omejuje polmer eksplozije slabo napisane aplikacije na nekaj vsebnikov, ne na celotnega gostitelja.

Po drugi strani so rezervacije spomina manj toge. Ko sistemu primanjkuje pomnilnika in ga poskuša povrniti. Poskuša pospraviti porabo pomnilnika vsebnika na ali pod omejitvijo rezervacije. Če je pomnilnika na pretek, pa se lahko aplikacija razširi do trdo nastavljene omejitve pomnilnika.

Povzeti:

  1. Omejitev pomnilnika: Stroga zgornja meja količine pomnilnika, ki je na voljo zabojniku.
  2. Rezervacija pomnilnika: To je treba nastaviti kot najmanjšo količino pomnilnika, ki jo aplikacija potrebuje za pravilno delovanje. Torej se ne zruši ali se obnaša neprimerno, ko sistem poskuša pridobiti del pomnilnika.

Če je rezervacija pomnilnika večja od omejitve pomnilnika, ima omejitev pomnilnika prednost.

Določanje omejitev pomnilnika in rezervacije

Različica 2

Vrnimo se k docker-compose.yml, ki smo ga napisali prej, in mu dodamo omejitev pomnilnika. Spremenite različico na 2.4 zaradi razlogov, opisanih v razdelku o predpogojih.

različica:'2.4'
storitve:
moj-nginx:
slika: nginx: najnovejša
pristanišča:
-'80: 80 '
mejna omejitev: 300 m

Zadnja vrstica določa omejitev za storitev my-nginx na 300 MB. K lahko uporabite za KiB, g pa za GiB in b za samo bajte. Vendar mora biti število pred tem celo število. Ne morete uporabiti vrednosti, kot je 2,4 m, namesto tega bi morali uporabiti 2400k. Zdaj, če zaženete:

$ docker stat -vse

ID VOZILNIKA CPU % MEM UPORABA/OMEJITEV MEM % NET I/O BLOCK V/I PIDS
44114d785d0a my-compose_my-nginx_10,00% 2,141MiB/300MiB0,71% 1,16 kB/0B 0B/0B2

Opazili boste, da je omejitev pomnilnika nastavljena na 300 MiB. Nastavitev rezervacije pomnilnika je enako preprosta, samo dodajte vrstico mem_reservation: xxx na koncu.

različica:'2.4'
storitve:
moj-nginx:
slika: nginx: najnovejša
pristanišča:
-'80: 80 '
mejna omejitev: 300 m
mem_rezervacija: 100m

Različica 3 (izbirno)

Za uporabo različice tri morate zagnati Docker v načinu roja. Za Windows in Mac ga lahko omogočite v meniju z nastavitvami Dockerja. Uporabniki Linuxa bi morali zagnati docker swarm init. Več informacij o tem lahko najdete tukaj . To pa ni nujen korak in če tega niste omogočili, je tudi to v redu. Ta razdelek je namenjen ljudem že deluje v načinu roja in lahko uporablja novejšo različico.

različica:'3'
storitve:
moj-nginx:
slika: nginx: najnovejša
pristanišča:
-'80: 80 '
razporedi:
sredstva:
omejitve:
spomin: 300 m
rezervacije:
spomin: 100m

Vse to opredelimo v možnosti virov. Omejitve in rezervacije postanejo lastni ključi, spomin pa je le eden od mnogih virov, ki jih tukaj upravljamo. CPU je še en pomemben parameter.

Nadaljne informacije

Več o docker-compose lahko izveste iz uradne dokumentacije tukaj povezano . Ko dobite bistvo, kako napisati datoteko za sestavljanje, vam lahko dokumentacija pomaga pri podrobnostih različnih parametrih.

Ni vam treba vedeti vsega, samo poiščite, kaj zahteva vaša aplikacija, in referenca vas bo vodila pri izvajanju tega.