SÄkÄs 10. augustÄ Slurm
Å ajÄ rakstÄ mÄs runÄsim par Docker vÄsturi un tÄs galvenajÄm abstrakcijÄm: Image, Cli, Dockerfile. Lekcija paredzÄta iesÄcÄjiem, tÄpÄc diez vai tÄ varÄtu interesÄt pieredzÄjuÅ”us lietotÄjus. NebÅ«s asiÅu, aklÄs zarnas vai dziļas iegremdÄÅ”anas. PaÅ”i pamati.
Kas ir Docker
Apskatīsim Docker definīciju no Wikipedia.
Docker ir programmatÅ«ra lietojumprogrammu izvietoÅ”anas un pÄrvaldÄ«bas automatizÄÅ”anai konteinerizÄtÄs vidÄs.
No Ŕīs definÄ«cijas nekas nav skaidrs. ÄŖpaÅ”i nav skaidrs, ko nozÄ«mÄ āvidÄs, kas atbalsta konteinerizÄcijuā. Lai to uzzinÄtu, atgriezÄ«simies laikÄ. SÄksim ar laikmetu, ko es parasti saucu par āmonolÄ«tu laikmetuā.
Monolīta laikmets
MonolÄ«ta laikmets ir 2000. gadu sÄkums, kad visas lietojumprogrammas bija monolÄ«tas ar daudzÄm atkarÄ«bÄm. AttÄ«stÄ«ba prasÄ«ja ilgu laiku. TajÄ paÅ”Ä laikÄ serveru nebija daudz; mÄs tos visus zinÄjÄm pÄc vÄrda un uzraudzÄ«jÄm. Ir tÄds jocÄ«gs salÄ«dzinÄjums:
MÄjdzÄ«vnieki ir mÄjdzÄ«vnieki. MonolÄ«tÄ laikmetÄ mÄs pret saviem serveriem izturÄjÄmies kÄ pret mÄjdzÄ«vniekiem, koptiem un lolotiem, izpÅ«Å”ot putekļu plankumus. Un labÄkai resursu pÄrvaldÄ«bai izmantojÄm virtualizÄciju: paÅÄmÄm serveri un sagriezÄm to vairÄkÄs virtuÄlajÄs maŔīnÄs, tÄdÄjÄdi nodroÅ”inot vides izolÄciju.
Uz hipervizoriem balstÄ«tas virtualizÄcijas sistÄmas
Ikviens droÅ”i vien ir dzirdÄjis par virtualizÄcijas sistÄmÄm: VMware, VirtualBox, Hyper-V, Qemu KVM uc TÄs nodroÅ”ina lietojumprogrammu izolÄciju un resursu pÄrvaldÄ«bu, taÄu tÄm ir arÄ« trÅ«kumi. Lai veiktu virtualizÄciju, jums ir nepiecieÅ”ams hipervizors. Un hipervizors ir papildu resurss. Un pati virtuÄlÄ maŔīna parasti ir vesels koloss - smags attÄls, kurÄ ir operÄtÄjsistÄma, Nginx, Apache un, iespÄjams, MySQL. AttÄls ir liels, un virtuÄlÄs maŔīnas darbÄ«ba ir neÄrta. RezultÄtÄ darbs ar virtuÄlajÄm maŔīnÄm var bÅ«t lÄns. Lai atrisinÄtu Å”o problÄmu, tika izveidotas virtualizÄcijas sistÄmas kodola lÄ«menÄ«.
Kodola lÄ«meÅa virtualizÄcijas sistÄmas
Kodola lÄ«meÅa virtualizÄciju atbalsta OpenVZ, Systemd-nspawn, LXC sistÄmas. Spilgts Å”Ädas virtualizÄcijas piemÄrs ir LXC (Linux Containers).
LXC ir operÄtÄjsistÄmas lÄ«meÅa virtualizÄcijas sistÄma vairÄku izolÄtu Linux operÄtÄjsistÄmas gadÄ«jumu darbinÄÅ”anai vienÄ mezglÄ. LXC neizmanto virtuÄlÄs maŔīnas, bet veido virtuÄlo vidi ar savu procesu telpu un tÄ«kla steku.
BÅ«tÄ«bÄ LXC izveido konteinerus. KÄda ir atŔķirÄ«ba starp virtuÄlajÄm maŔīnÄm un konteineriem?
Konteiners nav piemÄrots procesu izolÄÅ”anai: virtualizÄcijas sistÄmÄs kodola lÄ«menÄ« tiek atrastas ievainojamÄ«bas, kas ļauj tÄm izkļūt no konteinera uz saimniekdatoru. TÄpÄc, ja jums ir nepiecieÅ”ams kaut ko izolÄt, labÄk ir izmantot virtuÄlo maŔīnu.
AtŔķirÄ«bas starp virtualizÄciju un konteinerizÄciju var redzÄt diagrammÄ.
Ir aparatūras hipervizori, hipervizori virs OS un konteineri.
AparatÅ«ras hipervizori ir lieliski, ja patieÅ”Äm vÄlaties kaut ko izolÄt. Jo ir iespÄjams izolÄt atmiÅas lapu un procesoru lÄ«menÄ«.
Ir hipervizori kÄ programma, un ir konteineri, un mÄs par tiem runÄsim tÄlÄk. Konteineru sistÄmÄm nav hipervizora, bet ir konteineru dzinÄjs, kas izveido un pÄrvalda konteinerus. Å Ä« lieta ir vieglÄka, tÄpÄc, strÄdÄjot ar kodolu, ir mazÄks pieskaitÄ«jums vai to nav vispÄr.
Kas tiek izmantots konteinerizÄcijai kodola lÄ«menÄ«
GalvenÄs tehnoloÄ£ijas, kas ļauj izveidot no citiem procesiem izolÄtu konteineru, ir Namespaces un Control Groups.
VÄrdtelpas: PID, Networking, Mount un User. Ir arÄ« vairÄk, taÄu, lai bÅ«tu vieglÄk saprast, mÄs koncentrÄsimies uz tiem.
PID nosaukumvieta ierobežo procesus. Kad, piemÄram, izveidojam PID nosaukumvietu un ievietojam tur procesu, tas kļūst ar PID 1. Parasti sistÄmÄs PID 1 ir systemd vai init. AttiecÄ«gi, ievietojot procesu jaunÄ nosaukumvietÄ, tas saÅem arÄ« PID 1.
Networking Namespace ļauj ierobežot/izolÄt tÄ«klu un ievietot tajÄ savas saskarnes. Mount ir failu sistÄmas ierobežojums. LietotÄjs ā lietotÄju ierobežojums.
VadÄ«bas grupas: atmiÅa, centrÄlais procesors, IOPS, tÄ«kls - kopÄ aptuveni 12 iestatÄ«jumi. CitÄdi tos sauc arÄ« par C grupÄm (āC grupÄmā).
VadÄ«bas grupas pÄrvalda konteinera resursus. Izmantojot kontroles grupas, mÄs varam teikt, ka konteineram nevajadzÄtu patÄrÄt vairÄk par noteiktu resursu daudzumu.
Lai konteinerizÄcija darbotos pilnvÄrtÄ«gi, tiek izmantotas papildu tehnoloÄ£ijas: IespÄjas, Copy-on-write un citas.
IespÄjas ir tad, kad mÄs procesam sakÄm, ko tas var un ko nevar. Kodola lÄ«menÄ« tÄs ir vienkÄrÅ”i bitkartes ar daudziem parametriem. PiemÄram, root lietotÄjam ir visas privilÄÄ£ijas un viÅÅ” var darÄ«t visu. Laika serveris var mainÄ«t sistÄmas laiku: tam ir Time Capsule iespÄjas, un tas arÄ« viss. Izmantojot privilÄÄ£ijas, varat elastÄ«gi konfigurÄt procesu ierobežojumus un tÄdÄjÄdi aizsargÄt sevi.
SistÄma Copy-on-Write ļauj mums strÄdÄt ar Docker attÄliem un izmantot tos efektÄ«vÄk.
Docker paÅ”laik ir saderÄ«bas problÄmas ar Cgroups v2, tÄpÄc Å”is raksts ir Ä«paÅ”i vÄrsts uz Cgroups v1.
Bet atgriezÄ«simies vÄsturÄ.
Kad virtualizÄcijas sistÄmas parÄdÄ«jÄs kodola lÄ«menÄ«, tÄs sÄka aktÄ«vi izmantot. Hipervizora pieskaitÄmÄs izmaksas pazuda, bet dažas problÄmas saglabÄjÄs:
- lieli attÄli: tajÄ paÅ”Ä OpenVZ iespiež operÄtÄjsistÄmu, bibliotÄkas, dažÄdas programmatÅ«ras, un galu galÄ attÄls joprojÄm izrÄdÄs diezgan liels;
- Nav normÄlu standartu iepakoÅ”anai un piegÄdei, tÄpÄc atkarÄ«bu problÄma paliek. PastÄv situÄcijas, kad divas koda daļas izmanto vienu un to paÅ”u bibliotÄku, bet ar dažÄdÄm versijÄm. Starp viÅiem var rasties konflikts.
Lai atrisinÄtu visas Ŕīs problÄmas, ir pienÄcis nÄkamais laikmets.
Konteineru laikmets
Kad pienÄca konteineru laikmets, darba ar tiem filozofija mainÄ«jÄs:
- Viens process - viens konteiners.
- MÄs piegÄdÄjam visas procesam nepiecieÅ”amÄs atkarÄ«bas tÄ konteinerÄ. Tas prasa monolÄ«tu sagrieÅ”anu mikropakalpojumos.
- Jo mazÄks attÄls, jo labÄk - ir mazÄk iespÄjamo ievainojamÄ«bu, tas izrullÄ ÄtrÄk utt.
- Gadījumi kļūst īslaicīgi.
Atcerieties, ko es teicu par mÄjdzÄ«vniekiem pret liellopiem? IepriekÅ” gadÄ«jumi bija kÄ mÄjdzÄ«vnieki, bet tagad tie ir kļuvuÅ”i par liellopiem. IepriekÅ” bija monolÄ«ts - viens pieteikums. Tagad tie ir 100 mikropakalpojumi, 100 konteineri. Dažiem konteineriem var bÅ«t 2ā3 kopijas. Mums kļūst mazÄk svarÄ«gi kontrolÄt katru konteineru. Mums svarÄ«gÄka ir paÅ”a pakalpojuma pieejamÄ«ba: ko dara Å”is konteineru komplekts. Tas maina pieejas monitoringam.
2014.ā2015. gadÄ uzplauka Docker ā tehnoloÄ£ija, par kuru mÄs tagad runÄsim.
Docker mainÄ«ja filozofiju un standartizÄja lietojumprogrammu iepakojumu. Izmantojot Docker, mÄs varam iepakot lietojumprogrammu, nosÅ«tÄ«t to uz repozitoriju, lejupielÄdÄt no turienes un izvietot to.
MÄs ievietojam visu nepiecieÅ”amo Docker konteinerÄ, tÄpÄc atkarÄ«bas problÄma ir atrisinÄta. Docker garantÄ reproducÄjamÄ«bu. Es domÄju, ka daudzi cilvÄki ir saskÄruÅ”ies ar neproducÄjamÄ«bu: viss darbojas jÅ«su labÄ, jÅ«s to nospiežat uz ražoÅ”anu, un tur tas pÄrstÄj darboties. Izmantojot Docker, Ŕī problÄma pazÅ«d. Ja jÅ«su Docker konteiners sÄk darboties un dara to, kas tam jÄdara, tad ar lielu varbÅ«tÄ«bas pakÄpi tas sÄks ražoÅ”anu un darÄ«s to paÅ”u.
AtkÄpe par pieskaitÄmajÄm izmaksÄm
Par pieskaitÄmajÄm izmaksÄm vienmÄr ir strÄ«di. Daži cilvÄki uzskata, ka Docker nenes papildu slodzi, jo tas izmanto Linux kodolu un visus tÄ konteinerizÄÅ”anai nepiecieÅ”amos procesus. PiemÄram, "ja sakÄt, ka Docker ir virs galvas, tad Linux kodols ir virs galvas."
No otras puses, ja iedziļinÄties, Docker patieÅ”Äm ir vairÄkas lietas, par kurÄm var teikt, ka tÄs ir virs galvas.
PirmÄ ir PID nosaukumvieta. Kad mÄs ievietojam procesu nosaukumvietÄ, tam tiek pieŔķirts PID 1. TajÄ paÅ”Ä laikÄ Å”im procesam ir cits PID, kas atrodas resursdatora nosaukumvietÄ Ärpus konteinera. PiemÄram, mÄs palaižÄm Nginx konteinerÄ, tas kļuva par PID 1 (galvenais process). Un resursdatorÄ tam ir PID 12623. Un ir grÅ«ti pateikt, cik lielas tÄs ir.
Otra lieta ir Cgrupas. Å emsim Cgrupas pÄc atmiÅas, tas ir, spÄju ierobežot konteinera atmiÅu. Kad tas ir iespÄjots, tiek aktivizÄti skaitÄ«tÄji un atmiÅas uzskaite: kodolam ir jÄsaprot, cik lapas Å”im konteineram ir pieŔķirtas un cik vÄl ir brÄ«vas. Tas, iespÄjams, ir pieskaitÄmas izmaksas, taÄu es neesmu redzÄjis precÄ«zus pÄtÄ«jumus par to, kÄ tas ietekmÄ veiktspÄju. Un es pats nepamanÄ«ju, ka lietojumprogramma, kas darbojas Docker, pÄkÅ”Åi piedzÄ«voja strauju veiktspÄjas zudumu.
Un vÄl viena piezÄ«me par veiktspÄju. Daži kodola parametri tiek nodoti no resursdatora uz konteineru. Jo Ä«paÅ”i daži tÄ«kla parametri. TÄpÄc, ja vÄlaties Docker palaist kaut ko augstas veiktspÄjas, piemÄram, kaut ko tÄdu, kas aktÄ«vi izmantos tÄ«klu, tad jums vismaz ir jÄpielÄgo Å”ie parametri. PiemÄram, daži nf_conntrack.
Par Docker koncepciju
Docker sastÄv no vairÄkiem komponentiem:
- Docker Daemon ir tas pats Container Engine; palaiž konteinerus.
- Docker CII ir Docker pÄrvaldÄ«bas utilÄ«ta.
- Dockerfile ā instrukcijas, kÄ izveidot attÄlu.
- AttÄls ā attÄls, no kura tiek izritinÄts konteiners.
- Konteiners.
- Docker reÄ£istrs ir attÄlu repozitorijs.
Shematiski tas izskatÄs apmÄram Å”Ädi:
Docker dÄmons darbojas vietnÄ Docker_host un palaiž konteinerus. Ir klients, kas sÅ«ta komandas: izveidojiet attÄlu, lejupielÄdÄjiet attÄlu, palaidiet konteineru. Docker dÄmons dodas uz reÄ£istru un izpilda tos. Docker klients var piekļūt gan lokÄli (Unix ligzdai), gan caur TCP no attÄlÄ resursdatora.
Apskatīsim katru komponentu.
Docker dÄmons - Ŕī ir servera daļa, tÄ darbojas resursdatorÄ: lejupielÄdÄ attÄlus un palaiž no tiem konteinerus, izveido tÄ«klu starp konteineriem, apkopo žurnÄlus. Kad mÄs sakÄm āizveidi tÄluā, to dara arÄ« dÄmons.
Docker CLI ā Docker klienta daļa, konsoles utilÄ«ta darbam ar dÄmonu. Es atkÄrtoju, tas var darboties ne tikai lokÄli, bet arÄ« tÄ«klÄ.
Pamatkomandas:
docker ps ā parÄdÄ«t konteinerus, kas paÅ”laik darbojas Docker resursdatorÄ.
docker images ā rÄdÄ«t lokÄli lejupielÄdÄtos attÄlus.
docker search <> - meklÄjiet attÄlu reÄ£istrÄ.
docker pull <> ā lejupielÄdÄjiet attÄlu no reÄ£istra uz maŔīnu.
docker build < > - savÄc attÄlu.
docker palaist <> - palaidiet konteineru.
docker rm <> - izÅemiet konteineru.
docker logs <> - konteineru baļķi
docker start/stop/restart <> - darbs ar konteineru
Ja apgÅ«stat Ŕīs komandas un esat pÄrliecinÄts par to lietoÅ”anu, uzskatiet, ka esat par 70% lietpratÄjs Docker lietotÄja lÄ«menÄ«.
Dockerfile - instrukcijas attÄla izveidoÅ”anai. GandrÄ«z katra instrukciju komanda ir jauns slÄnis. ApskatÄ«sim piemÄru.
Å Ädi izskatÄs Dockerfile: komandas kreisajÄ pusÄ, argumenti labajÄ pusÄ. Katra komanda, kas ir Å”eit (un parasti rakstÄ«ta Dockerfile), izveido jaunu slÄni attÄlÄ.
Pat skatoties uz kreiso pusi, var aptuveni saprast, kas notiek. MÄs sakÄm: āizveidojiet mums mapiā - tas ir viens slÄnis. āPadariet mapi darba kÄrtÄ«bÄā ir vÄl viens slÄnis un tÄ tÄlÄk. KÄrta kÅ«ka atvieglo dzÄ«vi. Ja es izveidoju citu Dockerfile un mainu kaut ko pÄdÄjÄ rindÄ ā es palaižu kaut ko citu, nevis āpythonā āmain.pyā, vai instalÄju atkarÄ«bas no cita faila, tad iepriekÅ”Äjie slÄÅi tiks atkÄrtoti izmantoti kÄ keÅ”atmiÅa.
attÄls - tas ir konteineru iepakojums; konteineri tiek palaisti no attÄla. Ja skatÄmies uz Docker no pakotÅu pÄrvaldnieka viedokļa (it kÄ mÄs strÄdÄtu ar deb vai rpm pakotnÄm), tad attÄls bÅ«tÄ«bÄ ir rpm pakotne. Izmantojot yum instalÄÅ”anu, mÄs varam instalÄt lietojumprogrammu, izdzÄst to, atrast to repozitorijÄ un lejupielÄdÄt. Å eit ir apmÄram tas pats: konteineri tiek palaisti no attÄla, tie tiek glabÄti Docker reÄ£istrÄ (lÄ«dzÄ«gi kÄ yum, repozitorijÄ), un katram attÄlam ir SHA-256 jaucÄjvÄrds, nosaukums un atzÄ«me.
AttÄls ir izveidots saskaÅÄ ar instrukcijÄm no Dockerfile. Katrs Dockerfile norÄdÄ«jums izveido jaunu slÄni. SlÄÅus var izmantot atkÄrtoti.
Docker reÄ£istrs ir Docker attÄlu repozitorijs. LÄ«dzÄ«gi kÄ OS, arÄ« Docker ir publisks standarta reÄ£istrs - dockerhub. Bet jÅ«s varat izveidot savu repozitoriju, savu Docker reÄ£istru.
Konteiners - kas tiek palaists no attÄla. MÄs izveidojÄm attÄlu saskaÅÄ ar instrukcijÄm no Dockerfile, pÄc tam palaižam to no Ŕī attÄla. Å is konteiners ir izolÄts no citiem konteineriem, un tajÄ ir jÄbÅ«t visam, kas nepiecieÅ”ams lietojumprogrammas darbÄ«bai. Å ajÄ gadÄ«jumÄ viens konteiners - viens process. GadÄs, ka ir jÄveic divi procesi, taÄu tas ir zinÄmÄ mÄrÄ pretrunÄ ar Docker ideoloÄ£iju.
PrasÄ«ba "viens konteiners, viens process" ir saistÄ«ta ar PID nosaukumvietu. Kad nosaukumvietÄ tiek sÄkts process ar PID 1, ja tas pÄkÅ”Åi nomirst, mirst arÄ« viss konteiners. Ja tur darbojas divi procesi: viens ir dzÄ«vs un otrs ir miris, tad konteiners joprojÄm turpinÄs dzÄ«vot. Bet tas ir paraugprakses jautÄjums, par to mÄs runÄsim citos materiÄlos.
Lai sÄ«kÄk izpÄtÄ«tu kursa iespÄjas un pilnu programmu, lÅ«dzu, sekojiet saitei: ā
Autors: Marcel Ibraev, sertificÄts Kubernetes administrators, Southbridge praktizÄjoÅ”ais inženieris, runÄtÄjs un Slurm kursu izstrÄdÄtÄjs.
Avots: www.habr.com