MÔelge hoolikalt, enne kui kasutate Docker-in-Docker'i CI vÔi testkeskkonnana

MÔelge hoolikalt, enne kui kasutate Docker-in-Docker'i CI vÔi testkeskkonnana

Docker-in-Docker on Dockeri virtuaalne keskkond, kus Dockeri deemon töötab konteineris, et ehitada konteinerite pilte. Docker-in-Dockeri loomise peamine eesmĂ€rk oli aidata Dockerit arendada. Paljud inimesed kasutavad seda Jenkins CI kĂ€ivitamiseks. Alguses tundub see normaalne, kuid seejĂ€rel tekivad probleemid, mida oleks vĂ”imalik vĂ€ltida, kui installida Docker Jenkins CI konteinerisse. KĂ€esolevas artiklis rÀÀgitakse, kuidas seda teha. Kui teid huvitab lĂ”pplahendus, ilma detailideta, lugege lihtsalt artikli viimatist osa „Probleemi lahendamine”.

MÔelge hoolikalt, enne kui kasutate Docker-in-Docker'i CI vÔi testkeskkonnana

Docker-in-Docker: "Hea"

Üle kahe aasta tagasi lisasin Dockerisse Teised --privileged ja kirjutasin esimese versiooni dind. EesmĂ€rk oli aidata pĂ”himeeskonda Dockerit kiiremini arendada. Enne Docker-in-Dockeri ilmumist oli tĂŒĂŒpiline arendus-tsĂŒkkel selline:

  • hackity hack;
  • ehitamine (build);
  • kĂ€ivitatud Docker-deemoni peatamine;
  • uue Docker-deemoni kĂ€ivitamine;
  • testimine;
  • tsĂŒkli kordamine.

Kui aga soovisite teha ilusat, korduvat ehitust (st konteineris), siis muutus see keerulisemaks:

  • hackity hack;
  • veenduda, et töötav Docker on kĂ€ivitunud;
  • ehitada uus Docker vana Dockeriga;
  • peatada Docker-deemon;
  • kĂ€ivitada uus Docker-deemon;
  • testida;
  • peatada uus Docker-deemon;
  • korrata.

Docker-in-Dockeri tulekuga muutus protsess lihtsamaks:

  • hackity hack;
  • ehitamine + kĂ€ivitamine ĂŒhes etapis;
  • tsĂŒkli kordamine.

Ei tundu, et see oleks palju parem?

MÔelge hoolikalt, enne kui kasutate Docker-in-Docker'i CI vÔi testkeskkonnana

Docker-in-Docker: "Halb"

Siiski, vastupidiselt levinud arvamusele, ei koosne Docker-in-Docker 100% tĂ€htedest, poniidest ja ĂŒkssarvikutest. Ma pean silmas, et on mitmeid probleeme, millest arendajal on teadlik olla.

