Is Docker in boartersguod of net? Of is it noch wier?

Hello everyone!

Ik wol echt direkt nei it ûnderwerp komme, mar it soe krekter wêze om in bytsje oer myn ferhaal te fertellen:

Ynlieding

Ik bin in programmeur mei ûnderfining yn it ûntwikkeljen fan frontend single-side applikaasjes, scala / java en nodejs op de tsjinner.

Foar in hiel lange tiid (definityf in pear of trije jier), wie ik fan betinken dat Docker manna út 'e himel is en yn't algemien in heul cool ark en absolút elke ûntwikkelder soe it kinne kinne brûke. En hjirút folget dat elke ûntwikkelder Docker moat ynstalleare op har lokale masine. Wat oer myn miening, sjoch troch de fakatueres dy't wurde pleatst op deselde hh. Elke twadde befettet in fermelding fan docker, en as jo it hawwe, sil dit jo konkurrinsjefoardiel wêze 😉

Underweis moete ik in protte minsken, mei har ferskillende hâlding foar Docker en har ekosysteem. Guon seine dat dit in handich ding is dat funksjonaliteit fan cross-platform garandearret. De twadden begrepen net wêrom't se yn konteners rinne moasten en hokker winst der fan komme soe, de tredde hie der neat oan en makke der neat oan (se skreaunen gewoan de koade en gongen nei hûs - ik benij se, troch de manier :)

Redenen foar gebrûk

Wêrom haw ik docker brûkt? Wierskynlik om de folgjende redenen:

  • database lansearring, 99% fan applikaasjes brûke se
  • nginx lansearje foar frontend-distribúsje en proxying nei backend
  • jo kinne de applikaasje yn in dockerôfbylding ferpakke, op dizze manier sil myn applikaasje wurkje wêr't docker ek bestiet, it distribúsjeprobleem wurdt fuortendaliks oplost
  • tsjinst ûntdekking út 'e doaze, jo kinne mikrotsjinsten oanmeitsje, elke kontener (ferbûn mei in mienskiplik netwurk) kin in oare maklik berikke fia in alias, heul handich
  • It is leuk om in kontener te meitsjen en dêryn "spielje".

Wat ik altyd net leuk fyn oan docker:

  • Om myn applikaasje te wurkjen, haw ik Docker sels op 'e server nedich. Wêrom haw ik dit nedich as myn applikaasjes rinne op jre of nodejs en de omjouwing foar harren is al op de tsjinner?
  • as ik myn (privee) lokaal boude ôfbylding op in tsjinner op ôfstân útfiere wol, dan haw ik myn eigen docker-repository nedich, ik haw it register nedich om earne te wurkjen en ik moat ek https konfigurearje, om't docker cli allinich oer https wurket. Oh damn ... der binne opsjes, fansels, te bewarjen de ôfbylding lokaal fia docker save en stjoer de ôfbylding gewoan fia scp ... Mar dat is in protte lichemsbewegingen. En boppedat liket it op in "kruk" -oplossing oant jo eigen repository ferskynt
  • docker-compose. It is allinich nedich om konteners te rinnen. Da's alles. Hy kin neat oars. Docker-compose hat in boskje ferzjes fan syn bestannen, syn eigen syntaksis. Hoe deklaratyf it ek is, ik wol har dokumintaasje net lêze. Ik sil it nearne oars nedich hawwe.
  • as se wurkje yn in team, skriuwe de measte minsken in Dockerfile heul krom, begripe net hoe't it yn 'e cache is, foegje alles ta wat se nedich binne en net nedich binne oan' e ôfbylding, erfje fan ôfbyldings dy't net yn Dockerhub of in privee repository binne, meitsje wat docker-compose bestannen mei databases en neat bliuwt. Tagelyk ferklearje de ûntwikkelders grutsk dat Docker cool is, alles wurket lokaal foar har, en HR skriuwt wichtich yn 'e fakatuere: "Wy brûke Docker en wy hawwe in kandidaat nedich mei sa'n wurkûnderfining."
  • Ik bin hieltyd achterfolge troch gedachten oer it ferheegjen fan alles yn Docker: postgresql, kafka, redis. It is spitich dat net alles wurket yn konteners, net alles is maklik te konfigurearjen en út te fieren. Dit wurdt stipe troch ûntwikkelders fan tredden, en net troch de leveransiers sels. En trouwens, de fraach ûntstiet fuortendaliks: leveransiers meitsje har gjin soargen oer it behâld fan har produkten yn Docker, wêrom is dit, miskien witte se wat?
  • De fraach ûntstiet altyd oer de persistinsje fan kontenergegevens. en dan tinke jo, moat ik gewoan de hostmap montearje of in docker-folume meitsje of in gegevenskontener meitsje dy't no is deprecated? As ik in map montearje, dan moat ik derfoar soargje dat de uid en gid fan 'e brûker yn' e kontener oerienkomme mei de id fan 'e brûker dy't de kontener lansearre, oars wurde de bestannen makke troch de kontener makke mei rootrjochten. As ik brûk volume dan wurde de gegevens gewoan yn guon oanmakke /usr/* en der sil itselde ferhaal wêze mei uid en gid as yn it earste gefal. As jo ​​​​in komponint fan tredden lansearje, moatte jo de dokumintaasje lêze en sykje nei it antwurd op 'e fraach: "yn hokker kontenermappen skriuwt de komponint bestannen?"

