
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â.

Docker-in-Docker: "Hea"
Ăle kahe aasta tagasi lisasin Dockerisse --privileged ja kirjutasin . 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?

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. 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.

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 dockerSee 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. , ainulaadne entry-level serverite analoog, mille oleme teie jaoks vÀlja mÔelnud: (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 Hollandis! Dell R420 â 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB â alates $99! Lugege sellest
Allikas: habr.com