Üks neist puudutab LSM-i (Linuxi turvamoode), nagu AppArmor ja SELinux: konteinerit kĂ€ivitades vĂ”ib „sisemine Docker“ proovida rakendada turvaprofii, mis vĂ”ib konfliktida vĂ”i segi ajada „vĂ€list Dockerit“. See oli kĂ”ige keerulisem probleem, mida tuli lahendada, pĂŒĂŒdes ĂŒhendada algse implementatsiooni -privileegide lippu. Minu muudatused töötasid ning kĂ”ik testid oleksid lĂ€binud minu Debian masinas ja Ubuntus testmasinates, kuid nad oleksid kokku kukkunud ja pĂ”lenud Michael Crosby masinas (kui ma Ă”igesti mĂ€letan, oli tal Fedora). Ma ei mĂ€leta probleemi tĂ€pset pĂ”hjust, kuid vĂ”ib-olla tekkis see seetĂ”ttu, et Mike on nutikas inimene, kes töötab SELINUX=enforce (mina kasutasin AppArmor'i) ning minu muudatused ei arvestanud SELinuxi profiilidega.

Docker-in-Docker: „Kurjuse tĂŒtar“

Teine probleem on seotud Docker'i salvestusdraiveritega. Kui kĂ€ivitate Docker-in-Docker'i, töötab vĂ€line Docker tavalisel failisĂŒsteemil (EXT4, BTRFS vĂ”i mis iganes teil on) ja sisemine Docker töötab kirjutamise kopeerimise sĂŒsteemi (AUFS, BTRFS, seadme kartoteek jne, sĂ”ltuvalt sellest, mis on vĂ€list Dockerit kasutama seadistatud). Sellega kaasnevad paljud kombinatsioonid, mis ei tööta. NĂ€iteks ei saa te AUFS'i kĂ€ivitada AUFS'i peal.

Kui kĂ€itate BTRFS'i BTRFS'i peal, peaks see esmalt töötama, kuid kui ilmuvad sisemised alamkogud, ei saa vanemat alamkogude parent subvolume-d kustutada. SeadmepĂ”hine kartoteek ei oma nimesihte, seega kui mitu Docker'i instantsi kasutavad seda ĂŒhel masinal, saavad nad kĂ”ik ĂŒksteise pilte nĂ€ha (ja mĂ”jutada) ning konteinerite varukoopiaid. See on halb.

Paljude nende probleemide lahendamiseks on olemas ainult lahendused. NĂ€iteks kui soovite kasutada AUFS'i sisemises Dockeris, muutke lihtsalt kaust /var/lib/docker mahuks ja kĂ”ik on korras. Docker on lisanud mĂ”ned pĂ”hikohtumised seadme kartoteekide sihtmĂ€rkidele, nii et kui mitu Docker'i kutsungit tehakse ĂŒhel masinal, siis nad ei „astuks“ ĂŒksteise varbale.

Kuid selline seadistus pole sugugi lihtne, nagu on nÀha neist. artikleid GitHubi dind'i allikast.

Docker-in-Docker: lÀheb aina hullemaks

Kuidas on lood ĂŒlesehitamise cache'iga? See vĂ”ib olla ĂŒsna keeruline. Inimesed kĂŒsivad sageli: "kui ma kasutan Docker-in-Dockerit, kuidas ma saan kasutada minu hostis asuvaid pilte, selle asemel et kĂ”ik taas alla laadida minu sisemisse Dockerisse?"

MÔned ettevÔtlikud inimesed on proovinud siduda /var/lib/docker'i hostist Docker-in-Docker konteinerisse. MÔnikord jagavad nad koos /var/lib/docker'i mitme konteineriga.

MÔelge hoolikalt, enne kui kasutate Docker-in-Docker'i CI vÔi testkeskkonnana
Kas soovite andmeid kahjustada? Sest see on tÀpselt see, mis teie andmeid kahjustab!

Docker'i demon on selgelt loodud, et omada eksklusiivset juurdepÀÀsu /var/lib/docker'ile. Mitte miski muu ei tohiks "puutuda, torkida vĂ”i katsuda" ĂŒhtegi Docker'i faili, mis asub selles kaustas.

Miks see nii on? Sest see on tulemus ĂŒhest kĂ”ige keerulisemast Ă”ppetunnist, mis saadud dotCloud'i arendamisel. DotCloud'i konteineri mootor töötas, kui mitmed protsessid kasutasid samaaegselt /var/lib/dotcloud'i. Peened trikid, nagu atomaarne failide asendamine (kui mitte redigeerimine kohapeal), koodi „tĂ”ukamine” soovituslike ja kohustuslike lukudega ning muud eksperimendid turvaliste sĂŒsteemidega, nagu SQLite ja BDB, ei töötanud alati. Kui me ĂŒmber tegime meie konteineri mootori, mis lĂ”puks muutus Docker'iks, oli ĂŒks peamistest disainilahendustest koondada kĂ”ik konteinerite operatsioonid ĂŒhte daemonisse, et lĂ”petada kogu see jama samaaegsest juurdepÀÀsust.

Ärge saage mind valesti aru: on tĂ€iesti vĂ”imalik teha midagi head, usaldusvÀÀrset ja kiiret, mis hĂ”lmab mitmeid protsesse ja kaasaegset paralleelset haldust. Kuid meie arvates on lihtsam ja kergem kirjutada ja hallata koodi, kasutades Docker'it ainulaadse mĂ€ngijana.

See tÀhendab, et kui jagate katalooge /var/lib/docker mitmete Docker'i eksemplaride vahel, siis teil on probleeme. Loomulikult vÔib see toimida, eriti varajaste testimise etappide jooksul. "Kuule, ma saan Ubuntu 'd dockeri' abil jooksutada!" Aga proovige teha midagi keerukamat, nÀiteks alla laadida sama pilti kahest erinevast eksemplarist, ja te nÀete, kuidas maailm pÔleb.

See tĂ€hendab, et kui teie CI-sĂŒsteem teostab ehitusi ja ĂŒmberehitusi, siis iga kord, kui kĂ€itate Docker-in-Docker konteinerit, riskite tuuma pommi oma puhverdatud mĂ€lus eemaldamisega. See pole sugugi Ă€ge!

Probleemi lahendus

VĂ”tame ĂŒhe sammu tagasi. Kas teil on tĂ”eliselt vaja Docker-in-Docker'i vĂ”i soovite lihtsalt vĂ”imalust kĂ€ivitada Dockerit, st ehitada ja kĂ€ivitada konteinerite ja piltide teie CI-sĂŒsteemist, samas kui see CI-sĂŒsteem asub konteineris?

Olen kindel, et enamikule inimestele meeldib viimane variant, st nad soovivad, et CI-sĂŒsteem, nagu Jenkins, saaks konteinerite kĂ€ivitamiseks. Ja kĂ”ige lihtsam viis seda teha on lihtsalt liituda Docker sokliga teie CI konteineris, seostades selle -v lipuga.

Lihtsalt öeldes, kui kÀitate oma CI konteinerit (Jenkins vÔi muu), aluseta midagi Docker-in-Docker'iga, alustage seda jÀrgmiselt:

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

NĂŒĂŒd pÀÀseb see konteiner Docker soklile ja seega suudab kĂ€ivitada konteinerid. Erinevalt sellest, et „alamsĂ”lmed” konteinerid saavad olema „sugulased“ konteinerid.

Proovige seda, kasutades ametlikku Docker'i pilti (mis sisaldab Docker'i binaarfaili):

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

