Docker Compose - atmiņas ierobežojumi

Docker Compose Memory Limits



Docker komponēšana ir spēcīga utilīta. Tas ietaupa laiku un samazina kļūdas, izvietojot Dockerized lietojumprogrammu. Parasti nav laba ideja palaist visu kaudzi, ieskaitot priekšgalu, datu bāzes serveri utt., No viena konteinera.

Mēs savācam dažādus konteinerus, lai apstrādātu dažādas lietojumprogrammas darba slodzes, un šim nolūkam izmantojam Docker Compose. Katra loģiski atšķirīgā darba slodze ir norādīta kā atšķirīga apkalpošana . Piemēram, jūsu priekšgala http serveris tiks norādīts kā priekšpuses pakalpojums, kurā kā konteiners darbojas Apache vai Nginx attēls.







Visus pakalpojumus, to tīkla vajadzības, uzglabāšanas prasības utt. Var norādīt failā docker-compose.yml. Šeit mēs koncentrēsimies uz atmiņas izmantošanas noteikšanu.



Arsenālā jums būs nepieciešami šādi rīki:



  1. Pamatinformācija par Docker
  2. Docker operētājsistēmai Windows vai Mac vai ja jūs izmantojat Linux, DockerCE operētājsistēmai Linux
  3. Docker Compose binārs y (Windows un Mac lietotājiem tas jau būs instalēts)

Mēs pieturēsimies pie versijas 2.4 mūsu docker-compose.yml failiem, jo ​​tā atbalsta versiju 17.12 un jaunāku Docker Engine un jaunāku. Mēs būtu varējuši izmantot 3. versiju, kas ir jaunāka, taču tā neatbalsta veco atmiņas ierobežojumu sintaksi. Ja jūs mēģināt izmantot jaunāko sintaksi, tā vietā tiek prasīts izmantot Docker Swarm režīmā. Tāpēc, lai jautājums būtu vienkāršs parastajiem Docker lietotājiem, es palikšu pie versijas 2.4





Lielākā daļa koda darbotos tāpat kā 3. versijai, un, ja būs atšķirība, es minēšu jaunāko sintaksi Docker Swarm lietotājiem.

Pieteikuma paraugs

Mēģināsim palaist vienkāršu Nginx pakalpojumu 80. portā, vispirms izmantojot CLI un pēc tam vienkāršu docker-compose.yml. Nākamajā sadaļā mēs izpētīsim tās atmiņas ierobežojumus un izmantošanu un pārveidosim mūsu docker-compose.yml, lai redzētu, kā tiek piemēroti pielāgotie ierobežojumi.



Sāksim vienkāršu nginx serveri, izmantojot Docker-CLI:

$ docker run -d -name my -nginx -p80:80nginx: jaunākais

Jūs varat redzēt, kā darbojas nginx serveris, apmeklējot http: // localhost vai nomainiet lcoalhost

Ar jūsu Docker resursdatora IP adresi. Šis konteiners potenciāli var izmantot visu jūsu Docker resursdatora pieejamo atmiņu (mūsu gadījumā tā ir aptuveni 2 GB). Cita starpā, lai pārbaudītu atmiņas izmantošanu, mēs varam izmantot komandu:

$ docker statistika my-nginx

KONTEINERA ID NOSAUKUMS CPU % MEM USGE/LIMIT MEM % NET I/O BLOCK I/O PIDS
6eb0091c0cf2 my-nginx0,00%2.133MiB / 1.934GiB0.11% 3.14kB / 2.13kB 0B / 0B2

MEM USGE/LIMIT ir 2,133 MB no kopējā 1,934GiB. Noņemsim šo konteineru un sāksim rakstīt skriptus, kas sastāv no dokiem.

$ docker apturēt manu-nginx
$ docker rm my-nginx

Līdzvērtīgs ym fails

Precīzu konteineru, kā norādīts iepriekš, var izveidot, ja veicam šādas darbības:

$ mkdir my-komponēt
$ cd my-komponēt
$ vim docker-compose.yml

Mēs izveidojam jaunu tukšu direktoriju un izveidojam tajā failu docker-compose.yml. Kad mēs no šī direktorija palaidīsim docker-compose, tas meklēs šo konkrēto failu (ignorējot visu pārējo) un attiecīgi izveidos mūsu izvietošanu. Šajā .yml failā pievienojiet šādu saturu.

versija:'3'
pakalpojumi:
my-nginx:
attēls: nginx: jaunākais
ostas:
-'80: 80 '

$ docker -compose up -d

Karogs -d tiek pievienots, lai jaunizveidotie konteineri darbotos fonā. Pretējā gadījumā terminālis piestiprinās pie konteineriem un sāks no tā drukāt atskaites. Tagad mēs varam redzēt jaunizveidotā (-o) konteinera (-u) statistiku:

$ docker statistika -visa

KONTEINERA ID NOSAUKUMS CPU% MEM USGE/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

Jūs pamanīsit, ka līdzīgs konteiners kā iepriekš tika izveidots ar līdzīgiem atmiņas ierobežojumiem un pat izmantošanu. No tā paša direktorija, kurā ir yml fails. Izpildiet šo komandu, lai izdzēstu jaunizveidoto konteineru kopā ar izveidoto klientu tilta tīklu.

$docker-komponēt uz leju

Tādējādi docker atgriezīsies tīrā stāvoklī, izņemot visus izveidotos sējumus (mēs tos neizveidojām, tāpēc tas nerada bažas.)

Atmiņas ierobežojumi un rezerves

Atmiņas ierobežojumi un atmiņas rezervēšana ir divi dažādi aspekti, lai nodrošinātu nevainojamu jūsu lietojumprogrammu un Docker resursdatora, kuru izmantojat, darbību.

Vispārīgi runājot, atmiņas ierobežojums nosaka augšējo atmiņas apjoma ierobežojumu, ko potenciāli var izmantot Docker konteiners. Pēc noklusējuma Docker konteiners, tāpat kā jebkurš cits sistēmas process, var izmantot visu pieejamo Docker resursdatora atmiņu. Tas var izraisīt izņēmumu no atmiņas, un jūsu sistēma var ļoti avarēt. Pat ja tas nekad nenotiek, tas joprojām var izbadēt citu procesu (ieskaitot citus konteinerus) no vērtīgiem resursiem, atkal kaitējot veiktspējai. Atmiņas ierobežojumi nodrošina, ka resursu izsalkušie konteineri nepārsniedz noteiktu robežu. Tas ierobežo slikti uzrakstītas lietojumprogrammas sprādziena rādiusu līdz dažiem konteineriem, nevis visam saimniekdatoram.

Savukārt atmiņas rezervēšana ir mazāk stingra. Kad sistēmā trūkst atmiņas un mēģina daļu tās atgūt. Tas mēģina samazināt konteinera atmiņas patēriņu rezervācijas limitā vai zem tā. Tomēr, ja ir daudz atmiņas, lietojumprogramma var paplašināties līdz stingri noteiktajam atmiņas ierobežojumam.

Apkopot:

  1. Atmiņas ierobežojums: stingrs augšējais ierobežojums konteineram pieejamās atmiņas apjomam.
  2. Atmiņas rezervēšana: tas ir jāiestata kā minimālais atmiņas apjoms, kas nepieciešams, lai lietojumprogramma darbotos pareizi. Tātad tas negadās vai nedarbojas nepareizi, kad sistēma mēģina atgūt daļu atmiņas.

Ja atmiņas rezervācija ir lielāka par atmiņas ierobežojumu, priekšroka tiek dota atmiņas ierobežojumam.

Atmiņas ierobežojumu un rezervēšanas norādīšana

2. versija

Atgriezīsimies pie iepriekš rakstītā docker-compose.yml un pievienosim tam atmiņas ierobežojumu. Priekšnosacījumu sadaļā minēto iemeslu dēļ mainiet versiju uz 2.4.

versija:“2.4”
pakalpojumi:
my-nginx:
attēls: nginx: jaunākais
ostas:
-'80: 80 '
mem_limit: 300m

Pēdējā rindā ir noteikts ierobežojums pakalpojumam my-nginx uz 300MiB. KiB varat izmantot k, bet GiB un b - tikai baitus. Tomēr skaitlim pirms tā ir jābūt veselam skaitlim. Jūs nevarat izmantot tādas vērtības kā 2,4 m, tā vietā jums jāizmanto 2400 000. Tagad, ja skrienat:

$ docker stat -viss

KONTEINERA ID NOSAUKUMS CPU % MEM USGE/LIMIT MEM % NET I/O BLOCK I/O PIDS
44114d785d0a my-compose_my-nginx_10,00% 2,141MB/300MiB0.71% 1.16kB/0B 0B/0B2

Jūs pamanīsit, ka atmiņas ierobežojums ir iestatīts uz 300 MiB. Atmiņas rezervācijas iestatīšana ir tikpat vienkārša, vienkārši pievienojiet rindu mem_reservation: xxx beigās.

versija:“2.4”
pakalpojumi:
my-nginx:
attēls: nginx: jaunākais
ostas:
-'80: 80 '
mem_limit: 300m
mem_reservation: 100m

3. versija (pēc izvēles)

Lai izmantotu trešo versiju, jums ir jādarbojas Docker spieta režīmā. Operētājsistēmai Windows un Mac varat to iespējot, izmantojot izvēlni Docker iestatījumi. Linux lietotājiem vajadzētu palaist docker swarm init. Plašāku informāciju par to var atrast šeit . Tomēr tas nav nepieciešams solis, un, ja neesat to iespējojis, tas ir arī labi. Šī sadaļa ir paredzēta cilvēkiem jau darbojas spieta režīmā un var izmantot jaunāko versiju.

versija:'3'
pakalpojumi:
my-nginx:
attēls: nginx: jaunākais
ostas:
-'80: 80 '
izvietot:
resursi:
ierobežojumi:
atmiņa: 300 m
atrunas:
atmiņa: 100 m

Mēs to visu definējam opcijā Resursi. Ierobežojumi un rezervēšana kļūst par viņu pašu galvenajām atslēgām, un atmiņa ir tikai viens no daudzajiem resursiem, kas šeit tiek pārvaldīti. CPU ir vēl viens svarīgs parametrs.

Papildu informācija

Jūs varat uzzināt vairāk par docker-compose no oficiālās dokumentācijas saistīts šeit . Kad esat sapratis rakstīšanas faila rakstīšanas būtību, dokumentācija var jums palīdzēt ar dažādiem parametriem.

Jums nav jāzina viss, vienkārši meklējiet to, kas nepieciešams jūsu lietojumprogrammai, un atsauce palīdzēs jums to īstenot.