Aħseb sew qabel tuża Docker-in-Docker għal CI jew ambjent tat-test

Aħseb sew qabel tuża Docker-in-Docker għal CI jew ambjent tat-test

Docker-in-Docker huwa ambjent tad-demon Docker virtwalizzat li jaħdem fil-kontenitur innifsu biex jibni immaġini tal-kontenitur. L-għan ewlieni tal-ħolqien ta 'Docker-in-Docker kien li jgħin fl-iżvilupp ta' Docker innifsu. Ħafna nies jużawha biex imexxu Jenkins CI. Dan jidher normali għall-ewwel, iżda mbagħad jinqalgħu problemi li jistgħu jiġu evitati billi jiġi installat Docker f'kontenitur Jenkins CI. Dan l-artikolu jgħidlek kif tagħmel dan. Jekk inti interessat fis-soluzzjoni finali mingħajr dettalji, aqra biss l-aħħar taqsima tal-artiklu, "Issolvi l-Problema."

Aħseb sew qabel tuża Docker-in-Docker għal CI jew ambjent tat-test

Docker-in-Docker: "Tajjeb"

Aktar minn sentejn ilu daħħalt f'Docker bandiera –privileġġjat u kiteb l-ewwel verżjoni tad-dind. L-għan kien li jgħin lit-tim ewlieni jiżviluppa Docker aktar malajr. Qabel Docker-in-Docker, iċ-ċiklu ta 'żvilupp tipiku kien jidher bħal dan:

  • hackity hack;
  • tibni;
  • twaqqaf daemon Docker li qed jaħdem;
  • it-tnedija ta' demon Docker ġdid;
  • ittestjar;
  • irrepeti ċ-ċiklu.

Jekk ridt tagħmel assemblaġġ sabiħ u riproduċibbli (jiġifieri f'kontenitur), allura sar aktar kumpless:

  • hackity hack;
  • kun żgur li verżjoni tax-xogħol ta 'Docker tkun qed taħdem;
  • ibni Docker ġdid b'Docker l-antik;
  • waqqaf Docker daemon;
  • ibda demon Docker ġdid;
  • test;
  • waqqaf daemon Docker ġdid;
  • irrepeti.

Bil-miġja ta 'Docker-in-Docker, il-proċess sar aktar sempliċi:

  • hackity hack;
  • assemblaġġ + tnedija fi stadju wieħed;
  • irrepeti ċ-ċiklu.

Mhux ħafna aħjar b'dan il-mod?

Aħseb sew qabel tuża Docker-in-Docker għal CI jew ambjent tat-test

Docker-in-Docker: "Ħażin"

Madankollu, kuntrarjament għat-twemmin popolari, Docker-in-Docker mhuwiex 100% stilel, ponijiet u unicorns. Li rrid ngħid huwa li hemm diversi kwistjonijiet li żviluppatur jeħtieġ li jkun konxju minnhom.

Waħda minnhom tikkonċerna LSMs (moduli tas-sigurtà tal-Linux) bħal AppArmor u SELinux: meta tħaddem kontenitur, id-"Docker intern" jista 'jipprova japplika profili ta' sigurtà li jikkonfliġġu jew iħawdu l-"Docker estern". Din hija l-aktar problema diffiċli biex issolvi meta tipprova tgħaqqad l-implimentazzjoni oriġinali tal-bandiera –privileged. Il-bidliet tiegħi ħadmu u t-testijiet kollha kienu jgħaddu fuq il-magna Debian tiegħi u l-VMs tat-test Ubuntu, iżda kienu jiġġarrfu u jaħarqu fuq il-magna ta 'Michael Crosby (kellu Fedora kif niftakar). Ma nistax niftakar il-kawża eżatta tal-problema, iżda seta' kien minħabba li Mike huwa raġel għaqli li jaħdem b'SELINUX=enforce (użajt AppArmor) u l-bidliet tiegħi ma ħadux kont tal-profili SELinux.

Docker-in-Docker: "Ħażin"

It-tieni kwistjoni hija bis-sewwieqa tal-ħażna Docker. Meta tmexxi Docker-in-Docker, Docker estern jaħdem fuq sistema ta’ fajls regolari (EXT4, BTRFS, jew dak kollu li għandek) u Docker intern jaħdem fuq sistema ta’ copy-on-write (AUFS, BTRFS, Device Mapper). , eċċ.). , skond dak li huwa kkonfigurat biex juża Docker estern). Dan joħloq ħafna kombinazzjonijiet li mhux se jaħdmu. Pereżempju, ma tkunx tista' tħaddem AUFS fuq AUFS.

Jekk tmexxi BTRFS fuq BTRFS, għandu jaħdem għall-ewwel, iżda ladarba jkun hemm subvolumi nested, it-tħassir tas-subvolum ġenitur ifalli. Il-modulu Device Mapper m'għandux spazju għall-isem, għalhekk jekk istanzi multipli ta 'Docker qed imexxuh fuq l-istess magna, kollha jkunu jistgħu jaraw (u jinfluwenzaw) l-immaġini fuq xulxin u fuq il-mezzi ta' backup tal-kontenitur. Dan huwa ħażin.

Hemm soluzzjonijiet biex issolvi ħafna minn dawn il-problemi. Pereżempju, jekk trid tuża AUFS f'Docker intern, dawwar il-folder /var/lib/docker f'volum u tkun tajjeb. Docker żied xi spazji tal-ismijiet bażi mal-ismijiet fil-mira tal-Device Mapper sabiex jekk sejħiet multipli Docker qed jaħdmu fuq l-istess magna, ma jpinġux fuq xulxin.

Madankollu, setup bħal dan mhu xejn sempliċi, kif jidher minn dawn artikoli fir-repożitorju dind fuq GitHub.

Docker-in-Docker: Tiggrava

Xi ngħidu dwar il-build cache? Dan jista 'jkun pjuttost diffiċli wkoll. In-nies spiss jistaqsuni "jekk qed inħaddem Docker-in-Docker, kif nista' nuża immaġini ospitati fuq il-host tiegħi minflok ma niġbed kollox lura fid-Docker intern tiegħi"?

Xi nies intraprendenti ppruvaw jorbtu /var/lib/docker mill-host għal kontenitur Docker-in-Docker. Xi drabi jaqsmu /var/lib/docker ma' kontenituri multipli.

Aħseb sew qabel tuża Docker-in-Docker għal CI jew ambjent tat-test
Trid tikkorrompi d-dejta tiegħek? Minħabba li dan huwa eżattament dak li se jagħmel ħsara lid-dejta tiegħek!

Id-daemon Docker kien iddisinjat b'mod ċar biex ikollu aċċess esklussiv għal /var/lib/docker. Xejn aktar m'għandu "tmiss, poke, jew prod" xi fajls Docker li jinsabu f'dan il-folder.

Għaliex dan hu hekk? Minħabba li dan huwa r-riżultat ta 'waħda mill-aktar lezzjonijiet iebsa li tgħallmu waqt l-iżvilupp ta' dotCloud. Il-magna tal-kontejners dotCloud damet billi kellha proċessi multipli li jaċċessaw /var/lib/dotcloud simultanjament. Tricks cunning bħal sostituzzjoni tal-fajl atomiku (minflok editjar fil-post), kodiċi peppering b'serraturi konsultattivi u obbligatorji, u esperimenti oħra b'sistemi siguri bħal SQLite u BDB mhux dejjem ħadmu. Meta konna qed niddisinnjaw mill-ġdid il-magna tal-kontejners tagħna, li eventwalment saret Docker, waħda mid-deċiżjonijiet kbar tad-disinn kienet li nikkonsolidaw l-operazzjonijiet kollha tal-kontejners taħt daemon wieħed biex inneħħu l-nonsense kollha tal-konkorrenza.

Taħsibx ħażin: huwa kompletament possibbli li tagħmel xi ħaġa tajba, affidabbli u veloċi li tinvolvi proċessi multipli u kontroll parallel modern. Imma naħsbu li huwa aktar sempliċi u faċli li tikteb u żżomm kodiċi billi tuża Docker bħala l-uniku plejer.

Dan ifisser li jekk taqsam id-direttorju /var/lib/docker bejn diversi istanzi Docker, ikollok problemi. Naturalment, dan jista 'jaħdem, speċjalment fl-istadji bikrija tal-ittestjar. “Isma’, Ma, nista’ nmexxi ubuntu bħala docker!” Imma ipprova xi ħaġa aktar kumplessa, bħal tiġbed l-istess immaġni minn żewġ każijiet differenti, u tara d-dinja tinħaraq.

Dan ifisser li jekk is-sistema CI tiegħek twettaq bini u tibni mill-ġdid, kull darba li terġa 'tibda l-kontenitur Docker-in-Docker tiegħek, tirriskja li twaqqa' nuke fil-cache tagħha. Dan mhu jibred xejn!

Is-soluzzjoni

Ejja nieħdu pass lura. Verament għandek bżonn Docker-in-Docker jew trid sempliċement tkun tista' tħaddem Docker u tibni u tħaddem kontenituri u immaġini mis-sistema CI tiegħek waqt li dik is-sistema CI nnifisha tkun f'kontenitur?

I bet ħafna nies iridu l-aħħar għażla, li jfisser li jridu sistema CI bħal Jenkins biex tkun tista 'tmexxi kontenituri. U l-eħfef mod biex tagħmel dan huwa li sempliċement daħħal socket Docker fil-kontenitur CI tiegħek u tassoċjaha mal-bandiera -v.

Fi kliem sempliċi, meta tmexxi l-kontenitur CI tiegħek (Jenkins jew ieħor), minflok ma taqbad xi ħaġa flimkien ma 'Docker-in-Docker, ibda bil-linja:

docker run -v /var/run/docker.sock:/var/run/docker.sock ...

Dan il-kontenitur issa se jkollu aċċess għas-socket Docker u għalhekk ikun jista’ jħaddem kontenituri. Ħlief li minflok ma tħaddem kontenituri "tfal", se tniedi kontenituri "aħwa".

Ipprova dan billi tuża l-immaġni uffiċjali tad-docker (li fiha l-binarju Docker):

docker run -v /var/run/docker.sock:/var/run/docker.sock 
           -ti docker

Jidher u jaħdem bħal Docker-in-Docker, iżda mhuwiex Docker-in-Docker: meta dan il-kontenitur joħloq kontenituri addizzjonali, dawn se jinħolqu fid-Docker tal-ogħla livell. Mhux se tesperjenza l-effetti sekondarji tat-tbejjit u l-cache tal-assemblaġġ se tkun kondiviża fuq sejħiet multipli.

Nota: Verżjonijiet preċedenti ta 'dan l-artikolu avżaw li jgħaqqdu l-binarju Docker mill-host mal-kontenitur. Dan issa sar inaffidabbli peress li l-magna Docker m'għadhiex tkopri libreriji statiċi jew kważi statiċi.

Allura, jekk trid tuża Docker minn Jenkins CI, għandek 2 għażliet:
l-installazzjoni tad-Docker CLI billi tuża s-sistema bażika tal-ippakkjar tal-immaġni (jiġifieri jekk l-immaġni tiegħek hija bbażata fuq Debian, uża pakketti .deb), billi tuża l-API Docker.

Xi reklami 🙂

Grazzi talli bqajt magħna. Tħobb l-artikoli tagħna? Trid tara aktar kontenut interessanti? Appoġġuna billi tagħmel ordni jew tirrakkomanda lill-ħbieb, Cloud VPS għall-iżviluppaturi minn $4.99, analogu uniku ta 'servers ta' livell ta 'dħul, li ġie ivvintat minna għalik: Il-verità kollha dwar VPS (KVM) E5-2697 v3 (6 Cores) 10GB DDR4 480GB SSD 1Gbps minn $19 jew kif taqsam server? (disponibbli b'RAID1 u RAID10, sa 24 core u sa 40GB DDR4).

Dell R730xd 2 darbiet orħos fiċ-ċentru tad-dejta Equinix Tier IV f'Amsterdam? Hawn biss 2 x Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100 TV minn $199 fl-Olanda! Dell R420 - 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB - minn $99! Aqra dwar Kif tibni l-infrastruttura corp. klassi bl-użu ta 'servers Dell R730xd E5-2650 v4 li jiswew 9000 ewro għal ċenteżmu?

Sors: www.habr.com

Żid kumment