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

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

Docker-in-Docker on Docker-teenuse virtuaalset keskkonda, mis töötab konteineri sees, et luua konteineripilte. Docker-in-Docker'i peamine eesmĂ€rk oli aidata Dockerit arendada. Paljud kasutavad seda Jenkins CI kĂ€itamiseks. Esialgu tundub see normaalne, kuid hiljem tekivad probleemid, mida oleks saanud vĂ€ltida, kui Docker installida Jenkins CI konteinerisse. Selles artiklis rÀÀgitakse, kuidas seda teha. Kui teid huvitab viimane lahendus ilma ĂŒksikasjade vaatamiseta, loe lihtsalt artikli „Probleemi lahendamine” viimane osa.

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

Docker-in-Docker: „Hea”

Ükskord rohkem kui kaks aastat tagasi lisasin Dockerisse lipuke –privileged ja kirjutasin esimese versiooni dind. EesmĂ€rk oli aidata pĂ”himeeskonnal Dockerit kiiremini arendada. Enne Docker-in-Docker'i ilmumist nĂ€gi tĂŒĂŒpiline arendustsĂŒkkel vĂ€lja jĂ€rgmine:

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

Kuid kui soovisite teha ilusat, korratavasse pakkesse (st konteinerisse), muutus see keerulisemaks:

  • hackity hack;
  • veenduda, et kĂ€imas on toimiv Docker versioon;
  • koosta uus Docker vana Dockeriga;
  • peatada Docker daemon;
  • kĂ€ivitada uus Docker daemon;
  • testida;
  • peatada uus Docker daemon;
  • korrata.

Docker-in-Docker'i tulek on protsessi lihtsustanud:

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

KĂŒsi endalt, kas see ei ole palju parem?

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

Docker-in-Docker: "Halb"

Kuid vastupidiselt levinud arvamusele, ei koosne Docker-in-Docker 100% tĂ€hekestest, poniidest ja ĂŒkssarvikutest. Ma tahan öelda, et on mĂ”ned probleemid, millest arendajal tasub teadlik olla.

Üks neist puudutab LSM-i (Linuxi turvamuuduleid), nagu AppArmor ja SELinux: konteineri kĂ€ivitamisel vĂ”ib "sisemine Docker" proovida rakendada turvaprofiile, mis vĂ”ivad "vĂ€list Dockerit" segadusse ajada vĂ”i konfliktidesse sattuda. See oli kĂ”ige keerulisem probleem, mida oli vaja lahendada lĂ€htudes -privileged lippu. Minu muudatused toimisid ja kĂ”ik testid oleksid ka minu Debianis ja Ubuntu teste virtuaalmasinates lĂ€kid tegevuse, kuid nad kukuksid ja sureksid Michael Crosby masinas (kui ma Ă”igesti mĂ€letan, oli tal Fedora). Ma ei suuda tĂ€pselt meenutada probleemi pĂ”hjust, kuid see vĂ”is tekkida selle tĂ”ttu, et Mike on tark mees, kes töötab SELINUX=enforce tingimustes (ma kasutasin AppArmore), ning minu muudatused ei vĂ”tnud arvesse SELinuxi profile.

Docker-in-Docker: "Kurjuse"

Teiseks probleemiks on Docker'i salvestusjuhikud. Kui kĂ€itate Docker'it Docker'i sees, töötab vĂ€line Docker tavalise failisĂŒsteemi (EXT4, BTRFS vĂ”i muu, mis teil on) peal, samas kui sisemine Docker töötab kirjutamise koopiasĂŒsteemi (AUFS, BTRFS, Device Mapper jne, sĂ”ltuvalt sellest, mis on konfigureeritud vĂ€lise Docker'i jaoks). See tekitab palju kombinatsioone, mis ei tööta. NĂ€iteks ei saa te kĂ€ivitada AUFS'i AUFS'i peal.

Kui kĂ€itate BTRFS'i BTRFS'i peal, peaks see esmalt töötama, kuid kui ilmnevad sisemised alamhĂ”ivad, ei saa vanemat alamhĂ”ivet kustutada. Device Mapper'il ei ole nimeruumi, seega kui mitu Docker'i instantsi kasutavad seda ĂŒhel masinal, saavad kĂ”ik neist nĂ€ha (ja mĂ”jutada) ĂŒksteise pilte ja konteinerite varundusseadmeid. See on halb.

On olemas vĂ€ltimised paljude nende probleemide lahendamiseks. NĂ€iteks, kui soovite kasutada AUFS-i sisemises Dockeris, muutke lihtsalt kaust /var/lib/docker montaaĆŸiks ja kĂ”ik töötab nagu peab. Docker on lisanud sihtmĂ€rkide seadme kaardile mĂ”ned pĂ”hiraamid, nii et kui mitu Docker'i kutset töötab ĂŒhel masinal, ei lĂ€he need â€žĂŒks teise peale.”

Siiski, selline seadistus pole sugugi lihtne, nagu saate nÀha nendest artiklites dind'i hoidlast GitHub'is.

Docker-in-Docker: muutub veel keerulisemaks

Aga kuidas on ehituskatalooge? See vĂ”ib samuti olla ĂŒsna keeruline. Inimesed kĂŒsivad tihti, "kui ma kĂ€itan Docker-in-Docker't, kuidas saan kasutada oma hostis asuvaid pilte, selle asemel et kĂ”ike oma sisemises Dockeris uuesti alla laadida?"

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

