Hunahunaa pag-ayo sa dili pa gamiton ang Docker-in-Docker alang sa CI o pagsulay nga palibot

Hunahunaa pag-ayo sa dili pa gamiton ang Docker-in-Docker alang sa CI o pagsulay nga palibot

Ang Docker-in-Docker usa ka virtual nga Docker nga daemon nga palibot nga nagdagan sa sulud mismo sa sulud aron maghimo mga imahe sa sulud. Ang panguna nga katuyoan sa paghimo sa Docker-in-Docker mao ang pagtabang sa pagpalambo sa Docker mismo. Daghang mga tawo ang naggamit niini sa pagpadagan sa Jenkins CI. Kini daw normal sa sinugdan, apan unya ang mga problema motungha nga mahimong malikayan pinaagi sa pag-instalar sa Docker sa usa ka sudlanan sa Jenkins CI. Gisultihan ka niini nga artikulo kung giunsa kini buhaton. Kon interesado ka sa kataposang solusyon nga walay mga detalye, basaha lang ang kataposang seksiyon sa artikulo, “Pagsulbad sa Problema.”

Hunahunaa pag-ayo sa dili pa gamiton ang Docker-in-Docker alang sa CI o pagsulay nga palibot

Docker-in-Docker: "Maayo"

Kapin sa duha ka tuig ang milabay gibutang ko sa Docker bandera –pribilehiyo ug misulat unang bersyon sa dind. Ang tumong mao ang pagtabang sa kinauyokan nga team sa pagpalambo sa Docker nga mas paspas. Sa wala pa ang Docker-in-Docker, ang kasagaran nga siklo sa pag-uswag ingon niini:

  • hackity hack;
  • pagtukod;
  • pagpahunong sa nagdagan nga Docker nga daemon;
  • paglansad sa usa ka bag-ong Docker daemon;
  • pagsulay;
  • balika ang cycle.

Kung gusto nimo maghimo usa ka matahum, mabag-o nga asembliya (nga mao, sa usa ka sudlanan), nan kini nahimong labi ka komplikado:

  • hackity hack;
  • siguroha nga ang usa ka nagtrabaho nga bersyon sa Docker nagdagan;
  • paghimo og bag-ong Docker nga adunay daan nga Docker;
  • hunong ang Docker nga daemon;
  • pagsugod og bag-ong Docker daemon;
  • pagsulay;
  • hunong ang bag-ong Docker nga daemon;
  • subli.

Sa pag-abut sa Docker-in-Docker, ang proseso nahimong mas simple:

  • hackity hack;
  • asembliya + paglansad sa usa ka yugto;
  • balika ang cycle.

Dili ba mas maayo kini nga paagi?

Hunahunaa pag-ayo sa dili pa gamiton ang Docker-in-Docker alang sa CI o pagsulay nga palibot

Docker-in-Docker: "Daotan"

Bisan pa, sukwahi sa popular nga pagtuo, ang Docker-in-Docker dili 100% nga mga bituon, ponies ug unicorn. Ang akong gipasabut mao nga adunay daghang mga isyu nga kinahanglan mahibal-an sa usa ka developer.

Ang usa niini may kalabotan sa LSMs (Linux security modules) sama sa AppArmor ug SELinux: kung magpadagan sa usa ka sudlanan, ang "internal Docker" mahimong mosulay sa paggamit sa mga profile sa seguridad nga magkasumpaki o makalibog sa "external Docker". Kini ang labing lisud nga problema nga sulbaron kung gisulayan ang paghiusa sa orihinal nga pagpatuman sa -privileged nga bandila. Ang akong mga pagbag-o nagtrabaho ug ang tanan nga mga pagsulay ipasa sa akong Debian nga makina ug Ubuntu nga pagsulay sa mga VM, apan kini nahagsa ug nasunog sa makina ni Michael Crosby (naa siyay Fedora sa akong nahinumduman). Dili nako mahinumduman ang eksakto nga hinungdan sa problema, apan mahimo kini tungod kay si Mike usa ka maalamon nga tawo nga nagtrabaho kauban ang SELINUX=enforce (gigamit nako ang AppArmor) ug ang akong mga pagbag-o wala mag-isip sa mga profile sa SELinux.

Docker-in-Docker: "Dautan"

