Bumuo ng Docker - Mga Limitasyon sa memorya

Docker Compose Memory Limits



Ang Docker compose ay isang malakas na utility. Makakatipid ito ng oras at binabawasan ang mga error kapag nag-deploy ng iyong Dockerized application. Karaniwan, hindi magandang ideya na patakbuhin ang buong stack kasama ang frontend, ang database server, atbp mula sa loob ng isang solong isang lalagyan.

Paikutin namin ang iba't ibang mga lalagyan upang hawakan ang iba't ibang mga workload ng isang application at ginagamit namin ang Docker Compose para madali itong gawin. Ang bawat lohikal na magkakaibang workload ay nakalista bilang isang naiiba serbisyo . Halimbawa, ang iyong frontend http server ay nakalista bilang isang serbisyo sa frontend na nagpapatakbo ng isang Apache o isang imahe ng Nginx bilang isang lalagyan.







Ang lahat ng mga serbisyo, ang kanilang mga pangangailangan sa networking, mga kinakailangan sa pag-iimbak, atbp ay maaaring tukuyin sa isang docker-compose.yml file. Magtutuon kami sa pagtukoy ng paggamit ng memorya dito.



Kakailanganin mo ang mga sumusunod na tool sa iyong arsenal upang sundin:



  1. Pangunahing pag-unawa sa Docker
  2. Docker para sa Windows o Mac o kung nagpapatakbo ka ng Linux, DockerCE para sa Linux
  3. Docker Compose binar y (mai-install na ito ng mga gumagamit ng Windows at Mac)

Kami ay mananatili sa bersyon 2.4 para sa aming mga docker-compose.yml file na sumusuporta sa bersyon 17.12 at mas mataas sa Docker Engine at mas mataas. Maaari kaming umalis kasama ang bersyon 3 na kung saan ay mas kamakailan-lamang ngunit hindi nito sinusuportahan ang lumang syntax ng limitasyon ng memorya. Kung susubukan mong gamitin ang mas bagong syntax, pinipilit nito ang paggamit ng Docker sa Swarm mode, sa halip. Kaya't upang panatilihing simple ang bagay para sa mga regular na gumagamit ng Docker ay mananatili ako sa bersyon 2.4





Karamihan sa mga code ay gagana nang pareho para sa bersyon 3, at kung saan magkakaroon ng pagkakaiba, babanggitin ko ang mas bagong syntax para sa mga gumagamit ng Docker Swarm.

Sample Application

Subukan natin at magpatakbo ng isang simpleng serbisyo ng Nginx sa port 80 gamit muna ang CLI at pagkatapos ay isang simpleng docker-compose.yml. Sa susunod na seksyon, susuriin namin ang mga limitasyon ng memorya nito at paggamit at baguhin ang aming docker-compose.yml upang makita kung paano ipinataw ang mga pasadyang limitasyon.



Magsimula tayo ng isang simpleng nginx server gamit ang Docker-CLI:

$ docker run -d --pangalan ng my-nginx -p80:80nginx: pinakabago

Maaari mong makita ang nginx server na gumagana sa pamamagitan ng pagbisita http: // localhost o palitan ang lcoalhost

Gamit ang IP address ng iyong Docker host. Ang lalagyan na ito ay maaaring potensyal na magamit ang buong magagamit na memorya sa iyong Docker host (sa aming kaso ito ay tungkol sa 2GB). Upang suriin ang paggamit ng memorya, bukod sa iba pang mga bagay, maaari naming gamitin ang utos:

$ docker stats my-nginx

CONTAINER ID NAME CPU% MEM USAGE / LIMIT MEM% NET I / O BLOCK I / O PIDID
6eb0091c0cf2 my-nginx0.00% 2.133MiB / 1.934GiB0.11% 3.14kB / 2.13kB 0B / 0B2

Ang MEM USAGE / LIMIT ay nasa 2.133MiB mula sa kabuuang 1.934GiB. Alisin natin ang lalagyan na ito at simulang magsulat ng mga script ng docker-compose.

Itigil ng $ docker ang aking-nginx
$ docker rm my-nginx