Ik fûn it altyd net leuk dat ik te lang mei Docker moast tinken yn de earste faze: Ik fûn út hoe't jo konteners starte, hokker ôfbyldings om te starten, makke Makefiles dy't aliassen befette foar lange Docker-kommando's. Ik haatte docker-compose, om't ik gjin oar ark leare woe yn it docker-ekosysteem. EN docker-compose up It muoit my, benammen as se dêr noch moete build konstruksjes, ynstee fan al gearstalde bylden. Alles wat ik wirklik woe wie gewoan in produkt effisjint en fluch meitsje. Mar ik koe net útfine hoe't jo docker brûke.

Yntroduksje fan Ansible

Koartlyn (trije moanne lyn) wurke ik mei in DevOps-team, wêrfan hast elk lid in negative hâlding foar Docker hie. Om redenen:

  • docker regels iptables (hoewol jo it kinne útskeakelje yn daemon.json)
  • docker is buggy en wy sille it net yn produksje útfiere
  • as docker-daemon crasht, dan crashe alle konteners mei ynfrastruktuer neffens
  • gjin ferlet fan docker
  • wêrom docker as der Ansible en firtuele masines

By deselde baan kaam ik yn 'e kunde mei in oar ark - Ansible. Ik hearde der ris oer, mar ik besocht net myn eigen toanielstikken te skriuwen. En no begon ik myn taken te skriuwen en doe feroare myn fisy folslein! Om't ik realisearre: Ansible hat modules foar it útfieren fan deselde docker-konteners, image builds, netwurken, ensfh., En konteners kinne net allinich lokaal útfierd wurde, mar ek op tsjinners op ôfstân! Myn wille wist gjin grinzen - ik fûn in NORMAAL ark en smiet myn Makefile en docker-compose-bestannen fuort, se waarden ferfongen troch yaml-taken. De koade waard fermindere troch gebrûk fan konstruksjes lykas loop, when, Etc.

Docker foar it útfieren fan komponinten fan tredden lykas databases

Ik kaam koartlyn yn 'e kunde mei ssh-tunnels. It die bliken dat it heul maklik is om de poarte fan in tsjinner op ôfstân te "foarstjoere" nei in lokale poarte. De tsjinner op ôfstân kin in masine yn 'e wolk wêze as in firtuele masine dy't rint yn VirtualBox. As myn kollega of ik in databank nedich hawwe (of in oar komponint fan tredden), kinne wy ​​de tsjinner gewoan mei dizze komponint begjinne en it útsette as de tsjinner net nedich is. Port forwarding jout itselde effekt as in databank dy't rint yn in docker container.

Dit kommando stjoert myn lokale poarte troch nei in server op ôfstân dy't postgresql draait:

ssh -L 9000: localhost: 5432 [e-post beskerme]

It brûken fan in tsjinner op ôfstân lost it probleem op mei teamûntwikkeling. Sa'n tsjinner kin brûkt wurde troch ferskate ûntwikkelders tagelyk; se hoege net te kinnen postgresql konfigurearje, Docker en oare yngewikkeldheden te begripen. Op in tsjinner op ôfstân kinne jo deselde database yn Docker sels ynstallearje, as it lestich is om in spesifike ferzje te ynstallearjen. Alle ûntwikkelders nedich is om ssh-tagong te leverjen!

Ik haw koartlyn lêzen dat SSH-tunnels in beheinde funksjonaliteit binne fan in gewoane VPN! Jo kinne OpenVPN of oare VPN-ymplemintaasjes gewoan ynstallearje, de ynfrastruktuer ynstelle en it oan ûntwikkelders jaan foar gebrûk. Dit is sa cool!

Gelokkich jouwe AWS, GoogleCloud en oaren jo in jier fergees gebrûk, dus brûk se! Se binne goedkeap as jo se útsette as se net yn gebrûk binne. Ik frege my altyd ôf wêrom't ik in tsjinner op ôfstân nedich wêze soe lykas gcloud, it liket derop dat ik se fûn.

As lokale firtuele masine kinne jo deselde Alpine brûke, dy't aktyf wurdt brûkt yn docker-konteners. No, as wat oare lichtgewicht distribúsjes om de masine flugger te booten.

Bottom line: jo kinne en moatte databases en oare ynfrastruktuer goodies útfiere op tsjinners op ôfstân of yn virtualbox. Ik haw gjin docker nedich foar dizze doelen.

In bytsje oer docker-ôfbyldings en distribúsje

