Rūpīgi padomājiet, pirms izmantojat Docker-in-Docker CI vai testa videi

Rūpīgi padomājiet, pirms izmantojat Docker-in-Docker CI vai testa videi

Docker-in-Docker ir virtualizēta Docker dēmona vide, kas darbojas paŔā konteinerā, lai izveidotu konteinera attēlus. Galvenais Docker-in-Docker izveides mērÄ·is bija palÄ«dzēt attÄ«stÄ«t paÅ”u Docker. Daudzi cilvēki to izmanto, lai palaistu Jenkins CI. Sākumā tas Ŕķiet normāli, bet pēc tam rodas problēmas, no kurām var izvairÄ«ties, instalējot Docker Jenkins CI konteinerā. Å ajā rakstā ir aprakstÄ«ts, kā to izdarÄ«t. Ja jÅ«s interesē galÄ«gais risinājums bez detaļām, vienkārÅ”i izlasiet raksta pēdējo sadaļu ā€œProblēmas risināŔanaā€.

Rūpīgi padomājiet, pirms izmantojat Docker-in-Docker CI vai testa videi

Docker-in-Docker: "Labi"

Vairāk nekā pirms diviem gadiem es ievietoju Docker karogs ā€“ priviliģēts un rakstÄ«ja pirmā dind versija. MērÄ·is bija palÄ«dzēt galvenajai komandai ātrāk attÄ«stÄ«t Docker. Pirms Docker-in-Docker tipiskais izstrādes cikls izskatÄ«jās Ŕādi:

  • hackity hack;
  • bÅ«vēt;
  • darbojas Docker dēmona apturÄ“Å”ana;
  • jauna Docker dēmona palaiÅ”ana;
  • testÄ“Å”ana;
  • atkārtojiet ciklu.

Ja vēlaties izveidot skaistu, reproducējamu komplektu (tas ir, konteinerā), tas kļuva sarežģītāks:

  • hackity hack;
  • pārliecinieties, vai darbojas Docker darba versija;
  • izveidot jaunu Docker ar veco Docker;
  • apturēt Docker dēmonu;
  • sākt jaunu Docker dēmonu;
  • pārbaude;
  • apturēt jaunu Docker dēmonu;
  • atkārtojiet.

Līdz ar Docker-in-Docker parādīŔanos process ir kļuvis vienkārŔāks:

  • hackity hack;
  • montāža + palaiÅ”ana vienā posmā;
  • atkārtojiet ciklu.

Vai Ŕādā veidā nav daudz labāk?

Rūpīgi padomājiet, pirms izmantojat Docker-in-Docker CI vai testa videi

Docker-in-Docker: "Slikti"

Tomēr pretēji plaÅ”i izplatÄ«tam uzskatam Docker-in-Docker nav 100% zvaigznes, poniji un vienradži. Es domāju, ka izstrādātājam ir jāapzinās vairākas problēmas.

Viens no tiem attiecas uz LSM (Linux droŔības moduļiem), piemēram, AppArmor un SELinux: palaižot konteineru, "iekŔējais Docker" var mēģināt lietot droŔības profilus, kas konfliktēs vai sajauks "ārējo Docker". Å Ä« ir visgrÅ«tāk risināmā problēma, mēģinot apvienot priviliģētā karoga sākotnējo ievieÅ”anu. Manas izmaiņas darbojās, un visi testi tika nodoti manai Debian maŔīnai un Ubuntu testa virtuālajām maŔīnām, taču tās avarēja un sadedzināja Maikla Krosbija maŔīnā (viņam bija Fedora, cik es atceros). Es nevaru atcerēties precÄ«zu problēmas cēloni, bet tas varētu bÅ«t tāpēc, ka Maiks ir gudrs puisis, kurÅ” strādā ar SELINUX=enforce (es izmantoju AppArmor), un manas izmaiņas neņēma vērā SELinux profilus.

Docker-in-Doker: "Ļaunums"

Otrā problēma ir saistÄ«ta ar Docker krātuves draiveriem. Palaižot Docker-in-Docker, ārējais Docker darbojas virs parastās failu sistēmas (EXT4, BTRFS vai jebkura cita), un iekŔējais Docker darbojas uz kopÄ“Å”anas un rakstÄ«Å”anas sistēmas (AUFS, BTRFS, Device Mapper). u.c.). , atkarÄ«bā no tā, kas ir konfigurēts ārējā Docker izmantoÅ”anai). Tas rada daudzas kombinācijas, kas nedarbosies. Piemēram, jÅ«s nevarēsit palaist AUFS papildus AUFS.

Ja palaižat BTRFS papildus BTRFS, tam vispirms vajadzētu darboties, taču, tiklÄ«dz ir ligzdotie apakÅ”sējumi, vecākapsējums neizdosies izdzēst. Modulim Device Mapper nav nosaukumvietas, tādēļ, ja tajā paŔā datorā to palaiž vairākas Docker instances, tās visas varēs redzēt (un ietekmēt) attēlus savā starpā un konteinera dublÄ“Å”anas ierÄ«cēs. Tas ir slikti.

Ir risinājumi, lai atrisinātu daudzas no Ŕīm problēmām. Piemēram, ja vēlaties izmantot AUFS iekŔējā Docker, vienkārÅ”i pārveidojiet mapi /var/lib/docker par sējumu, un viss bÅ«s kārtÄ«bā. Docker ir pievienojis dažas pamata nosaukumvietas Device Mapper mērÄ·a nosaukumiem, lai, ja vienā un tajā paŔā iekārtā darbojas vairāki Docker zvani, tie nedarbosies viens otram.

Tomēr Ŕāda iestatÄ«Å”ana nepavisam nav vienkārÅ”a, kā redzams no Å”iem raksti dind repozitorijā vietnē GitHub.

Docker-in-Docker: tas pasliktinās

Kā ar bÅ«vÄ“Å”anas keÅ”atmiņu? Tas var bÅ«t arÄ« diezgan grÅ«ti. Cilvēki man bieži jautā: ā€œJa es izmantoju Docker-in-Docker, kā es varu izmantot resursdatorā mitinātus attēlus, nevis ievilkt visu atpakaļ savā iekŔējā Dockerā€?

Daži uzņēmÄ«gi cilvēki ir mēģinājuÅ”i saistÄ«t /var/lib/docker no resursdatora ar Docker-in-Docker konteineru. Dažreiz tie koplieto /var/lib/docker ar vairākiem konteineriem.

Rūpīgi padomājiet, pirms izmantojat Docker-in-Docker CI vai testa videi
Vai vēlaties sabojāt savus datus? Jo tieÅ”i tas sabojās jÅ«su datus!

Docker dēmons tika skaidri izstrādāts tā, lai tam bÅ«tu ekskluzÄ«va piekļuve /var/lib/docker. Nekam citam nevajadzētu "pieskarties, bakstÄ«t vai producēt" Docker failus, kas atrodas Å”ajā mapē.

Kāpēc tas tā ir? Jo tas ir rezultāts vienai no grÅ«tākajām mācÄ«bām, kas gÅ«tas, izstrādājot dotCloud. DotCloud konteinera dzinējs darbojās, vairākiem procesiem vienlaikus piekļūstot /var/lib/dotcloud. ViltÄ«gi triki, piemēram, atomu failu aizstāŔana (nevis rediģēŔana uz vietas), koda papildināŔana ar ieteikuma un obligātajām slēdzenēm un citi eksperimenti ar droŔām sistēmām, piemēram, SQLite un BDB, ne vienmēr darbojās. Kad mēs pārprojektējām savu konteineru dzinēju, kas galu galā kļuva par Docker, viens no lielākajiem projektÄ“Å”anas lēmumiem bija apvienot visas konteineru darbÄ«bas vienā dēmonā, lai novērstu visas vienlaicÄ«bas muļķības.

Nepārprotiet mani nepareizi: ir pilnÄ«gi iespējams izveidot kaut ko labu, uzticamu un ātru, kas ietver vairākus procesus un modernu paralēlo vadÄ«bu. Taču mēs domājam, ka ir vienkārŔāk un vieglāk rakstÄ«t un uzturēt kodu, izmantojot Docker kā vienÄ«go atskaņotāju.

Tas nozÄ«mē, ka, koplietojot direktoriju /var/lib/docker starp vairākiem Docker gadÄ«jumiem, radÄ«sies problēmas. Protams, tas var darboties, it Ä«paÅ”i agrÄ«nā testÄ“Å”anas stadijā. "Klausies, māt, es varu palaist ubuntu kā dokeris!" Bet izmēģiniet kaut ko sarežģītāku, piemēram, izvelciet vienu un to paÅ”u attēlu no diviem dažādiem gadÄ«jumiem, un jÅ«s redzēsit, ka pasaule sadeg.