MÔelge hoolikalt, enne kui kasutate Docker-in-Docker'i CI vÔi testkeskkonnas
Kas soovite andmeid rikkuda? Sest see on just see, mis rikub teie andmed!

Dockeri demon on selgelt loodud sellele, et tagada ainulaadne juurdepÀÀs /var/lib/docker. Mitte miski muu ei tohiks "puutuda, suruda vÔi katsuda" mis tahes Dockeri faile, mis asuvad selles kaustas.

Miks see nii on? Kuna see on tulemus ĂŒhest kĂ”ige raskematest Ă”ppetundidest, mis saadi dotCloudi arendamisel. DotCloudi konteinerimootor töötas, lubades mitmel protsessil samal ajal juurdepÀÀsu /var/lib/dotcloudile. Ohtlikud nipid, nagu failide aatomiline asendamine (kui mitte redigeerida kohapeal), koodi "pipardamine" soovituslike ja kohustuslike lukustustega ning muud katsed ohutute sĂŒsteemidega, nagu SQLite ja BDB, ei töötanud alati. Kui me ĂŒmber kujundasime meie konteinerimootori, mis lĂ”puks muutus Dockeriks, oli ĂŒheks peamiseks kavandamisotsuseks kĂ”ik konteineritega seotud toimingud koondada ĂŒhe demonini, et lĂ”petada kogu see segadus samaaegsest juurdepÀÀsust.

Ärge saage valesti aru: on tĂ€iesti vĂ”imalik teha midagi head, usaldusvÀÀrset ja kiiret, mis hĂ”lmab mitmeid protsesse ja kaasaegset paralleelset haldust. Kuid me arvame, et on lihtsam ja kergem kirjutada ja hallata koodi, kasutades Dockerit ainukese mĂ€ngijana.

See tÀhendab, et kui jagate katalooge /var/lib/docker mitme Docker-i eksemplari vahel, siis tekivad teil probleemid. Muidugi vÔib see toimida, eriti testimise varases etapis. "Kuule, ema, ma saan "dockeriga" ubuntu kÀivitada!" Kuid proovige teha midagi keerulisemat, nÀiteks tÔmmata sama pilti kahest erinevast eksemplarist, ja nÀete, kuidas maailm pÔleb.

See tĂ€hendab, et kui teie CI-sĂŒsteem sooritab ehitusi ja uuesti ehitusi, siis iga kord Docker-in-Docker konteineri taaskĂ€ivitamisel riskite oma vahemĂ€lu sees tuumabombaga. See ei ole sugugi lahe!

Probleemi lahendamine

Teeme sammu tagasi. Kas teil on tĂ”esti vaja Docker-in-Dockerit vĂ”i soovite lihtsalt vĂ”imalust kĂ€ivitada Dockerit, nimelt koguda ja kĂ€ivitada konteinerid ja pildid oma CI-sĂŒsteemist, samal ajal kui see CI-sĂŒsteem ise on konteineris?

Ma arvan, et enamik inimesi vajab viimast varianti, s.t. nad soovivad, et CI-sĂŒsteem nagu Jenkins saaks konteinerit kĂ€ivitada. Ja lihtsaim viis selleks on lihtsalt Docker-soketi sisestamine oma CI-konteinerisse, seostades selle -v lipuga.

Lihtsalt öeldes, kui kÀitate oma CI-konteinerit (Jenkins vÔi muu), alustage seda jÀrgmistel ridadel, selle asemel et midagi Docker-in-Dockeriga kokku panna:

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

NĂŒĂŒd on sellel konteineril juurdepÀÀs Docker-soketile ja seega saab see konteinerit kĂ€ivitada. Erinevalt sellest, et see ei kĂ€ivita “alam” konteinerit, vaid “sugulasi” konteinerit.

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 konteine, luuakse need ĂŒlemise Docker'i alla. Te ei koge pesakonna kĂ”rvaltoimeid ja ehitusvahemĂ€lu kasutatakse mitme kutsumise jaoks.

MĂ€rkus: Artikli varasemates versioonides soovitati siduda hosti binaarfail Docker konteineriga. NĂŒĂŒd on see ebausaldusvÀÀrne, kuna Docker mehhanism ei kehti enam staatilistele vĂ”i peaaegu staatilistele raamatukogudele.

Seega, kui soovite Jenkins CI-st Dockerit kasutada, on teil 2 vÔimalust:
installige Docker CLI, kasutades pildipakendi aluseks olevat sĂŒsteemi (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 huvitavaid materjale? Toetage meid, tehes tellimuse vĂ”i soovitades meid tuttavatele. pilve VPS arendajatele alates $4,99, ainulaadne sisenemise taseme 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 Ă”ieti serverit jagada? (saadaval on RAID1 ja RAID10 variandid, kuni 24 sĂŒdamikku ja kuni 40GB DDR4).

Kas Dell R730xd on kaks korda odavam Equinixi Tier IV andmete keskuses Amsterdamis? Ainult meie juures 2 x Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100 TB alates $199 Hollandi turul! Dell R420 — 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB — alates $99! Lugege, kuidas Luua ettevĂ”tte tasemel infrastruktuur Dell R730xd E5-2650 v4 serveritega, mille hind on 9000 eurot, madala hinnaga?

Allikas: habr.com

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster