Docker ni toy au la? Au bado ni kweli?

Hello kila mtu!

Kwa kweli nataka kupata mada moja kwa moja, lakini itakuwa sahihi zaidi kusema kidogo juu ya hadithi yangu:

Entry

Mimi ni mtayarishaji programu aliye na uzoefu wa kutengeneza programu-tumizi za ukurasa mmoja, scala/java na nodi kwenye seva.

Kwa muda mrefu kabisa (kwa hakika miaka michache au mitatu), nilikuwa na maoni kwamba Docker ni mana kutoka mbinguni na kwa ujumla chombo cha baridi sana na kila msanidi anapaswa kuwa na uwezo wa kuitumia. Na kutoka kwa hii inafuata kwamba kila msanidi programu anapaswa kuwa na Docker iliyosanikishwa kwenye mashine yao ya karibu. Vipi kuhusu maoni yangu, angalia kupitia nafasi ambazo zimewekwa kwenye hh sawa. Kila sekunde ina kutajwa kwa docker, na ikiwa unayo, hii itakuwa faida yako ya ushindani πŸ˜‰

Nikiwa njiani, nilikutana na watu wengi, na mitazamo yao tofauti kuelekea Docker na mfumo wake wa ikolojia. Wengine walisema kuwa hii ni jambo rahisi ambalo linahakikisha utendakazi wa jukwaa la msalaba. Wa pili hawakuelewa kwanini waende kwenye makontena na faida gani itapatikana kutoka kwake, wa tatu hawakujali kabisa na hawakujisumbua (waliandika tu kanuni na kwenda nyumbani - ninawaonea wivu. njia :)

Sababu za matumizi

Kwa nini nilitumia docker? Labda kwa sababu zifuatazo:

  • uzinduzi wa hifadhidata, 99% ya programu zinazitumia
  • kuzindua nginx kwa usambazaji wa sehemu ya mbele na kuweka seva mbadala kwa nyuma
  • unaweza kusanikisha programu katika picha ya kizimbani, kwa njia hii programu yangu itafanya kazi popote docker iko, shida ya usambazaji inatatuliwa mara moja.
  • ugunduzi wa huduma nje ya boksi, unaweza kuunda huduma ndogo, kila kontena (iliyounganishwa na mtandao wa kawaida) inaweza kufikia mwingine kwa urahisi kupitia pak, rahisi sana.
  • Inafurahisha kuunda chombo na "kucheza" ndani yake.