Tas nozÄ«mē, ka, ja jÅ«su CI sistēma veic bÅ«vÄ“Å”anu un pārbÅ«vi, ikreiz, kad restartējat Docker-in-Docker konteineru, jÅ«s riskējat iemest kodolu tās keÅ”atmiņā. Tas nemaz nav forÅ”i!

Risinājums

Atkāpsimies soli atpakaļ. Vai jums tieŔām ir nepiecieÅ”ams Docker-in-Docker vai vienkārÅ”i vēlaties palaist Docker un izveidot un palaist konteinerus un attēlus no savas CI sistēmas, kamēr pati CI sistēma atrodas konteinerā?

Varu derēt, ka lielākā daļa cilvēku vēlas pēdējo iespēju, kas nozÄ«mē, ka viņi vēlas, lai CI sistēma, piemēram, Dženkinss, varētu darbināt konteinerus. Un vienkārŔākais veids, kā to izdarÄ«t, ir vienkārÅ”i ievietot Docker ligzdu savā CI konteinerā un saistÄ«t to ar karogu -v.

VienkārÅ”i sakot, kad palaižat CI konteineru (Jenkins vai citu), tā vietā, lai kaut ko uzlauztu kopā ar Docker-in-Docker, sāciet to ar rindiņu:

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

Å im konteineram tagad bÅ«s piekļuve Docker ligzdai, un tāpēc tas varēs palaist konteinerus. Izņemot to, ka tā vietā, lai palaistu ā€œbērnuā€ konteinerus, tiks palaists ā€œbrāļuā€ konteineri.

Izmēģiniet Å”o, izmantojot oficiālo docker attēlu (kurā ir Docker binārs):

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

Tas izskatās un darbojas kā Docker-in-Docker, taču tas nav Docker-in-Docker: kad Å”is konteiners izveidos papildu konteinerus, tie tiks izveidoti augstākā lÄ«meņa Docker. JÅ«s nesajutÄ«sit ligzdoÅ”anas blakusparādÄ«bas, un montāžas keÅ”atmiņa tiks koplietota vairākiem zvaniem.

PiezÄ«me. Å Ä« raksta iepriekŔējās versijās tika ieteikts saistÄ«t Docker bināro failu no resursdatora uz konteineru. Tagad tas ir kļuvis neuzticams, jo Docker dzinējs vairs neaptver statiskas vai gandrÄ«z statiskas bibliotēkas.

Tātad, ja vēlaties izmantot Jenkins CI Docker, jums ir 2 iespējas:
Docker CLI instalÄ“Å”ana, izmantojot pamata attēlu pakoÅ”anas sistēmu (t.i., ja jÅ«su attēls ir balstÄ«ts uz Debian, izmantojiet .deb pakotnes), izmantojot Docker API.

Dažas reklāmas šŸ™‚

Paldies, ka palikāt kopā ar mums. Vai jums patīk mūsu raksti? Vai vēlaties redzēt interesantāku saturu? Atbalsti mūs, pasūtot vai iesakot draugiem, mākoņa VPS izstrādātājiem no 4.99 USD, unikāls sākuma līmeņa serveru analogs, ko mēs jums izgudrojām: Visa patiesība par VPS (KVM) E5-2697 v3 (6 kodoli) 10GB DDR4 480GB SSD 1Gbps no 19$ vai kā koplietot serveri? (pieejams ar RAID1 un RAID10, līdz 24 kodoliem un līdz 40 GB DDR4).

Dell R730xd 2x lētāk Equinix Tier IV datu centrā Amsterdamā? Tikai Å”eit 2x Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100 TV no 199$ NÄ«derlandē! Dell R420 ā€” 2x E5-2430 2.2 GHz 6C 128 GB DDR3 2x960 GB SSD 1 Gbps 100 TB ā€” no 99 USD! LasÄ«t par Kā izveidot infrastruktÅ«ras uzņēmumu klase ar Dell R730xd E5-2650 v4 serveru izmantoÅ”anu 9000 eiro par santÄ«mu?

Avots: www.habr.com

Pievieno komentāru