See nÀeb vÀlja ja töötab nagu Docker-in-Docker, kuid see ei ole Docker-in-Docker: kui see konteiner loob tÀiendavaid konteinerite, luuakse need kÔrgema taseme Docker'is. Te ei koge sisemise taseme kÔrvalmÔjusid ja ehituse vahemÀlu jagatakse mitme kutsumise vahel.

MĂ€rkus: selle artikli varasemad versioonid soovitasid siduda Docker'i binaarfail hostist konteinerisse. NĂŒĂŒd on see muutunud ebausaldusvÀÀrseks, kuna Docker'i mehhanism ei laiene enam staatilistele vĂ”i peaaegu staatilistele raamatukogudele.

Seega, kui soovite kasutada Dockerit Jenkins CI-s, on teil 2 varianti:
installige Docker CLI, kasutades pakettide paigaldamise pÔhiosakonda (nt kui teie pilt pÔhineb Debianil, kasutage .deb pakette), kasutage Docker API-d.

Veidi reklaami 🙂

AitÀh, et olete meiega. Kas teile meeldivad meie artiklid? Kas soovite nÀha rohkem huvitavat sisu? Toetage meid, tellides teenuse vÔi soovitades meid tuttavatele. Pilve VPS arendajatele alates $4.99, ainulaadne entry-level serverite analoog, mille oleme teie jaoks vÀlja mÔelnud: Kogu tÔde VPS (KVM) E5-2697 v3 (6 Cores) 10GB DDR4 480GB SSD 1Gbps alates $19 vÔi kuidas jagada serverit Ôigesti? (saadaval RAID1 ja RAID10 variandid, kuni 24 tuuma ja kuni 40GB DDR4).

Dell R730xd on Equinixi Tier IV andmekeskuses Amsterdamis kaks korda odavam? Ainult meie juures 2 x Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100 TB alates $199 Hollandis! Dell R420 — 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB — alates $99! Lugege sellest Kuidas luua ettevĂ”tte tasemel infrastruktuuri, kasutades Dell R730xd E5-2650 v4 servereid, mille hind on 9000 eurot, taskukohase hinna eest?

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster