„Docker Compose“ - atminties apribojimai

Docker Compose Memory Limits



„Docker“ kūrimas yra galinga priemonė. Tai taupo laiką ir sumažina klaidas diegiant „Dockerized“ programą. Paprastai nėra puiki idėja paleisti visą krūvą, įskaitant priekinę dalį, duomenų bazės serverį ir tt iš vieno konteinerio.

Mes sukame skirtingus konteinerius, kad galėtume tvarkyti skirtingas programos apkrovas, ir tam naudojame „Docker Compose“. Kiekvienas logiškai skirtingas darbo krūvis nurodomas kaip skirtingas paslauga . Pvz., Jūsų priekinio kompiuterio http serveris bus įtrauktas į sąsajos paslaugą, kurioje kaip konteineris veikia „Apache“ arba „Nginx“ vaizdas.







Visos paslaugos, jų tinklo poreikiai, saugojimo reikalavimai ir tt gali būti nurodytos faile „docker-compose.yml“. Čia mes sutelksime dėmesį į atminties naudojimo nurodymą.



Norėdami sekti savo arsenalą, jums reikės šių įrankių:



  1. Pagrindinis „Docker“ supratimas
  2. „Docker“, skirtas „Windows“ arba „Mac“ arba jei naudojate „Linux“, „DockerCE“, skirta „Linux“
  3. Docker Compose dvejetainis y („Windows“ ir „Mac“ vartotojams tai jau bus įdiegta)

Mes laikysimės 2.4 versijos, skirtos mūsų „docker-compose.yml“ failams, kurie palaiko „Docker Engine“ ir naujesnės versijos 17.12 ir naujesnes versijas. Galėjome pasirinkti naujesnę 3 versiją, tačiau ji nepalaiko senos atminties apribojimo sintaksės. Jei bandysite naudoti naujesnę sintaksę, ji primygtinai reikalauja naudoti „Docker“ „Swarm“ režimu. Taigi, kad paprastiems „Docker“ vartotojams būtų paprasta, aš laikysiuosi 2.4 versijos





Dauguma kodo veiktų taip pat ir 3 versijoje, o kur bus skirtumas, paminėsiu naujesnę „Docker Swarm“ naudotojų sintaksę.

Paraiškos pavyzdys

Pabandykime paleisti paprastą „Nginx“ paslaugą 80 prievade, pirmiausia naudodami CLI, o tada paprastą „docker-compose.yml“. Kitame skyriuje išnagrinėsime jo atminties apribojimus ir naudojimą bei pakeisime „docker-compose.yml“, kad pamatytume, kaip nustatomi pasirinktiniai apribojimai.



Pradėkime paprastą „nginx“ serverį naudodami „Docker-CLI“:

$ docker run -d --vardykite mano -nginx -p80:80nginx: naujausias

„Nginx“ serverį galite pamatyti apsilankę apsilankę http: // localhost arba pakeiskite „lcoalhost“

Su jūsų „Docker“ pagrindinio kompiuterio IP adresu. Šis konteineris gali išnaudoti visą jūsų „Docker“ pagrindinio kompiuterio atmintį (mūsų atveju tai yra apie 2 GB). Norėdami patikrinti atminties panaudojimą, be kita ko, galime naudoti komandą:

$ docker statistika my-nginx

KONTEINERIO ID PAVADINIMAS CPU % MEM USE/LIMIT MEM % NET I/O BLOCK I/O PIDS
6eb0091c0cf2 my-nginx0,00% 2.133MB / 1.934GiB0.11% 3.14kB / 2.13kB 0B / 0B2

MEM USGE/LIMIT yra 2,133 MB iš visų 1,934GiB. Pašalinkime šį konteinerį ir pradėkime rašyti dokų kūrimo scenarijus.

$ docker sustabdyk my-nginx
$ docker rm my-nginx

Lygiavertis ym failas

Tikslų konteinerį, kaip nurodyta aukščiau, galima sukurti atlikus šiuos veiksmus:

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

Sukuriame naują tuščią katalogą ir sukuriame jame failą docker-compose.yml. Kai paleisime „docker-compose“ iš šio katalogo, jis ieškos šio konkretaus failo (nekreipdamas dėmesio į visa kita) ir atitinkamai sukurs mūsų diegimą. Į šį .yml failą pridėkite šį turinį.

versija:„3“
paslaugos:
my-nginx:
vaizdas: nginx: naujausias
uostai:
-„80: 80“

$ docker -komponuoti iki -d

Vėliava -d pridedama, kad naujai sukurti konteineriai veiktų fone. Priešingu atveju terminalas prisiriš prie konteinerių ir pradės iš jo spausdinti ataskaitas. Dabar matome naujai sukurto (-ų) sudėtinio rodinio (-ų) statistiką:

$ docker statistika -visa

KONTEINERIO ID PAVADINIMAS CPU% MEM USE/LIMIT MEM% NET I/O BLOCK I/O PIDS
5f8a1e2c08ac my-compose_my-nginx_10,00% 2.25MiB/1.934GiB0.11% 1.65kB/0B 7.35MB/0B2

Pastebėsite, kad panašus konteineris, kaip ir anksčiau, buvo sukurtas su panašiomis atminties ribomis ir netgi panaudojimu. Iš to paties katalogo, kuriame yra yml failas. Vykdykite šią komandą, kad ištrintumėte naujai sukurtą sudėtinį rodinį kartu su sukurtu klientų tilto tinklu.