Kile ambacho SIPENDI kila wakati kuhusu docker:

  • Ili programu yangu ifanye kazi, ninahitaji Docker yenyewe kwenye seva. Kwa nini ninahitaji hii ikiwa programu zangu zinaendeshwa kwenye jre au nodejs na mazingira yao tayari yako kwenye seva?
  • ikiwa ninataka kuendesha picha yangu (ya faragha) iliyokusanywa ndani ya seva kwenye seva ya mbali, basi ninahitaji hazina yangu ya kizimbani, ninahitaji usajili kufanya kazi mahali pengine, na pia ninahitaji kusanidi https, kwa sababu docker cli inafanya kazi tu juu ya https. Oh damn... kuna chaguzi, bila shaka, kuhifadhi picha ndani ya nchi kupitia docker save na tu kutuma picha kupitia scp ... Lakini hiyo ni harakati nyingi za mwili. Na zaidi ya hayo, inaonekana kama suluhisho la "crutch" hadi hazina yako mwenyewe itaonekana
  • docker-compose. Inahitajika tu kuendesha vyombo. Ni hayo tu. Hawezi kufanya lolote lingine. Docker-compose ina rundo la matoleo ya faili zake, syntax yake mwenyewe. Haijalishi ni ya kutangaza, sitaki kusoma hati zao. Sitahitaji popote pengine.
  • wakati wa kufanya kazi katika timu, watu wengi huandika Dockerfile kwa upotovu sana, hawaelewi jinsi inavyohifadhiwa, ongeza kila kitu wanachohitaji na hawahitaji picha, hurithi kutoka kwa picha ambazo haziko kwenye Dockerhub au hazina ya kibinafsi, tengeneza baadhi. docker-compose faili zilizo na hifadhidata na hakuna kinachoendelea. Wakati huo huo, watengenezaji wanatangaza kwa kiburi kwamba Docker ni nzuri, kila kitu kinafanya kazi ndani yao, na HR anaandika muhimu katika nafasi hiyo: "Tunatumia Docker na tunahitaji mgombea aliye na uzoefu kama huo wa kazi."
  • Ninasumbuliwa kila mara na mawazo juu ya kuongeza kila kitu kwenye Docker: postgresql, kafka, redis. Ni huruma kwamba si kila kitu kinachofanya kazi katika vyombo, si kila kitu ni rahisi kusanidi na kukimbia. Hii inaungwa mkono na watengenezaji wa tatu, na sio na wachuuzi wenyewe. Na kwa njia, swali linatokea mara moja: wachuuzi hawana wasiwasi juu ya kudumisha bidhaa zao katika Docker, kwa nini ni hii, labda wanajua kitu?
  • Swali linatokea kila wakati juu ya kuendelea kwa data ya kontena. halafu unafikiria, ningeweka tu saraka ya mwenyeji au kuunda kiasi cha docker au kutengeneza kontena ya data ambayo iko sasa deprecated? Ikiwa nitaweka saraka, basi ninahitaji kuhakikisha kuwa uid na gid ya mtumiaji kwenye kontena inalingana na kitambulisho cha mtumiaji aliyezindua kontena, vinginevyo faili zilizoundwa na kontena zitaundwa na haki za mizizi. Ikiwa ninatumia volume basi data itaundwa tu katika baadhi /usr/* na kutakuwa na hadithi sawa na uid na gid kama katika kesi ya kwanza. Ikiwa unazindua kipengee cha wahusika wengine, unahitaji kusoma hati na kutafuta jibu la swali: "sehemu huandika faili katika saraka gani za vyombo?"

Siku zote sikupenda ukweli kwamba ilibidi nizungumze na Docker kwa muda mrefu sana katika hatua ya awali: Nilifikiria jinsi ya kuzindua vyombo, ni picha gani za kuzindua kutoka, nikatengeneza Makefiles ambazo zilikuwa na lakabu kwa amri ndefu za Docker. Nilichukia utunzi wa docker kwa sababu sikutaka kujifunza zana nyingine kwenye mfumo wa ikolojia wa kizimbani. NA docker-compose up Ilinisumbua, haswa ikiwa bado walikutana huko build miundo, badala ya picha zilizokusanywa tayari. Nilichotaka sana ni kutengeneza bidhaa kwa ufanisi na haraka. Lakini sikuweza kujua jinsi ya kutumia docker.

Tunakuletea Ansible

Hivi majuzi (miezi mitatu iliyopita), nilifanya kazi na timu ya DevOps, karibu kila mwanachama ambaye alikuwa na mtazamo mbaya kuelekea Docker. Kwa sababu:

  • docker inatawala iptables (ingawa unaweza kuizima kwenye daemon.json)
  • docker ni buggy na hatutaiendesha katika uzalishaji
  • ikiwa docker daemon itaanguka, basi kontena zote zilizo na miundombinu huanguka ipasavyo
  • hakuna haja ya docker
  • kwa nini docker ikiwa kuna Ansible na mashine za kawaida

Katika kazi hiyo hiyo, nilifahamiana na zana nyingine - Ansible. Nilisikia juu yake mara moja, lakini sikujaribu kuandika vitabu vyangu vya kucheza. Na sasa nilianza kuandika kazi zangu na kisha maono yangu yakabadilika kabisa! Kwa sababu niligundua: Ansible ina moduli za kuendesha vyombo sawa vya docker, ujenzi wa picha, mitandao, nk, na vyombo vinaweza kuendeshwa sio tu ndani, lakini pia kwenye seva za mbali! Furaha yangu haikujua mipaka - nilipata zana ya KAWAIDA na kutupa faili zangu za Makefile na docker-compose, zikabadilishwa na kazi za yaml. Nambari hiyo ilipunguzwa kwa kutumia miundo kama loop, when, Nk

Docker ya kuendesha vifaa vya wahusika wengine kama hifadhidata

Hivi majuzi nilifahamiana na vichuguu vya ssh. Ilibadilika kuwa ni rahisi sana "kusambaza" bandari ya seva ya mbali kwenye bandari ya ndani. Seva ya mbali inaweza kuwa mashine kwenye wingu au mashine pepe inayoendesha kwenye VirtualBox. Ikiwa mwenzangu au mimi tunahitaji hifadhidata (au sehemu nyingine ya wahusika wengine), tunaweza tu kuanza seva na sehemu hii na kuizima wakati seva haihitajiki. Usambazaji wa bandari hutoa athari sawa na hifadhidata inayoendesha kwenye kontena la kizimbani.

Amri hii inapeleka bandari yangu ya ndani kwa seva ya mbali inayoendesha postgresql:

ssh -L 9000:localhost:5432 [barua pepe inalindwa]

Kutumia seva ya mbali hutatua tatizo na ukuzaji wa timu. Seva kama hiyo inaweza kutumika na watengenezaji kadhaa mara moja; hawahitaji kuwa na uwezo wa kusanidi postgresql, kuelewa Docker na ugumu mwingine. Kwenye seva ya mbali, unaweza kufunga hifadhidata sawa katika Docker yenyewe, ikiwa ni vigumu kufunga toleo maalum. Watengenezaji wote wanahitaji ni kutoa ufikiaji wa ssh!

Hivi majuzi nilisoma kwamba vichuguu vya SSH ni utendaji mdogo wa VPN ya kawaida! Unaweza tu kusakinisha OpenVPN au utekelezaji mwingine wa VPN, kusanidi miundombinu na kuwapa wasanidi programu kwa matumizi. Hii ni poa sana!

Kwa bahati nzuri, AWS, GoogleCloud na zingine hukupa mwaka wa matumizi bila malipo, kwa hivyo zitumie! Zina bei nafuu ikiwa utazizima wakati hazitumiki. Siku zote nilijiuliza kwanini ningehitaji seva ya mbali kama gcloud, inaonekana niliwapata.

Kama mashine ya kawaida ya ndani, unaweza kutumia Alpine sawa, ambayo hutumiwa kikamilifu kwenye vyombo vya docker. Kweli, au ugawaji mwingine mwepesi ili kufanya mashine kuwasha haraka.

Jambo la msingi: unaweza na unapaswa kuendesha hifadhidata na vifaa vingine vya miundombinu kwenye seva za mbali au kwenye kisanduku pepe. Sihitaji docker kwa madhumuni haya.

Kidogo kuhusu picha za docker na usambazaji

Nimeandika tayari nakala ambayo nilitaka kuwasilisha kuwa kutumia picha za docker haitoi dhamana yoyote. Picha za Docker zinahitajika tu kuunda chombo cha docker. Ikiwa unasasisha hadi picha ya kizimbani, basi unasasisha kutumia vyombo vya docker na utazitumia tu.

Umeona mahali popote ambapo watengenezaji wa programu husafirisha bidhaa zao kwenye picha ya kizimbani pekee?
Matokeo ya bidhaa nyingi ni faili za binary kwa jukwaa maalum; zinaongezwa tu kwenye picha ya docker, ambayo inarithiwa kutoka kwa jukwaa linalohitajika. Umewahi kujiuliza kwa nini kuna picha nyingi zinazofanana kwenye dockerhub? Ingiza nginx kwa mfano, utaona picha 100500 kutoka kwa watu tofauti. Watu hawa hawakuunda nginx yenyewe, waliongeza nginx rasmi kwa picha yao ya kizimbani na kuiweka kwa usanidi wao wenyewe kwa urahisi wa kuzindua vyombo.

Kwa ujumla, unaweza kuihifadhi kwa tgz tu, ikiwa mtu anahitaji kuiendesha kwenye docker, basi wacha aongeze tgz kwenye Dockerfile, arithi kutoka kwa mazingira unayotaka na kuunda buns za ziada ambazo hazibadilishi programu yenyewe katika tgz. Mtu yeyote ambaye ataunda picha ya docker atajua tgz ni nini na anahitaji kufanya kazi gani. Hivi ndivyo ninavyotumia docker hapa

Jambo la msingi: Siitaji usajili wa docker, nitatumia aina fulani ya S3 au uhifadhi wa faili tu kama google drive/dropbox

Docker katika CI

Kampuni zote ambazo nimefanyia kazi zinafanana. Kawaida ni mboga. Hiyo ni, wana programu moja, stack moja ya teknolojia (vizuri, labda wanandoa au lugha tatu za programu).

Kampuni hizi hutumia docker kwenye seva zao ambapo mchakato wa CI unaendesha. Swali: Kwa nini unahitaji kujenga miradi kwenye chombo cha docker kwenye seva zako? Kwa nini usitayarishe tu mazingira ya ujenzi, kwa mfano, andika kitabu cha kucheza kinachofaa ambacho kitasakinisha matoleo muhimu ya nodejs, php, jdk, nakala za funguo za ssh, nk kwa seva ambayo ujenzi utafanyika?

Sasa ninaelewa kuwa hii inajipiga risasi kwenye mguu, kwa sababu docker haileti faida yoyote na kutengwa kwake. Shida nilizokutana nazo na CI kwenye kizimbani:

  • tena unahitaji picha ya kizimbani kuunda. unahitaji kutafuta picha au kuandika faili yako ya docker.
  • 90% ambayo unahitaji kusambaza funguo za ssh, data ya siri ambayo hutaki kuandika kwa picha ya kizimbani.
  • chombo kinaundwa na kufa, cache zote zinapotea pamoja nayo. ujenzi unaofuata utapakua tena utegemezi wote wa mradi, ambao unatumia wakati na haufanyi kazi, na wakati ni pesa.

Wasanidi programu hawajengi miradi katika vyombo vya docker (nilikuwa shabiki kama huyo, kwa kweli, ninajihurumia siku za nyuma xD). Katika java inawezekana kuwa na matoleo kadhaa na kuyabadilisha kwa amri moja hadi unayohitaji sasa. Ni sawa katika nodejs, kuna nvm.

Pato

Ninaamini kwamba docker ni chombo chenye nguvu sana na rahisi, hii ni drawback yake (inasikika ya ajabu, ndiyo). Kwa msaada wake, makampuni yanaweza kuunganishwa kwa urahisi na kuitumia pale inapohitajika na haihitajiki. Watengenezaji huzindua vyombo vyao, baadhi ya mazingira yao, kisha yote hutiririka vizuri katika CI na uzalishaji. Timu ya DevOps inaandika aina fulani ya msimbo ili kuendesha vyombo hivi.

Tumia docker pekee hivi karibuni hatua katika mtiririko wako wa kazi, usiiburute kwenye mradi mwanzoni. Haitasuluhisha shida za biashara yako. Atasogeza tu shida kwenye kiwango NYINGINE na kutoa suluhisho lake mwenyewe, utafanya kazi mara mbili.

Wakati docker inahitajika: Nilifikia hitimisho kwamba docker ni nzuri sana katika kuongeza mchakato fulani, lakini sio katika kujenga utendaji wa kimsingi.

Ikiwa bado unaamua kutumia docker, basi:

  • kuwa makini sana
  • usilazimishe watengenezaji kutumia docker
  • ujanibishe matumizi yake katika sehemu moja, usiieneze kwenye hazina zote za Dockefile na docker-compose

PS:

Asante kwa kusoma, nakutakia maamuzi ya uwazi katika mambo yako na siku za kazi zenye tija!

Chanzo: mapenzi.com

Kuongeza maoni