Katumbas na ym file

Ang eksaktong lalagyan tulad ng nasa itaas ay maaaring malikha kung susundin natin ang mga hakbang na ito:

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

Lumilikha kami ng isang bagong walang laman na direktoryo at lumikha ng isang file docker-compose.yml dito. Kapag tatakbo kami mula sa direktoryo ng docker, hahanapin nito ang tukoy na file na ito (hindi pinapansin ang iba pa) at lilikha nang naaayon sa aming pag-deploy. Idagdag ang mga sumusunod na nilalaman sa loob ng .yml file na ito.

bersyon:'3'
mga serbisyo:
my-nginx:
imahe: nginx: pinakabagong
port:
-'80: 80 '

$ docker-compose up -d

Ang flag na -d ay idinagdag upang ang mga bagong nilikha na lalagyan ay tumatakbo sa background. Kung hindi man, ang terminal ay ikakabit mismo sa mga lalagyan at magsisimulang mag-print ng mga ulat mula rito. Maaari na nating makita ang mga istatistika ng (mga) bagong lalagyan na nilikha:

Mga istatistika ng $ docker -lahat

CONTAINER ID NAME CPU% MEM USAGE / LIMIT MEM% NET I / O BLOCK I / O PIDID
5f8a1e2c08ac my-compose_my-nginx_10.00% 2.25MiB / 1.934GiB0.11% 1.65kB / 0B 7.35MB / 0B2

Mapapansin mo na ang isang katulad na lalagyan tulad ng dati ay nilikha na may katulad na mga limitasyon sa memorya at kahit na ang paggamit. Mula sa parehong direktoryo na naglalaman ng yml file. Patakbuhin ang sumusunod na utos upang tanggalin ang bagong nilikha na lalagyan, kasama ang network ng tulay ng customer na nilikha.

$docker-compose pababa

Ibabalik nito ang docker sa isang malinis na estado na may pagbubukod sa anumang mga volume na nilikha (hindi kami lumikha ng anupaman kaya't hindi iyon pag-aalala.)

Mga Limitasyon sa Memory at Paglalagay ng Memory

Ang Mga Limitasyon sa Memorya at Paglalagay ng Memory ay dalawang magkakaibang aspeto upang matiyak ang isang maayos na paggana ng iyong mga application at ang host ng Docker na iyong pinapatakbo sa ibabaw.

Malawakang pagsasalita, ang Limit ng Memory ay nagpapataw ng isang itaas na limitasyon sa dami ng memorya na maaaring magamit ng isang lalagyan ng Docker. Bilang default ang isang lalagyan ng Docker, tulad ng anumang iba pang proseso ng system, ay maaaring gumamit ng buong magagamit na memorya ng host ng Docker. Maaari itong maging sanhi ng Out-of-Memory-Exception at maaaring napakahusay na pag-crash ng iyong system. Kahit na hindi kailanman dumating ito, maaari pa rin itong magutom sa iba pang proseso (kasama ang iba pang mga lalagyan) mula sa mahahalagang mapagkukunan, muling sinasaktan ang pagganap. Tinitiyak ng Mga Limitasyon sa Memory na ang mga lalagyan na nagugutom sa mapagkukunan ay hindi malampasan ang isang tiyak na limitasyon. Nililimitahan nito ang blast radius ng isang hindi magandang nakasulat na application sa ilang mga lalagyan, hindi ang buong host.

Ang Memory Reservations naman ay hindi gaanong matigas. Kapag ang system ay tumatakbo mababa sa memorya at sinusubukang bawiin ang ilan sa mga ito. Sinusubukan nitong dalhin ang pagkonsumo ng memorya ng lalagyan sa o sa ibaba ng limitasyon ng reservation. Kung mayroong isang kasaganaan ng memorya, gayunpaman, ang application ay maaaring mapalawak hanggang sa hard set na limitasyon ng memorya.

Upang buod:

  1. Limitasyon sa Memory: Isang mahigpit na itaas na limitasyon sa dami ng memorya na ginawang magagamit sa isang lalagyan.
  2. Pagreserba ng Memory: Dapat itong itakda bilang walang dala minimum na halaga ng memorya na kailangan ng isang application upang tumakbo nang maayos. Kaya't hindi ito nag-crash o maling pag-aalaga kapag sinusubukan ng system na bawiin ang ilan sa memorya.

Kung ang pagpapareserba ng memorya ay mas malaki kaysa sa limitasyon ng memorya, uunahin ang limitasyon ng memorya.

Pagtukoy sa Mga Limitasyon sa Memory at Pagreserba

Bersyon 2

Bumalik tayo sa docker-compose.yml na isinulat namin nang mas maaga at magdagdag ng isang limitasyon sa memorya dito. Baguhin ang bersyon sa 2.4 para sa mga kadahilanang tinalakay sa seksyon ng mga paunang kinakailangan.

bersyon:'2.4'
mga serbisyo:
my-nginx:
imahe: nginx: pinakabagong
port:
-'80: 80 '
mem_limit: 300m

Ang huling linya ay nagtatakda ng limitasyon para sa aking serbisyo ng-nginx sa 300MiB. Maaari mong gamitin ang k para sa KiB, at g para sa GiB at b para sa mga byte lamang. Gayunpaman, ang numero bago ito dapat ay isang integer. Hindi ka makakagamit ng mga halagang tulad ng 2.4m, kakailanganin mong gumamit ng 2400k sa halip. Ngayon kung tatakbo ka:

$ docker stat --lahat

CONTAINER ID NAME CPU% MEM USAGE / LIMIT MEM% NET I / O BLOCK I / O PIDID
44114d785d0a my-compose_my-nginx_10.00% 2.141MiB / 300MiB0.71% 1.16kB / 0B 0B / 0B2

Mapapansin mo na ang limitasyon ng memorya ay nakatakda sa 300 MiB. Ang pagtatakda ng pagpapareserba ng memorya ay pantay madali, magdagdag lamang ng isang linya na mem_reservation: xxx sa dulo.

bersyon:'2.4'
mga serbisyo:
my-nginx:
imahe: nginx: pinakabagong
port:
-'80: 80 '
mem_limit: 300m
mem_reservation: 100m

Bersyon 3 (Opsyonal)

Upang magamit ang pangatlong bersyon kailangan mong patakbuhin ang Docker sa swarm mode. Para sa Windows at Mac maaari mo itong paganahin gamit ang menu ng mga setting ng Docker. Ang mga gumagamit ng Linux ay kailangang magpatakbo ng docker swarm init. Higit pang impormasyon tungkol doon ay maaaring matagpuan dito . Ito ay hindi isang kinakailangang hakbang, at kung hindi mo pa ito pinagana, mabuti na rin. Ang seksyon na ito ay para sa mga tao na tumatakbo sa swarm mode at maaaring magamit ang mas bagong bersyon.

bersyon:'3'
mga serbisyo:
my-nginx:
imahe: nginx: pinakabagong
port:
-'80: 80 '
i-deploy:
mapagkukunan:
mga limitasyon:
memorya: 300m
mga pagpapareserba:
memorya: 100m

Natutukoy namin ang lahat ng ito sa ilalim ng pagpipiliang mapagkukunan. Ang mga limitasyon at Pagreserba ay naging pangunahing mga susi ng kanilang sarili at ang memorya ay ngunit ang isa sa maraming mga mapagkukunan na pinamamahalaan dito. Ang pagiging isa pang mahalagang parameter ng CPU.

Karagdagang impormasyon

Maaari kang matuto nang higit pa tungkol sa docker-compose mula sa opisyal na dokumentasyon naka-link dito . Sa sandaling makuha mo ang kabuuan ng kung paano magsulat ng isang sumulat ng file ang dokumentasyon ay maaaring makatulong sa iyo sa mga pagtutukoy ng iba't ibang mga parameter.

Hindi mo kailangang malaman ang lahat, maghanap lamang para sa kung ano ang kinakailangan ng iyong aplikasyon at gagabayan ka ng sanggunian sa pagpapatupad nito.