VM apo Docker?

Si e dini nëse keni nevojë për Docker dhe jo një VM? Ju duhet të përcaktoni se çfarë saktësisht dëshironi të izoloni. Nëse dëshironi të izoloni një sistem me burime të garantuara të dedikuara dhe pajisje virtuale, atëherë zgjedhja duhet të jetë një VM. Nëse keni nevojë të izoloni aplikacionet që ekzekutohen si procese të veçanta të sistemit, do t'ju duhet Docker.

Pra, cili është ndryshimi midis kontejnerëve Docker dhe VM-ve?

Makina virtuale (VM) është një kompjuter virtual me të gjitha pajisjet virtuale dhe një hard disk virtual në të cilin është instaluar një OS i ri i pavarur së bashku me drejtuesit e pajisjes virtuale, menaxhimin e kujtesës dhe komponentë të tjerë. Kjo do të thotë, ne marrim një abstraksion të harduerit fizik që na lejon të ekzekutojmë shumë kompjuterë virtualë në një kompjuter.
Një VM e instaluar mund të zërë hapësirë ​​në diskun e kompjuterit tuaj në mënyra të ndryshme:

  • hapësirë ​​fikse në hard disk, e cila lejon akses më të shpejtë në hard diskun virtual dhe shmang fragmentimin e skedarëve;
  • alokimi dinamik i memories. Kur instaloni aplikacione shtesë, memoria do të ndahet në mënyrë dinamike për to derisa të arrijë shumën maksimale të caktuar për të.

Sa më shumë makina virtuale për server, aq më shumë hapësirë ​​zënë ato dhe gjithashtu kërkojnë mbështetje të vazhdueshme për mjedisin që kërkohet për ekzekutimin e aplikacionit tuaj.

prerës është softuer për krijimin e aplikacioneve të bazuara në kontejnerë. Kontejnerët dhe makinat virtuale kanë përfitime të ngjashme, por funksionojnë ndryshe. Kontejnerët zënë më pak hapësirë ​​sepse... ripërdorni më shumë burime të përbashkëta të sistemit pritës sesa VM, sepse ndryshe nga VM, ai ofron virtualizim në nivelin OS, jo në nivelin e harduerit. Kjo qasje rezulton në gjurmë më të ulët të memories, vendosje më të shpejtë dhe shkallëzim më të lehtë.

Kontejneri ofron një mekanizëm më efikas për kapsulimin e aplikacioneve duke ofruar ndërfaqet e nevojshme për sistemin pritës. Kjo veçori lejon kontejnerët të ndajnë thelbin e sistemit, me çdo kontejner që funksionon si një proces i veçantë OS pritës që ka grupin e vet të zonave të memories (hapësirën e vet të adresave virtuale). Meqenëse hapësira e adresës virtuale të çdo kontejneri është e saj, të dhënat që i përkasin zonave të ndryshme të memories nuk mund të ndryshohen.
OS amtare për Docker është Linux (Docker mund të përdoret gjithashtu në Windows dhe MacOS), ai përdor avantazhet e tij kryesore, të cilat e lejojnë atë të organizojë ndarjen e kernelit. Përdorimi i kontejnerëve Docker në Windows do të bëhet brenda një makinerie virtuale që funksionon Linux OS, sepse kontejnerët ndajnë OS të sistemit pritës dhe OS kryesor për ta është Linux.

Enë - si funksionon?

Enë është një abstraksion i nivelit të aplikacionit që kombinon kodin dhe varësitë. Kontejnerët krijohen gjithmonë nga imazhet, duke shtuar një shtresë të sipërme të shkrueshme dhe duke inicializuar parametra të ndryshëm. Për shkak se një kontejner ka shtresën e vet të shkrimit dhe të gjitha ndryshimet ruhen në atë shtresë, kontejnerët e shumtë mund të ndajnë qasjen në të njëjtin imazh kryesor.

Çdo kontejner mund të konfigurohet përmes një skedari në projektin docker-compose të përfshirë në zgjidhjen kryesore - docker-compose.yml. Aty mund të vendosni parametra të ndryshëm si emri i kontejnerit, portat, identifikuesit, kufijtë e burimeve, varësitë midis kontejnerëve të tjerë. Nëse nuk specifikoni një emër kontejneri në cilësimet, Docker do të krijojë një kontejner të ri çdo herë, duke i dhënë një emër rastësisht.

Kur një kontejner niset nga një imazh, Docker monton një sistem skedari lexim-shkrimi në krye të çdo shtrese më poshtë. Këtu do të ekzekutohen të gjitha proceset që duam të ekzekutojë kontejneri ynë Docker.

Kur Docker nis për herë të parë një kontejner, shtresa fillestare e leximit-shkrimit është bosh. Kur ndodhin ndryshime, ato aplikohen në këtë shtresë; për shembull, nëse dëshironi të ndryshoni një skedar, ai skedar do të kopjohet nga shtresa vetëm për lexim më poshtë në shtresën lexim-shkrim.
Versioni vetëm për lexim i skedarit do të ekzistojë ende, por tani është i fshehur nën kopje. Vëllimet përdoren për të ruajtur të dhënat, pavarësisht nga cikli i jetës së kontejnerit. Vëllimet inicializohen kur krijohet kontejneri.

