Docker është një lodër apo jo? Apo është ende e vërtetë?

Përshëndetje të gjithëve!

Unë me të vërtetë dua të shkoj direkt në temë, por do të ishte më e saktë të tregoja pak për historinë time:

Hyrje

Unë jam një programues me përvojë në zhvillimin e aplikacioneve me një faqe frontend, scala/java dhe nodejs në server.

Për një kohë mjaft të gjatë (padyshim nja dy ose tre vjet), isha i mendimit se Docker është mana nga parajsa dhe në përgjithësi një mjet shumë i lezetshëm dhe absolutisht çdo zhvillues duhet të jetë në gjendje ta përdorë atë. Dhe nga kjo rrjedh se çdo zhvillues duhet të ketë të instaluar Docker në makinën e tij lokale. Po mendimi im, shikoni vendet e lira të punës që janë postuar në të njëjtën hh. Çdo i dyti përmban një përmendje të docker, dhe nëse e zotëroni atë, ky do të jetë avantazhi juaj konkurrues 😉

Gjatë rrugës, takova shumë njerëz, me qëndrimet e tyre të ndryshme ndaj Docker dhe ekosistemit të tij. Disa thanë se kjo është një gjë e përshtatshme që garanton funksionalitet ndër-platformë. Të dytët nuk e kuptuan pse duhet të vrapojnë në kontejnerë dhe çfarë fitimi do të vinte prej tij, të tretët nuk u interesuan fare dhe nuk u mërzitën (thjesht shkruan kodin dhe shkuan në shtëpi - i kam zili, nga mënyrë :)

Arsyet e përdorimit

Pse përdora docker? Ndoshta për arsyet e mëposhtme:

  • nisja e bazës së të dhënave, 99% e aplikacioneve i përdorin ato
  • nisja e nginx për shpërndarjen e frontendit dhe proxying në backend
  • ju mund ta paketoni aplikacionin në një imazh docker, në këtë mënyrë aplikacioni im do të funksionojë kudo ku ekziston docker, problemi i shpërndarjes zgjidhet menjëherë
  • zbulimi i shërbimit jashtë kutisë, ju mund të krijoni mikroshërbime, çdo kontejner (i lidhur me një rrjet të përbashkët) mund të arrijë lehtësisht një tjetër nëpërmjet një pseudonimi, shumë i përshtatshëm
  • Është kënaqësi të krijosh një enë dhe të "luash" në të.

Ajo që nuk më pëlqen gjithmonë te docker:

  • Në mënyrë që aplikacioni im të funksionojë, më duhet vetë Docker në server. Pse më duhet kjo nëse aplikacionet e mia funksionojnë në jre ose nodejs dhe mjedisi për to është tashmë në server?
  • nëse dua të ekzekutoj imazhin tim (privat) të ndërtuar lokalisht në një server të largët, atëherë më duhet depoja ime docker, më duhet regjistri që të funksionojë diku dhe gjithashtu duhet të konfiguroj https, sepse docker cli funksionon vetëm mbi https. Oh dreqin... ka opsione, sigurisht, për të ruajtur imazhin lokalisht nëpërmjet docker save dhe thjesht dërgo imazhin nëpërmjet scp... Por këto janë shumë lëvizje të trupit. Dhe përveç kësaj, duket si një zgjidhje "patericë" derisa të shfaqet depoja juaj
  • docker-compose. Është e nevojshme vetëm për të drejtuar kontejnerët. Kjo eshte e gjitha. Ai nuk mund të bëjë asgjë tjetër. Docker-compose ka një mori versionesh të skedarëve të tij, sintaksën e vet. Sado deklarative të jetë, nuk dua të lexoj dokumentacionin e tyre. Nuk do të më duhet askund tjetër.
  • kur punojnë në një ekip, shumica e njerëzve shkruajnë një Dockerfile shumë shtrembër, nuk e kuptojnë se si ruhet në cache, shtojnë gjithçka që u nevojitet dhe nuk u nevojitet imazhit, trashëgojnë nga imazhe që nuk janë në Dockerhub ose në një depo private, krijojnë disa docker-compose skedarë me baza të dhënash dhe asgjë nuk vazhdon. Në të njëjtën kohë, zhvilluesit deklarojnë me krenari se Docker është i lezetshëm, gjithçka funksionon në nivel lokal për ta, dhe HR më e rëndësishmja shkruan në konkursin: "Ne përdorim Docker dhe kemi nevojë për një kandidat me përvojë të tillë pune."
  • Unë jam vazhdimisht i përhumbur nga mendimet për ngritjen e gjithçkaje në Docker: postgresql, kafka, redis. Është për të ardhur keq që jo gjithçka funksionon në kontejnerë, jo gjithçka është e lehtë për t'u konfiguruar dhe ekzekutuar. Kjo mbështetet nga zhvilluesit e palëve të treta, dhe jo nga vetë shitësit. Dhe nga rruga, lind pyetja menjëherë: shitësit nuk shqetësohen për mirëmbajtjen e produkteve të tyre në Docker, pse është kjo, mbase ata dinë diçka?
  • Gjithmonë lind pyetja për qëndrueshmërinë e të dhënave të kontejnerëve. dhe pastaj ju mendoni, a duhet thjesht të montoj direktoriumin pritës ose të krijoj një vëllim docker ose të bëj një kontejner të dhënash që është tani deprecated? Nëse montoj një direktori, atëherë duhet të sigurohem që uid dhe gid i përdoruesit në kontejner përputhen me ID-në e përdoruesit që ka nisur kontejnerin, përndryshe skedarët e krijuar nga kontejneri do të krijohen me të drejta rrënjësore. Nëse përdor volume atëherë të dhënat thjesht do të krijohen në disa /usr/* dhe do të ketë të njëjtën histori me uid dhe gid si në rastin e parë. Nëse po lëshoni një komponent të palës së tretë, duhet të lexoni dokumentacionin dhe të kërkoni përgjigjen e pyetjes: "në cilat direktori kontejnerësh shkruan skedarët përbërësi?"

Gjithmonë nuk më ka pëlqyer fakti që më është dashur të ndërhyj me Docker për një kohë të gjatë në fazën fillestare: Kuptova se si të lëshoja kontejnerë, nga cilat imazhe të lëshoja, bëra MakeFiles që përmbanin pseudonime për komandat e gjata të Docker. E urreja docker-compose sepse nuk doja të mësoja një mjet tjetër në ekosistemin docker. DHE docker-compose up Më shqetësonte, veçanërisht nëse ata ende takoheshin atje build ndërtime, në vend të imazheve të montuara tashmë. Gjithçka që doja vërtet ishte të bëja një produkt me efikasitet dhe shpejt. Por nuk mund të kuptoja se si të përdor docker.

Prezantimi i Ansible

Kohët e fundit (tre muaj më parë), kam punuar me një ekip DevOps, pothuajse çdo anëtar i të cilit kishte një qëndrim negativ ndaj Docker. Për arsye:

  • docker rregullat iptables (megjithëse mund ta çaktivizoni në daemon.json)
  • docker është me kaloi dhe ne nuk do ta përdorim atë në prodhim
  • nëse docker daemon rrëzohet, atëherë të gjithë kontejnerët me infrastrukturë rrëzohen në përputhje me rrethanat
  • nuk ka nevoje per doker
  • Pse docker nëse ka makina Ansible dhe virtuale

Në të njëjtën punë, u njoha me një mjet tjetër - Ansible. Kam dëgjuar për të një herë, por nuk u përpoqa të shkruaj librat e mi. Dhe tani fillova të shkruaj detyrat e mia dhe më pas vizioni im ndryshoi plotësisht! Sepse kuptova: Ansible ka module për drejtimin e të njëjtave kontejnerë docker, ndërtime imazhesh, rrjete, etj., dhe kontejnerët mund të ekzekutohen jo vetëm në nivel lokal, por edhe në serverë të largët! Kënaqësia ime nuk njihte kufij - gjeta një mjet NORMAL dhe i hodha skedarët e mi Makefile dhe docker-compose, ato u zëvendësuan me detyra yaml. Kodi u reduktua duke përdorur konstruksione si loop, when, Etj

Docker për ekzekutimin e komponentëve të palëve të treta si bazat e të dhënave

Kohët e fundit u njoha me tunelet ssh. Doli se është shumë e lehtë të "përcjellësh" portin e një serveri të largët në një port lokal. Serveri në distancë mund të jetë ose një makinë në cloud ose një makinë virtuale që funksionon në VirtualBox. Nëse kolegu im ose unë kemi nevojë për një bazë të dhënash (ose ndonjë komponent tjetër të palës së tretë), ne thjesht mund ta nisim serverin me këtë komponent dhe ta fikim kur serveri nuk është i nevojshëm. Përcjellja e portit jep të njëjtin efekt si një bazë të dhënash që funksionon në një kontejner docker.

Kjo komandë e përcjell portin tim lokal në një server të largët që funksionon postgresql:

ssh -L 9000:localhost:5432 [email mbrojtur]

Përdorimi i një serveri në distancë zgjidh problemin me zhvillimin e ekipit. Një server i tillë mund të përdoret nga disa zhvillues menjëherë; ata nuk kanë nevojë të jenë në gjendje të konfigurojnë postgresql, të kuptojnë Docker dhe ndërlikimet e tjera. Në një server në distancë, mund të instaloni të njëjtën bazë të dhënash në vetë Docker, nëse është e vështirë të instaloni një version specifik. Gjithçka që u nevojitet zhvilluesve është të sigurojnë akses ssh!

Kohët e fundit kam lexuar se tunelet SSH janë një funksionalitet i kufizuar i një VPN të rregullt! Ju thjesht mund të instaloni OpenVPN ose zbatime të tjera VPN, të konfiguroni infrastrukturën dhe t'ia jepni për përdorim zhvilluesve. Kjo është kaq e lezetshme!

Për fat të mirë, AWS, GoogleCloud dhe të tjerët ju japin një vit përdorim falas, prandaj përdorni ato! Ata janë të lirë nëse i fikni kur nuk janë në përdorim. Gjithmonë pyesja veten pse do të më duhej një server në distancë si gcloud, duket se i gjeta.

Si një makinë virtuale lokale, mund të përdorni të njëjtën Alpine, e cila përdoret në mënyrë aktive në kontejnerët docker. Epo, ose disa shpërndarje të tjera të lehta për ta bërë makinën të niset më shpejt.

Përfundimi: ju mund dhe duhet të ekzekutoni bazat e të dhënave dhe pajisje të tjera të infrastrukturës në serverë të largët ose në kuti virtuale. Nuk kam nevojë për doker për këto qëllime.

Pak për imazhet dhe shpërndarjen e dokerit

Unë tashmë kam shkruar një artikull në të cilën desha të përcjell se përdorimi i imazheve të dokerit nuk ofron asnjë garanci. Imazhet e dokerit nevojiten vetëm për të krijuar një kontejner doker. Nëse po përmirësoni në një imazh docker, atëherë po përmirësoni për të përdorur kontejnerët docker dhe do t'i përdorni vetëm ato.

A keni parë diku ku zhvilluesit e programeve kompjuterike i portojnë produktet e tyre vetëm në një imazh docker?
Rezultati i shumicës së produkteve janë skedarë binare për një platformë specifike; ato thjesht shtohen në imazhin e dokerit, i cili trashëgohet nga platforma e dëshiruar. A keni menduar ndonjëherë pse ka kaq shumë imazhe të ngjashme në dockerhub? Futni nginx për shembull, do të shihni 100500 imazhe nga njerëz të ndryshëm. Këta njerëz nuk e zhvilluan vetë nginx, ata thjesht shtuan nginx zyrtar në imazhin e tyre të dokerit dhe e kaluan atë me konfigurimet e tyre për lehtësinë e lëshimit të kontejnerëve.

Në përgjithësi, thjesht mund ta ruani në tgz, nëse dikush duhet ta ekzekutojë në docker, atëherë le ta shtojë tgz në Dockerfile, të trashëgojë nga mjedisi i dëshiruar dhe të krijojë buns shtesë që nuk e ndryshojnë vetë aplikacionin në tgz. Kushdo që do të krijojë një imazh docker do të dijë se çfarë është tgz dhe çfarë i duhet për të punuar. Kështu e përdor docker-in këtu

Përfundimi: Nuk kam nevojë për regjistër docker, do të përdor një lloj S3 ose thjesht ruajtje të skedarëve si google drive/dropbox

Docker në CI

Të gjitha kompanitë për të cilat kam punuar janë të ngjashme. Zakonisht janë ushqimore. Kjo do të thotë, ata kanë një aplikacion, një grumbull teknologjie (epo, ndoshta disa ose tre gjuhë programimi).

Këto kompani përdorin docker në serverët e tyre ku funksionon procesi CI. Pyetje: Pse keni nevojë të ndërtoni projekte në një kontejner docker në serverët tuaj? Pse të mos përgatitni thjesht një mjedis për ndërtimin, për shembull, të shkruani një libër lojërash Ansible që do të instalojë versionet e nevojshme të nodejs, php, jdk, kopjoni çelësat ssh, etj. në serverin në të cilin do të bëhet ndërtimi?

Tani e kuptova që ky po qëlloj veten në këmbë, sepse dokeri nuk sjell asnjë fitim me izolimin e tij. Problemet që kam hasur me CI në docker:

  • përsëri ju duhet një imazh docker për të ndërtuar. ju duhet të kërkoni një imazh ose të shkruani skedarin tuaj docker.
  • 90% që ju nevojiten për të përcjellë disa çelësa ssh, të dhëna sekrete që nuk dëshironi t'i shkruani në imazhin e dokerit.
  • kontejneri krijohet dhe vdes, të gjitha cache-të humbasin së bashku me të. ndërtimi tjetër do të rishkarkojë të gjitha varësitë e projektit, gjë që kërkon kohë dhe joefektive, dhe koha është para.

Zhvilluesit nuk ndërtojnë projekte në kontejnerë docker (dikur isha një tifoz i tillë, me të vërtetë, më vjen keq për veten në të kaluarën xD). Në java është e mundur të keni disa versione dhe t'i ndryshoni ato me një komandë në atë që ju nevojitet tani. Është e njëjta gjë në nodejs, ka nvm.

Prodhim

Unë besoj se docker është një mjet shumë i fuqishëm dhe fleksibël, ky është pengesa e tij (tingëllon e çuditshme, po). Me ndihmën e tij, kompanitë mund të lidhen lehtësisht me të dhe ta përdorin atë ku është e nevojshme dhe jo e nevojshme. Zhvilluesit lëshojnë kontejnerët e tyre, disa nga mjediset e tyre, pastaj të gjitha rrjedhin pa probleme në CI dhe prodhim. Ekipi i DevOps po shkruan një lloj kodi për të drejtuar këto kontejnerë.

Përdorni docker vetëm në më i fundit fazë në rrjedhën tuaj të punës, mos e tërhiqni atë në projekt në fillim. Nuk do t'i zgjidhë problemet e biznesit tuaj. Ai vetëm do t'i zhvendosë problemet në TJETËR nivel dhe do të ofrojë zgjidhjet e veta, ju do të bëni punë të dyfishtë.

Kur nevojitet docker: Arrita në përfundimin se docker është shumë i mirë në optimizimin e një procesi të caktuar, por jo në ndërtimin e funksionalitetit bazë

Nëse ende vendosni të përdorni docker, atëherë:

  • jini jashtëzakonisht të kujdesshëm
  • mos i detyroni zhvilluesit të përdorin docker
  • lokalizoni përdorimin e tij në një vend, mos e shpërndani në të gjitha depot e Dockfile dhe docker-compose

PS:

Faleminderit që lexuat, ju uroj vendime transparente në punët tuaja dhe ditë produktive pune!

Burimi: www.habr.com

Shto një koment