Si të kuptoni se ju nevojitet Docker dhe jo VM? Duhet të përcaktoni se çfarë saktësisht dëshironi të izolonit. Nëse duhet të izolonit një sistem me burime të garantuara dhe me harduer virtual, atëherë zgjedhja duhet të bjerë mbi VM. Nëse duhet të izolonit aplikacione të funksionimit si procese të veçanta të sistemit, ju nevojitet Docker.
Pra, çfarë është dallimi midis konteinerëve Docker dhe VM?
Makinë virtuale (VM) është një kompjuter virtual me të gjitha pajisjet virtuale dhe diskun virtual, në të cilin instalohet një OS e re e pavarur së bashku me drejtuesit virtualë të pajisjeve, menaxhimin e memories dhe komponentët e tjerë. Ajo që na lejon, është një abstraksion i harduerit fizik, duke mundësuar ekzekutimin e shumë kompjuterëve virtualë në një kompjuter të vetëm.
Një VM e instaluar mund të zërë hapësira të ndryshme në diskun e kompjuterit:
- hapësirë fikse në diskun e ngurtë, çka mundëson një qasje më të shpejtë në disku virtual dhe shmang fragmentimin e skedarit;
- ndarjen dinamike të memories. Gjatë instalimit të aplikacioneve shtesë, memoria do të ndahet dinamikisht për to, derisa të arrijë volumit maksimal të caktuar asaj.
Sa më shumë makinat virtuale në server, aq më shumë hapësirë zënë dhe gjithashtu kërkojnë mbështetje të vazhdueshme të mjedisit të nevojshme për funksionimin e aplikacionit tuaj.
Docker është një software për krijimin e aplikacioneve mbi bazën e kontejnerëve. Konteinerët dhe makina virtuale kanë përfitime të ngjashme, por funksionojnë ndryshe. Konteinerët zënë më pak hapësirë, sepse ripërdorin një sasi më të madhe të burimeve të përbashkëta të sistemit pritës sesa VM, sepse, ndryshe nga VM, ofrojnë virtualizim në nivelin e OS, dhe jo të harduerit. Ky qasje siguron një volum më të vogël të memories të zënë, implementim të shpejtë dhe një shkallëzim më të lehtë.
Konteineri ofron një mekanizëm më efikas të inkapsulimit të aplikacioneve, duke siguruar ndërfaqet e nevojshme të sistemit pritës. Kjo mundësi lejon që kontejnerët të ndajnë bërthamat e sistemit, ku secili prej kontejnerëve funksionon si një proces i veçantë i OS kryesore, i cili ka një grup të vetin të hapësirës së memories (hapësirë e alamatës virtuale). Duke qenë se hapësira e alamatës virtuale e secilit kontejner është e veçantë, të dhënat që i takojnë hapësirave të ndryshme të memories nuk mund të ndryshohen.
Sistemi operativ natyror për Docker është Linux (Docker mund të përdoret gjithashtu në Windows dhe MacOS), ai përdor avantazhet e tij kryesore, të cilat i lejojnë atij të organizojë ndarjen e bërthamës. Aktivizimi i kontejnerëve Docker në Windows do të ndodhë brenda një makine virtuale me sistemin operativ Linux, pasi kontejnerët ndajnë OS-në e sistemit pritës dhe sistemi kryesor për ta është Linux.
Konteineri â si funksionon kjo?
Konteineri është një abstraksion në nivelin e aplikacionit, që bashkon kodin dhe varësitë. Kontejnerët gjithmonë krijohen nga imazhe, duke shtuar një shtresë të dispozitshme për shkak të shkrimit dhe fillon parametrat e ndryshëm. Duke qenë se kontejneri ka shtresën e tij për shkak të shkrimit dhe të gjitha ndryshimet ruhen në këtë shtresë, disa kontejnerë mund të ndajnë qasjen në të njëjtin imazh kryesor.
Ădo kontejner mund tĂ« konfigurohet pĂ«rmes njĂ« skedari nĂ« projektin docker-compose, i pĂ«rfshirĂ« nĂ« zgjidhjen kryesore â docker-compose.yml. Aty mund tĂ« pĂ«rcaktohen parametra tĂ« ndryshĂ«m si emri i kontejnerit, portet, identifikuesit, kufijtĂ« e burimeve, varĂ«sitĂ« me kontejnerĂ« tĂ« tjerĂ«. NĂ«se nuk pĂ«rcaktohet emri i kontejnerit nĂ« konfigurime, Docker do tĂ« krijojĂ« çdo herĂ« njĂ« kontejner tĂ« ri, duke i dhĂ«nĂ« atij njĂ« emĂ«r rastĂ«sor.
Kur kontejneri ndizet nga një imazh, Docker monton sistemin e skedarëve për lexim dhe shkruaj përmbi çdo shtresë më poshtë. Këtu do të ekzekutohen të gjithë proceset që dëshirojmë që kontejneri ynë Docker të ekzekutojë.
Kur Docker aktivizon për herë të parë një kontejner, shtresa fillestare për lexim dhe shkruaj ë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 e lehtë për leximin më poshtë në shtresën për lexim dhe shkruaj.
Versioni e files, e cila është e disponueshme vetëm për lexim, do të ekzistojë ende, por tani është e fshehur pas një kopjeje. Volume përdoren për ruajtjen e të dhënave, pavarësisht nga cikli i jetës së kontejnerit. Volume-in inicializohen kur krijohet kontejneri.
Si është e lidhur imazhi me kontejnerin?
Imazh â elementi kryesor pĂ«r çdo kontejner. Imazhi krijohet nga Dockerfile, i shtuar nĂ« projekt dhe pĂ«rfaqĂ«son njĂ« grup sistemesh skedash (shtresash) tĂ« mbivendosura dhe tĂ« grumbulluara sĂ« bashku, tĂ« disponueshme vetĂ«m pĂ«r lexim; numri maksimal i shtresave Ă«shtĂ« 127.
NĂ« themel tĂ« çdo imazhi qĂ«ndron njĂ« imazh bazĂ«, i cili pĂ«rcaktohet nga komanda FROM â pika hyrĂ«se gjatĂ« formimit tĂ« imazhit Dockerfile. Ădo shtresĂ« Ă«shtĂ« njĂ« shtresĂ« e lexueshme dhe pĂ«rfaqĂ«sohet nga njĂ« komandĂ« qĂ« modifikon sistemin e skedarĂ«ve tĂ« shkruar nĂ« Dockerfile.
Për të kombinuar këto shtresa në një imazh, Docker përdor Advanced multi layered Union file system (AuFS është e bazuar në UnionFS), duke lejuar që skedarët dhe direktorët e ndryshëm nga shtresat e ndryshme të skedarëve të mbivendosen transparencisht, duke krijuar një sistem skedarësh të lidhur.
Shtresat pĂ«rmbajnĂ« metadata qĂ« lejojnĂ« ruajtjen e informacionit shoqĂ«rues pĂ«r secilĂ«n shtresĂ« gjatĂ« ekzekutimit dhe ndĂ«rtimit. Ădo shtresĂ« pĂ«rmban njĂ« referencĂ« nĂ« shtresĂ«n pasuese, nĂ«se shtresa nuk ka referencĂ«, atĂ«herĂ« kjo Ă«shtĂ« shtresa mĂ« e sipĂ«rme nĂ« imazh.
Dockerfile mund të përmbajë komandat si:
- FROM â pika hyrĂ«se gjatĂ« formimit tĂ« imazhit;
- MAINTAINER â emri i pronarit tĂ« imazhit;
- RUN â ekzekuton njĂ« komandĂ« gjatĂ« ndĂ«rtimit tĂ« imazhit;
- ADD â kopjon njĂ« skedar nga host nĂ« imazhin e ri, nĂ«se pĂ«rcaktohet URL e skedarit, Docker do ta shkarkojĂ« nĂ« direktorinĂ« e caktuar;
- ENV â variablat e ambientit;
- CMD â fillon krijimin e njĂ« kontejneri tĂ« ri bazuar nĂ« imazh;
- ENTRYPOINT â komanda ekzekutohet kur fillohet kontejneri.
- WORKDIR â katalogu punues pĂ«r ekzekutimin e komandĂ«s CMD.
- USER â vendos UID pĂ«r kontejnerin e krijuar mbi imazhin.
- VOLUME â monton njĂ« direktori host nĂ« kontejner.
- EXPOSE â grupi i porteve tĂ« dĂ«gjuara nĂ« kontejner.
Si funksionon UnionFS?
UnionFS â njĂ« sistem skedari stakik shĂ«rbimi (FS) pĂ«r Linux dhe FreeBSD. Ky FS implementon mekanizmin e kopjimit gjatĂ« shkrimit (Copy-On-Write, COW). NjĂ«sia punuese e UnionFS Ă«shtĂ« njĂ« shtresĂ«, çdo shtresĂ« duhet tĂ« merret nĂ« konsideratĂ« si njĂ« sistem skedari i pavarur dhe tĂ« plotĂ« me njĂ« hierarki direktorĂ«sh nga rrĂ«njĂ«sore. UnionFS krijon njĂ« montim tĂ« bashkuar pĂ«r sistemet e tjera tĂ« skedarĂ«ve dhe lejon qĂ« pĂ«rdoruesi tĂ« bashkojĂ« skedarĂ« dhe katalogĂ« tĂ« sistemeve tĂ« ndryshme skedari (tĂ« quajtur degĂ«) nĂ« njĂ« sistem skedari tĂ« lidhur tĂ« vetĂ«m.
Përmbajtja e katalogëve me rrugë të njëjta do të shfaqet së bashku në një katalog të bashkuar (në një hapësirë emri të vetme) të sistemit të skedarëve të marrë.
UnionFS bashkon shtresat duke u udhëhequr nga parimet e mëposhtme:
- njĂ« nga shtresat bĂ«het shtresa e nivelit tĂ« lartĂ«, ndĂ«rsa e dyta dhe shtresat e mĂ«passhme â shtresa tĂ« nivelit tĂ« poshtĂ«m;
- objektet e shtresave janë të arritshme për përdoruesin "nga lartë poshtë", dmth. nëse objekti i kërkuar ndodhet në "shtresën e lartë", ai kthehet, pavarësisht nga ekzistenca e një objekti me të njëjtin emër në "shtresën e poshtme"; përndryshe kthehet objekti i "shtresës së poshtme"; nëse objekti i kërkuar nuk ekziston as aty as këtu, kthehet një gabim "Nuk ka një skedar ose katalog të tillë";
- shtresa e punës është "shtresa e lartë", dmth. të gjitha veprimet e përdoruesit për ndryshimin e të dhënave reflektohen vetëm në shtresën e nivelit të lartë, pa ndikuar në përmbajtjen e shtresave të nivelit të poshtëm.
Docker është teknologjia më e përhapur për përdorimin e kontejnerëve në punën e aplikacioneve. Ai është bërë standard në këtë fushë, duke u ndërtuar mbi bazën e cgroups dhe hapësirave emri që siguron bërthama Linux.
Docker na lejon të deploym aplikacioneve shpejt dhe të përdorim maksimalisht sistemin e skedarëve falë ndarjes së bërthamës së OS midis të gjitha konteinerëve, duke funksionuar si procese të veçanta të OS.
Burimi: habr.com