Si lidhet imazhi me kontejnerin?

imazh - elementi kryesor për çdo enë. Imazhi është krijuar nga një Dockerfile i shtuar në projekt dhe është një grup sistemesh skedarësh (shtresash) të shtresuara njëra mbi tjetrën dhe të grupuara së bashku, vetëm për lexim; numri maksimal i shtresave është 127.

Në zemër të çdo imazhi është një imazh bazë, i cili specifikohet nga komanda FROM - pika hyrëse gjatë ndërtimit të imazhit Dockerfile. Çdo shtresë është një shtresë vetëm për lexim dhe përfaqësohet nga një komandë e vetme që modifikon sistemin e skedarëve, të shkruar në një Dockerfile.
Për të kombinuar këto shtresa në një imazh të vetëm, Docker përdor sistemin e skedarëve të avancuar me shumë shtresa të Unionit (AuFS është ndërtuar në krye të UnionFS), duke lejuar që skedarët dhe drejtoritë e ndryshme nga shtresa të ndryshme skedarësh të mbivendosen në mënyrë transparente, duke krijuar një sistem skedar koheziv.

Shtresat përmbajnë meta të dhëna që ju lejojnë të ruani informacione të lidhura për secilën shtresë gjatë kohës së ekzekutimit dhe kohës së ndërtimit. Çdo shtresë përmban një lidhje me shtresën tjetër; nëse një shtresë nuk ka një lidhje, atëherë ajo është shtresa më e lartë në imazh.

Dockerfile mund të përmbajë komanda të tilla si:

  • FROM - pika e hyrjes kur formoni një imazh;
  • MAINTAINER - emri i pronarit të imazhit;
  • RUN - ekzekutimi i komandës gjatë montimit të imazhit;
  • ADD - kopjimi i skedarit pritës në një imazh të ri; nëse specifikoni URL-në e skedarit, Docker do ta shkarkojë atë në drejtorinë e specifikuar;
  • ENV - variablat e mjedisit;
  • CMD - fillon krijimin e një kontejneri të ri bazuar në imazhin;
  • ENTRYPOINT - komanda ekzekutohet kur fillon kontejneri.
  • WORKDIR është drejtoria e punës për ekzekutimin e komandës CMD.
  • USER - vendos UID për kontejnerin e krijuar në bazë të imazhit.
  • VOLUME - monton direktoriumin pritës në kontejner.
  • EXPOSE është një grup portash që dëgjohen në kontejner.

Si funksionon UnionFS?

UnionFS — Sistemi i skedarëve të grupit të shërbimeve (FS) për Linux dhe FreeBSD. Ky FS zbaton një mekanizëm kopjimi në shkrim (Copy-On-Write, COW). Njësia e punës e UnionFS është një shtresë; çdo shtresë duhet të konsiderohet si një sistem skedari i plotë i veçantë me një hierarki drejtorish nga vetë rrënja. UnionFS krijon një montim bashkimi për sisteme të tjera skedarësh dhe lejon që skedarët dhe drejtoritë nga sisteme të ndryshme skedarësh (të quajtur forks) të kombinohen në një sistem skedar të vetëm koherent, në mënyrë transparente për përdoruesin.

Përmbajtja e drejtorive me të njëjtat shtigje do të shfaqet së bashku në një direktori të unifikuar (në një hapësirë ​​të vetme emri) të sistemit të skedarëve që rezulton.

UnionFS kombinon shtresat bazuar në parimet e mëposhtme:

  • njëra nga shtresat bëhet shtresa e nivelit të lartë, shtresa e dytë dhe ajo pasuese bëhen shtresa të nivelit të ulët;
  • objektet e shtresave janë në dispozicion të përdoruesit "nga lart poshtë", d.m.th. nëse objekti i kërkuar është në shtresën "lart", ai kthehet, pavarësisht nga prania e një objekti me të njëjtin emër në shtresën "poshtë"; përndryshe kthehet objekti i shtresës “fund”; nëse objekti i kërkuar nuk është as aty dhe as aty, kthehet gabimi “Nuk ka skedar apo drejtori të tillë”;
  • shtresa e punës është ajo "e lartë", domethënë, të gjitha veprimet e përdoruesit për të ndryshuar të dhënat pasqyrohen vetëm në shtresën e nivelit të lartë, pa ndikuar në përmbajtjen e shtresave të niveleve më të ulëta.

Docker është teknologjia më e zakonshme për përdorimin e kontejnerëve për të ekzekutuar aplikacione. Është bërë standardi në terren, duke u ndërtuar mbi cgroups dhe hapësirat e emrave të ofruara nga kerneli Linux.

Docker na lejon të vendosim shpejt aplikacionet dhe të përdorim sa më mirë sistemin e skedarëve duke ndarë bërthamën e OS midis të gjithë kontejnerëve, duke ekzekutuar si procese të veçanta të OS.

Burimi: www.habr.com

Shto një koment