$docker-komponuoti žemyn

Tai grąžins doką į švarią būseną, išskyrus visus sukurtus tomus (mes jų nesukūrėme, todėl tai nekelia rūpesčių.)

Atminties apribojimai ir atminties rezervavimas

Atminties apribojimai ir atminties rezervavimas yra du skirtingi aspektai, užtikrinantys sklandų programų ir „Docker“ pagrindinio kompiuterio, kurį naudojate, veikimą.

Apskritai, atminties limitas nustato viršutinę atminties, kurią gali naudoti „Docker“ konteineris, ribą. Pagal numatytuosius nustatymus „Docker“ konteineris, kaip ir bet kuris kitas sistemos procesas, gali naudoti visą turimą „Docker“ pagrindinio kompiuterio atmintį. Tai gali sukelti atminties trūkumą ir jūsų sistema gali labai sugesti. Net jei to niekada nebus, jis vis tiek gali baduoti kitus procesus (įskaitant kitus konteinerius) iš vertingų išteklių ir vėl pakenkti našumui. Atminties apribojimai užtikrina, kad išteklių nevartojantys konteineriai neviršytų tam tikros ribos. Tai apriboja prastai parašytos programos sprogimo spindulį iki kelių konteinerių, o ne viso kompiuterio.

Kita vertus, atminties rezervavimas yra ne toks griežtas. Kai sistemoje pritrūksta atminties ir bandoma susigrąžinti dalį jos. Jis bando sumažinti konteinerio atminties suvartojimą iki rezervavimo limito arba žemiau jo. Tačiau jei atminties gausu, programa gali išplėsti iki nustatytos atminties ribos.

Apibendrinti:

  1. Atminties limitas: griežta viršutinė talpyklos atminties riba.
  2. Atminties rezervavimas: tai turėtų būti nustatyta kaip minimalus atminties kiekis, kurio reikia, kad programa veiktų tinkamai. Taigi, kai sistema bando susigrąžinti dalį atminties, ji nesulūžta ir netinkamai elgiasi.

Jei atminties rezervavimas yra didesnis nei atminties limitas, pirmenybė teikiama atminties limitui.

Atminties apribojimų ir rezervavimo nurodymas

2 versija

Grįžkime prie anksčiau rašyto „docker-compose.yml“ ir pridėkime prie jo atminties apribojimą. Pakeiskite versiją į 2.4 dėl priežasčių, aptartų skyriuje „Būtinos sąlygos“.

versija:„2.4“
paslaugos:
my-nginx:
vaizdas: nginx: naujausias
uostai:
-„80: 80“
mem_limit: 300m

Paskutinė eilutė nustato „my-nginx“ paslaugos ribą iki 300 MB. KiB galite naudoti k, o GiB ir b - tik baitams. Tačiau prieš jį esantis skaičius turi būti sveikasis skaičius. Negalite naudoti tokių verčių kaip 2,4 m, vietoj to turėsite naudoti 2400 tūkst. Dabar, jei bėgate:

$ docker stat -visi

KONTEINERIO ID PAVADINIMAS CPU % MEM USE/LIMIT MEM % NET I/O BLOCK I/O PIDS
44114d785d0a my-compose_my-nginx_10,00% 2,141 MB/300 MB0.71% 1.16kB/0B 0B/0B2

Pastebėsite, kad atminties limitas nustatytas į 300 MiB. Nustatyti atminties rezervavimą yra taip pat paprasta, tiesiog pridėkite eilutę mem_reservation: xxx pabaigoje.

versija:„2.4“
paslaugos:
my-nginx:
vaizdas: nginx: naujausias
uostai:
-„80: 80“
mem_limit: 300m
mem_reservation: 100m

3 versija (pasirenkama)

Norėdami naudoti trečiąją versiją, turite paleisti „Docker“ spiečio režimu. „Windows“ ir „Mac“ galite jį įjungti naudodami „Docker“ nustatymų meniu. „Linux“ vartotojams reikės paleisti „docker swarm init“. Daugiau informacijos apie tai galima rasti čia . Tačiau tai nėra būtinas žingsnis, o jei to neįjungėte, tai taip pat gerai. Šis skyrius skirtas žmonėms jau veikia spiečio režimu ir gali pasinaudoti naujesne versija.

versija:„3“
paslaugos:
my-nginx:
vaizdas: nginx: naujausias
uostai:
-„80: 80“
dislokuoti:
ištekliai:
ribos:
atmintis: 300 m
išlygos:
atmintis: 100 m

Visa tai apibrėžiame pagal išteklių parinktį. Ribos ir rezervavimas tampa pagrindiniais jų pačių raktais, o atmintis yra tik vienas iš daugelio čia valdomų išteklių. CPU yra dar vienas svarbus parametras.

Tolimesnė informacija

Daugiau apie „docker-compose“ galite sužinoti iš oficialių dokumentų čia susietas . Kai suprasite, kaip parašyti kūrimo failą, dokumentacija gali padėti jums nustatyti įvairius parametrus.

Jūs neturite žinoti visko, tiesiog ieškokite to, ko reikalauja jūsų programa, ir nuoroda padės jums tai įgyvendinti.