Er Docker leikfang eða ekki? Eða er það enn satt?

Halló allir!

Mig langar virkilega að fara beint að efninu en það væri réttara að segja aðeins frá sögu minni:

Færslu

Ég er forritari með reynslu í að þróa einhliða framendaforrit, scala/java og nodejs á þjóninum.

Í nokkuð langan tíma (örugglega nokkur eða þrjú ár) var ég þeirrar skoðunar að Docker væri manna af himnum og almennt mjög flott tól og algjörlega allir forritarar ættu að geta notað það. Og af þessu leiðir að sérhver þróunaraðili ætti að hafa Docker uppsett á staðbundinni vél sinni. Hvað með mína skoðun, skoðaðu laus störf sem eru sett á sama hh. Í annarri hverri er minnst á docker, og ef þú átt það, þá verður þetta samkeppnisforskot þitt 😉

Á leið minni hitti ég margt fólk með mismunandi viðhorf til Docker og vistkerfis þess. Sumir sögðu að þetta væri þægilegur hlutur sem tryggir virkni á vettvangi. Þeir aðrir skildu ekki af hverju þeir ættu að keyra í gámum og hvaða gróði myndi koma af því, sá þriðji var alveg sama og nennti því ekki (þeir skrifuðu bara kóðann og fóru heim - ég öfunda þá, með því að hátt :)

Ástæður fyrir notkun

Af hverju notaði ég docker? Líklega af eftirfarandi ástæðum:

  • gagnagrunnsræsting, 99% forrita nota þau
  • ræsir nginx fyrir framendadreifingu og umboð til bakenda
  • þú getur pakkað forritinu í docker mynd, þannig mun forritið mitt virka hvar sem docker er til, dreifingarvandamálið er leyst strax
  • þjónustuuppgötvun beint úr kassanum, þú getur búið til örþjónustur, hver ílát (tengdur sameiginlegu neti) getur auðveldlega náð til annars í gegnum samnefni, mjög þægilegt
  • Það er gaman að búa til ílát og „leika“ í honum.