Ang ikaduha nga isyu mao ang mga driver sa pagtipig sa Docker. Kung nagpadagan ka sa Docker-in-Docker, ang external Docker nagdagan sa ibabaw sa usa ka regular nga sistema sa file (EXT4, BTRFS, o bisan unsa nga naa kanimo) ug ang internal nga Docker nagdagan sa ibabaw sa usa ka copy-on-write system (AUFS, BTRFS, Device Mapper. , ug uban pa). , depende sa kung unsa ang gi-configure aron magamit ang external Docker). Naghimo kini daghang mga kombinasyon nga dili molihok. Pananglitan, dili ka makadagan sa AUFS sa ibabaw sa AUFS.

Kung gipadagan nimo ang BTRFS sa ibabaw sa BTRFS, kinahanglan kini molihok sa una, apan kung adunay mga nested subvolumes, mapakyas ang pagtangtang sa subvolume sa ginikanan. Ang module sa Device Mapper walay namespace, mao nga kung daghang mga Docker nga mga higayon ang nagpadagan niini sa parehas nga makina, silang tanan makakita (ug makaimpluwensya) sa mga imahe sa usag usa ug sa mga aparato nga backup sa sulud. Kini daotan.

Adunay mga solusyon aron masulbad ang daghan niini nga mga problema. Pananglitan, kung gusto nimo gamiton ang AUFS sa internal nga Docker, ibalik lang ang / var / lib / docker folder sa usa ka volume ug maayo ka. Gidugang ni Docker ang pipila ka mga base namespace sa mga ngalan sa target sa Device Mapper aron kung daghang mga tawag sa Docker ang nagdagan sa parehas nga makina, dili sila magtinabangay sa usag usa.

Bisan pa, ang ingon nga pag-setup dili gyud yano, ingon sa makita gikan niini mga artikulo sa dind repository sa GitHub.

Docker-in-Docker: Nagkagrabe kini

Unsa ang mahitungod sa pagtukod cache? Mahimo usab kini nga lisud. Kanunay akong gipangutana sa mga tawo "kung nagpadagan ako sa Docker-in-Docker, unsaon nako paggamit ang mga imahe nga gi-host sa akong host imbis nga ibalik ang tanan sa akong internal nga Docker"?

Ang pipila ka madasigon nga mga tawo misulay sa pagbugkos /var/lib/docker gikan sa host ngadto sa usa ka Docker-in-Docker nga sudlanan. Usahay ipaambit nila ang /var/lib/docker sa daghang mga sudlanan.

Hunahunaa pag-ayo sa dili pa gamiton ang Docker-in-Docker alang sa CI o pagsulay nga palibot
Gusto ba nimong madaot ang imong datos? Tungod kay mao gyud kini ang makadaot sa imong datos!

Ang Docker daemon tin-aw nga gidisenyo aron adunay eksklusibong pag-access sa /var/lib/docker. Wala’y lain nga kinahanglan "paghikap, pagdukdok, o pagduso" sa bisan unsang mga file sa Docker nga nahimutang sa kini nga folder.

Nganong ingon niini? Tungod kay kini ang resulta sa usa sa pinakalisud nga mga leksyon nga nakat-unan samtang nagpalambo sa dotCloud. Ang dotCloud container engine nagdagan pinaagi sa daghang mga proseso nga nag-access sa /var/lib/dotcloud nga dungan. Ang maliputon nga mga limbong sama sa pag-ilis sa atomic file (imbes sa in-place nga pag-edit), peppering code nga adunay advisory ug mandatory lock, ug uban pang mga eksperimento nga adunay luwas nga mga sistema sama sa SQLite ug BDB dili kanunay molihok. Sa dihang among gidesinyo pag-usab ang among container engine, nga sa kadugayan nahimo nga Docker, usa sa dagkong mga desisyon sa disenyo mao ang pagkonsolida sa tanang operasyon sa container ubos sa usa ka daemon aron mawagtang ang tanang walay pulos nga concurrency.

Ayaw ko masayop: kini mao ang hingpit nga posible nga sa paghimo sa usa ka butang nga maayo, kasaligan ug paspas nga naglakip sa daghang mga proseso ug modernong parallel kontrol. Apan gihunahuna namon nga mas simple ug dali ang pagsulat ug pagpadayon sa code gamit ang Docker ingon usa ra nga magdudula.

Kini nagpasabot nga kung imong ipaambit ang / var / lib / docker nga direktoryo tali sa daghang mga Docker nga mga higayon, ikaw adunay mga problema. Siyempre, mahimo kini nga molihok, labi na sa una nga mga yugto sa pagsulay. "Paminaw, Ma, makadagan ko sa ubuntu isip usa ka pantalan!" Apan sulayi ang usa ka butang nga mas komplikado, sama sa pagbira sa parehas nga imahe gikan sa duha ka lainlaing mga higayon, ug imong makita ang kalibutan nga nasunog.

Kini nagpasabot nga kung ang imong CI nga sistema mohimo sa pagtukod ug pagtukod pag-usab, sa matag higayon nga imong i-restart ang imong Docker-in-Docker nga sudlanan, imong peligro nga ihulog ang usa ka nuke sa cache niini. Dili gyud kini cool!

Pag-troubleshoot

Moatras ta. Kinahanglan ba gyud nimo ang Docker-in-Docker o gusto ba nimo nga makadagan ang Docker ug magtukod ug magpadagan sa mga sudlanan ug mga imahe gikan sa imong CI system samtang ang CI system mismo naa sa usa ka sudlanan?

Pusta ko nga kadaghanan sa mga tawo gusto sa ulahi nga kapilian, nagpasabut nga gusto nila ang usa ka sistema sa CI sama sa Jenkins nga makahimo sa pagdagan sa mga sudlanan. Ug ang pinakasayon ​​nga paagi sa pagbuhat niini mao ang pagsal-ot lang sa usa ka Docker socket sa imong CI container ug i-associate kini sa -v flag.

Sa yanong pagkasulti, kung gipadagan nimo ang imong sudlanan sa CI (Jenkins o uban pa), imbis nga mag-hack sa usa ka butang kauban ang Docker-in-Docker, sugdi kini sa linya:

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

Kini nga sudlanan aduna nay access sa Docker socket ug busa makahimo sa pagpadagan sa mga sudlanan. Gawas nga imbes magdagan ang mga sudlanan nga "bata", maglunsad kini og mga sudlanan nga "igsuon".

Sulayi kini gamit ang opisyal nga docker image (nga naglangkob sa Docker binary):

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

Kini tan-awon ug nagtrabaho sama sa Docker-in-Docker, apan dili kini Docker-in-Docker: kung kini nga sudlanan nagmugna og dugang nga mga sudlanan, kini pagabuhaton sa top-level nga Docker. Dili nimo masinati ang mga epekto sa nesting ug ang cache sa asembliya ipaambit sa daghang mga tawag.

Mubo nga sulat: Ang nangaging mga bersyon niini nga artikulo nagtambag sa pag-link sa Docker binary gikan sa host ngadto sa sudlanan. Nahimo na kini karon nga dili kasaligan tungod kay ang makina sa Docker wala na magsakup sa mga static o hapit-static nga mga librarya.

Mao nga, kung gusto nimo gamiton ang Docker gikan sa Jenkins CI, adunay 2 ka kapilian:
pag-instalar sa Docker CLI gamit ang batakang image packaging system (ie kung ang imong imahe gibase sa Debian, gamita ang .deb packages), gamit ang Docker API.

Pipila ka mga ad 🙂

Salamat sa pagpabilin kanamo. Ganahan ka ba sa among mga artikulo? Gusto nga makakita og mas makapaikag nga sulod? Suportahi kami pinaagi sa pag-order o pagrekomenda sa mga higala, cloud VPS alang sa mga developers gikan sa $4.99, usa ka talagsaon nga analogue sa mga entry-level server, nga giimbento namo alang kanimo: Ang tibuok kamatuoran bahin sa VPS (KVM) E5-2697 v3 (6 Cores) 10GB DDR4 480GB SSD 1Gbps gikan sa $19 o unsaon pagpaambit sa usa ka server? (anaa sa RAID1 ug RAID10, hangtod sa 24 ka mga core ug hangtod sa 40GB DDR4).

Dell R730xd 2 ka beses nga mas barato sa Equinix Tier IV data center sa Amsterdam? Dinhi lang 2 x Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100 TV gikan sa $199 sa Netherlands! Dell R420 - 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB - gikan sa $99! Basaha ang mahitungod sa Unsaon pagtukod sa infrastructure corp. klase sa paggamit sa Dell R730xd E5-2650 v4 server nga nagkantidad ug 9000 euros sa usa ka sentimos?

Source: www.habr.com

Idugang sa usa ka comment