Ik skreau al in artikel wêryn ik woe oerbringe dat it brûken fan docker-ôfbyldings gjin garânsje leveret. Docker-ôfbyldings binne allinich nedich om in docker-container te meitsjen. As jo ​​opwurdearje nei in docker-ôfbylding, dan binne jo opwurdearje om docker-konteners te brûken en jo sille se allinich brûke.

Hawwe jo oeral sjoen wêr't software-ûntwikkelders har produkten allinich yn in docker-ôfbylding portearje?
It resultaat fan de measte produkten is binêre bestannen foar in spesifyk platfoarm; se wurde gewoan tafoege oan it docker-ôfbylding, dat is erfd fan it winske platfoarm. Hawwe jo jo oait ôffrege wêrom't d'r safolle ferlykbere ôfbyldings binne op dockerhub? Fier bygelyks nginx yn, jo sille 100500 ôfbyldings sjen fan ferskate minsken. Dizze minsken hawwe nginx sels net ûntwikkele, se hawwe gewoan offisjele nginx tafoege oan har docker-ôfbylding en seare it mei har eigen konfiguraasjes foar it gemak fan it lansearjen fan konteners.

Yn 't algemien kinne jo it gewoan opslaan yn tgz, as immen it moat útfiere yn docker, lit se dan tgz tafoegje oan' e Dockerfile, ervje fan 'e winske omjouwing en meitsje ekstra buns dy't de applikaasje sels net feroarje yn tgz. Elkenien dy't in docker-ôfbylding sil meitsje sil witte wat tgz is en wat hy moat wurkje. Dit is hoe't ik docker brûke hjir

Bottom line: ik haw gjin docker-registraasje nedich, ik sil in soarte fan S3 brûke as gewoan bestânsopslach lykas google drive/dropbox

Docker in CI

Alle bedriuwen wêrfoar ik haw wurke binne ferlykber. Se binne meastal boadskippen. Dat is, se hawwe ien applikaasje, ien technologystapel (goed, miskien in pear of trije programmeartalen).

Dizze bedriuwen brûke docker op har servers wêr't it CI-proses rint. Fraach: Wêrom moatte jo projekten bouwe yn in docker-kontener op jo servers? Wêrom net gewoan in omjouwing foar de bou tariede, bygelyks in Ansible-spielboek skriuwe dat de nedige ferzjes fan nodejs, php, jdk, kopiearje ssh-kaaien, ensfh.

No begryp ik dat dit mysels yn 'e foet sjit, want docker bringt gjin winst mei syn isolemint. Problemen dy't ik tsjinkaam mei CI yn docker:

  • wer jo moatte in docker ôfbylding te bouwen. jo moatte sykje nei in ôfbylding of jo eigen dockerfile skriuwe.
  • 90% dat jo wat ssh-kaaien moatte trochstjoere, geheime gegevens dy't jo net wolle skriuwe nei de dockerôfbylding.
  • de kontener wurdt oanmakke en stjert, alle caches binne dêrmei ferlern gien. de folgjende build sil alle projektôfhinklikens opnij downloade, wat tiidslinend en net effektyf is, en tiid is jild.

Untwikkelders bouwe gjin projekten yn docker-konteners (ik wie eartiids sa'n fan, echt, ik fiel my yn it ferline meilijen xD). Yn java is it mooglik om ferskate ferzjes te hawwen en se mei ien kommando te feroarjen nei dejinge dy't jo no nedich binne. It is itselde yn nodejs, der is nvm.

konklúzje

Ik leau dat docker in heul krêftich en fleksibel ark is, dit is har neidiel (klinkt frjemd, ja). Mei har help kinne bedriuwen der maklik oan heakke wurde en it brûke wêr't it nedich is en net nedich. Untwikkelders lansearje har konteners, guon fan har omjouwings, dan streamt it allegear soepel yn CI en produksje. It DevOps-team skriuwt wat soarte koade om dizze konteners út te fieren.

Brûk docker allinich op de meast resinte stadium yn jo workflow, sleep it net oan it begjin yn it projekt. It sil jo bedriuwsproblemen net oplosse. Hy sil de problemen allinich ferpleatse nei AN AN AN NIVEAU en syn eigen oplossingen oanbiede, jo sille dûbel wurk dwaan.

As docker nedich is: Ik kaam ta de konklúzje dat docker tige goed is yn it optimalisearjen fan in bepaald proses, mar net yn it bouwen fan basisfunksjonaliteit

As jo ​​​​noch beslute om docker te brûken, dan:

  • wês ekstreem foarsichtich
  • twinge ûntwikkelders net om docker te brûken
  • lokalisearje it gebrûk op ien plak, ferspried it net oer alle Dockefile en docker-compose repositories

PS:

  • Ik kaam koartlyn tsjin pakker en se sizze dat it heul goed wurket mei Ansible en kinne jo it proses fan it bouwen fan ôfbyldings ferienigje (ynklusyf dockerôfbylding)
  • ek oer docker, nijsgjirrich artikel

Tankewol foar it lêzen, ik winskje jo transparante besluten yn jo saken en produktive wurkdagen!

Boarne: www.habr.com

Add a comment