Það sem mér líkar alltaf ekki við docker:

  • Til þess að forritið mitt virki þarf ég Docker sjálfan á þjóninum. Af hverju þarf ég þetta ef forritin mín keyra á jre eða nodejs og umhverfið fyrir þau er þegar á þjóninum?
  • ef ég vil keyra (einka) heimabyggða myndina mína á fjarþjóni, þá þarf ég mitt eigið docker repository, ég þarf að skrásetja virki einhvers staðar og ég þarf líka að stilla https, því docker cli virkar bara yfir https. Ó fjandinn... það eru auðvitað möguleikar til að vista myndina á staðnum í gegnum docker save og sendu bara myndina í gegnum scp... En þetta eru margar líkamshreyfingar. Og að auki lítur það út eins og „hækja“ lausn þar til þín eigin geymsla birtist
  • docker-compose. Það þarf aðeins til að keyra gáma. Það er allt og sumt. Hann getur ekki annað. Docker-compose hefur fullt af útgáfum af skrám sínum, eigin setningafræði. Sama hversu yfirlýsandi það er, ég vil ekki lesa skjölin þeirra. Ég mun ekki þurfa þess annars staðar.
  • þegar þeir vinna í teymi skrifa flestir Dockerfile mjög skakkt, skilja ekki hvernig hún er í skyndiminni, bæta öllu sem þeir þurfa og þurfa ekki við myndina, erfa myndir sem eru ekki í Dockerhub eða einkageymslu, búa til nokkrar docker-compose skrár með gagnagrunnum og ekkert er viðvarandi. Á sama tíma lýsa hönnuðirnir því stoltir yfir að Docker sé flottur, allt virkar á staðnum fyrir þá og HR skrifar mikilvægt í starfinu: „Við notum Docker og við þurfum umsækjanda með slíka starfsreynslu.
  • Ég er stöðugt reimt af hugsunum um að hækka allt í Docker: postgresql, kafka, redis. Það er synd að ekki virkar allt í gámum, ekki er allt auðvelt að stilla og keyra. Þetta er stutt af þriðja aðila verktaki, en ekki af söluaðilum sjálfum. Og við the vegur, spurningin vaknar strax: söluaðilar hafa ekki áhyggjur af því að viðhalda vörum sínum í Docker, hvers vegna er þetta, kannski vita þeir eitthvað?
  • Spurningin vaknar alltaf um þrálátleika gámagagna. og þá hugsarðu, ætti ég bara að tengja hýsingarskrána eða búa til docker bindi eða búa til gagnaílát sem er núna deprecated? Ef ég festi möppu, þá þarf ég að ganga úr skugga um að uid og gid notandans í gámnum passi við id notandans sem setti ílátið af stað, annars verða skrárnar búnar til með rótarréttinum. Ef ég nota volume þá verða gögnin einfaldlega til í sumum /usr/* ok mun sama sagan vera með uid og gid sem í fyrra tilvikinu. Ef þú ert að ræsa íhlut frá þriðja aðila þarftu að lesa skjölin og leita að svarinu við spurningunni: "í hvaða gámaskrám skrifar íhluturinn skrár?"

Mér líkaði alltaf ekki við að ég þyrfti að fikta við Docker of lengi á upphafsstigi: Ég fann út hvernig á að ræsa gáma, hvaða myndir á að ræsa úr, gerði Makefiles sem innihéldu samnefni við langar Docker skipanir. Ég hataði docker-compose vegna þess að ég vildi ekki læra annað verkfæri í docker vistkerfinu. OG docker-compose up Það truflaði mig, sérstaklega ef þau hittust enn þar build byggingar, frekar en þegar samsettar myndir. Allt sem mig langaði í raun var að búa til vöru á skilvirkan og fljótlegan hátt. En ég gat ekki fundið út hvernig á að nota docker.

Við kynnum Ansible

Nýlega (fyrir þremur mánuðum) vann ég með DevOps teymi, þar sem næstum allir meðlimir höfðu neikvætt viðhorf til Docker. Af ástæðum:

  • docker reglur iptables (þó að þú getir slökkt á því í daemon.json)
  • docker er gallaður og við munum ekki keyra hann í framleiðslu
  • ef docker púkinn hrynur, þá hrynja allir gámar með innviði í samræmi við það
  • engin þörf fyrir bryggjumann
  • hvers vegna docker ef það er Ansible og sýndarvélar

Í sama starfi kynntist ég öðru tæki - Ansible. Ég heyrði um það einu sinni, en ég reyndi ekki að skrifa mínar eigin leikbækur. Og nú fór ég að skrifa verkefnin mín og þá gjörbreyttist sýn mín! Vegna þess að ég áttaði mig á: Ansible er með einingar til að keyra sömu bryggjugáma, myndasmíði, netkerfi o.s.frv., og gáma er ekki aðeins hægt að keyra á staðnum heldur einnig á ytri netþjónum! Ánægja mín átti sér engin takmörk - ég fann venjulegt tól og henti Makefile og docker-compose skránum mínum, þeim var skipt út fyrir yaml verkefni. Kóðinn var minnkaður með því að nota smíðar eins og loop, whenO.fl.

Docker til að keyra íhluti þriðja aðila eins og gagnagrunna

Ég kynntist nýlega ssh göngum. Það kom í ljós að það er mjög auðvelt að „framsenda“ höfn ytra netþjóns yfir á staðbundna höfn. Fjarþjónninn getur annað hvort verið vél í skýinu eða sýndarvél sem keyrir í VirtualBox. Ef ég eða kollegi minn þurfum gagnagrunn (eða einhvern annan þriðja aðila íhlut) getum við einfaldlega ræst þjóninn með þessum íhlut og slökkt á honum þegar ekki er þörf á þjóninum. Framsending hafna gefur sömu áhrif og gagnagrunnur sem keyrir í hafnargámi.

Þessi skipun sendir staðbundna höfnina mína á ytri netþjón sem keyrir postgresql:

ssh -L 9000:localhost:5432 [netvarið]

Notkun ytri netþjóns leysir vandamálið með þróun liðsins. Slíkur netþjónn getur verið notaður af nokkrum forriturum í einu; þeir þurfa ekki að geta stillt postgresql, skilið Docker og aðrar ranghala. Á ytri netþjóni geturðu sett upp sama gagnagrunn í Docker sjálfum, ef erfitt er að setja upp ákveðna útgáfu. Allt sem forritarar þurfa er að veita ssh aðgang!

Ég las nýlega að SSH göng eru takmörkuð virkni venjulegs VPN! Þú getur einfaldlega sett upp OpenVPN eða aðrar VPN útfærslur, sett upp innviðina og gefið forriturum til notkunar. Þetta er svo flott!

Sem betur fer gefa AWS, GoogleCloud og fleiri þér árs ókeypis notkun, svo notaðu þau! Þeir eru ódýrir ef þú slekkur á þeim þegar þeir eru ekki í notkun. Ég velti því alltaf fyrir mér hvers vegna ég þyrfti ytri netþjón eins og gcloud, það virðist sem ég hafi fundið þá.

Sem staðbundin sýndarvél geturðu notað sömu Alpine, sem er virkur notaður í hafnargámum. Jæja, eða einhver önnur léttur dreifing til að gera vélina hraðari að ræsa sig.

Niðurstaða: þú getur og ættir að keyra gagnagrunna og annað góðgæti fyrir innviði á ytri netþjónum eða í sýndarboxi. Ég þarf ekki Docker í þessum tilgangi.

Smá um docker myndir og dreifingu

Ég hef þegar skrifað grein þar sem ég vildi koma því á framfæri að notkun docker-mynda veitir enga tryggingu. Docker myndir eru aðeins nauðsynlegar til að búa til docker ílát. Ef þú ert að uppfæra í docker mynd, þá ertu að uppfæra til að nota docker gáma og þú munt aðeins nota þá.

Hefur þú séð einhvers staðar þar sem hugbúnaðarframleiðendur flytja vörur sínar aðeins í bryggjumynd?
Niðurstaðan af flestum vörum er tvöfaldur skrár fyrir tiltekinn vettvang; þeim er einfaldlega bætt við docker myndina, sem er erft frá viðkomandi vettvang. Hefur þú einhvern tíma velt því fyrir þér hvers vegna það eru svona margar svipaðar myndir á dockerhub? Sláðu inn nginx til dæmis, þú munt sjá 100500 myndir frá mismunandi fólki. Þetta fólk þróaði ekki nginx sjálft, það bætti einfaldlega opinberu nginx við docker-mynd sína og kryddaði það með sínum eigin stillingum til að auðvelda ræsingu gáma.

Almennt séð geturðu einfaldlega geymt það í tgz, ef einhver þarf að keyra það í docker, þá láttu þá bæta tgz við Dockerfile, erfa það frá viðkomandi umhverfi og búa til viðbótarbollur sem breyta ekki forritinu sjálfu í tgz. Allir sem búa til docker mynd munu vita hvað tgz er og hvað hann þarf til að vinna. Svona nota ég docker hér

Niðurstaða: Ég þarf ekki docker registry, ég mun nota einhvers konar S3 eða bara skráageymslu eins og google drive/dropbox

Hafnarmaður í CI

Öll fyrirtækin sem ég hef unnið hjá eru svipuð. Þeir eru venjulega matvöruverslun. Það er, þeir eru með eitt forrit, einn tæknistafla (tja, kannski nokkur eða þrjú forritunarmál).

Þessi fyrirtæki nota docker á netþjónum sínum þar sem CI ferlið keyrir. Spurning: Af hverju þarftu að byggja verkefni í bryggjugámi á netþjónunum þínum? Af hverju ekki bara að undirbúa umhverfi fyrir bygginguna, til dæmis að skrifa Ansible leikbók sem mun setja upp nauðsynlegar útgáfur af nodejs, php, jdk, afrita ssh lykla o.s.frv. á netþjóninn sem byggingin mun fara fram á?

Nú skilst mér að þetta sé að skjóta mig í fótinn því docker skilar engum gróða með sinni einangrun. Vandamál sem ég lenti í með CI í docker:

  • aftur þarftu docker mynd til að byggja. þú þarft að leita að mynd eða skrifa þína eigin dockerfile.
  • 90% að þú þurfir að framsenda nokkra ssh lykla, leynileg gögn sem þú vilt ekki skrifa á bryggjumyndina.
  • gámurinn er búinn til og deyr, öll skyndiminni glatast með honum. næsta smíði mun hlaða niður öllum ósjálfstæðum verkefnisins aftur, sem er tímafrekt og árangurslaust, og tími er peningar.

Hönnuðir byggja ekki verkefni í hafnargámum (ég var einu sinni svo mikill aðdáandi, ég vorkenni sjálfum mér í fortíðinni xD). Í java er hægt að hafa nokkrar útgáfur og breyta þeim með einni skipun í þá sem þú þarft núna. Það er eins í nodejs, það er nvm.

Output

Ég tel að docker sé mjög öflugt og sveigjanlegt tæki, þetta er galli þess (hljómar undarlega, já). Með hjálp þess geta fyrirtæki auðveldlega fest sig í sessi og notað hann þar sem þörf er á og ekki þörf. Hönnuðir hleypa gámunum sínum af stokkunum, sumum umhverfi sínu, þá rennur þetta allt vel inn í CI og framleiðslu. DevOps teymið er að skrifa einhvers konar kóða til að keyra þessa gáma.

Notaðu docker aðeins á það nýjasta stigi í verkflæðinu þínu, ekki draga það inn í verkefnið í upphafi. Það mun ekki leysa viðskiptavandamál þín. Hann mun aðeins færa vandamálin á ANNAÐ stig og bjóða upp á sínar eigin lausnir, þú munt vinna tvöfalt.

Þegar þörf er á docker: Ég komst að þeirri niðurstöðu að docker er mjög góður í að fínstilla tiltekið ferli, en ekki í að byggja upp grunnvirkni

Ef þú ákveður samt að nota docker, þá:

  • fara mjög varlega
  • ekki neyða forritara til að nota docker
  • staðsetja notkun þess á einum stað, ekki dreifa því yfir allar Dockefile og docker-compose geymslur

PS:

  • Ég rakst nýlega á pakki og þeir segja að það virki mjög vel með Ansible og gerir þér kleift að sameina ferlið við að búa til myndir (þar á meðal docker mynd)
  • líka um docker, áhugaverð grein

Þakka þér fyrir að lesa, ég óska ​​þér gagnsærra ákvarðana í málum þínum og gefandi vinnudögum!

Heimild: www.habr.com

Bæta við athugasemd