Docker-in-Docker se yon anviwònman demon Virtualized Docker ki kouri nan veso a li menm pou konstwi imaj veso. Objektif prensipal kreye Docker-in-Docker se te ede devlope Docker tèt li. Anpil moun sèvi ak li pou kouri Jenkins CI. Sa a sanble nòmal nan premye, men Lè sa a, pwoblèm rive ki ka evite lè w enstale Docker nan yon veso Jenkins CI. Atik sa a di ou kijan pou fè sa. Si w enterese nan solisyon final la san detay, jis li dènye seksyon atik la, "Rezoud pwoblèm nan."
Docker-in-Docker: "Bon"
Plis pase de zan de sa mwen mete nan Docker
- hackity Hack;
- bati;
- kanpe yon demon Docker k ap kouri;
- lanse yon nouvo demon Docker;
- tès;
- repete sik la.
Si ou te vle fè yon bèl, asanble repwodiktif (ki se, nan yon veso), Lè sa a, li te vin pi konplike:
- hackity Hack;
- asire w ke yon vèsyon k ap travay nan Docker ap kouri;
- bati nouvo Docker ak ansyen Docker;
- sispann Docker demon;
- kòmanse yon nouvo demon Docker;
- tès;
- sispann nouvo demon Docker;
- repete.
Avèk avenman Docker-in-Docker, pwosesis la vin pi senp:
- hackity Hack;
- asanble + lanse nan yon sèl etap;
- repete sik la.
Èske li pa pi bon fason sa a?
Docker-in-Docker: "Move"
Sepandan, kontrèman ak kwayans popilè, Docker-in-Docker se pa 100% zetwal, pone ak likorn. Ki sa mwen vle di se ke gen plizyè pwoblèm ke yon pwomotè bezwen yo dwe okouran de.
Youn nan yo konsène LSM (modil sekirite Linux) tankou AppArmor ak SELinux: lè w ap kouri yon veso, "Docker entèn la" ka eseye aplike pwofil sekirite ki pral konfli oswa konfonn "Docker ekstèn lan". Sa a se pwoblèm ki pi difisil pou rezoud lè w ap eseye rantre aplikasyon orijinal la nan drapo a privilejye. Chanjman mwen yo te travay ak tout tès yo ta pase sou machin Debian mwen an ak VM tès Ubuntu, men yo ta aksidan ak boule sou machin Michael Crosby a (li te gen Fedora jan mwen sonje). Mwen pa ka sonje kòz egzak pwoblèm nan, men li ka te paske Mike se yon nèg ki gen bon konprann ki travay ak SELINUX=enforce (mwen te itilize AppArmor) ak chanjman mwen yo pa t 'pran pwofil SELinux an kont.
Docker-in-Docker: "Sa ki mal"
Dezyèm pwoblèm nan se ak chofè depo Docker. Lè ou kouri Docker-in-Docker, Docker ekstèn kouri sou tèt yon sistèm dosye regilye (EXT4, BTRFS, oswa kèlkeswa sa ou genyen) ak Docker entèn kouri sou tèt yon sistèm kopi-sou-ekri (AUFS, BTRFS, Device Mapper). , elatriye). , tou depann de sa ki configuré pou itilize ekstèn Docker). Sa a kreye anpil konbinezon ki pa pral travay. Pa egzanp, ou p'ap ka kouri AUFS sou tèt AUFS.
Si ou kouri BTRFS sou tèt BTRFS, li ta dwe travay nan premye, men yon fwa gen enbrike subvolumes, efase subvolume paran an ap echwe. Modil la Device Mapper pa gen okenn espas non, kidonk si plizyè egzanp Docker ap kouri li sou menm machin nan, yo tout pral kapab wè (ak enfliyanse) imaj yo youn sou lòt ak sou aparèy backup veso yo. Sa a se move.
Gen solisyon pou rezoud anpil nan pwoblèm sa yo. Pou egzanp, si ou vle sèvi ak AUFS nan Docker entèn, jis vire folder nan /var/lib/docker nan yon volim epi ou pral byen. Docker te ajoute kèk espas non baz nan non sib Device Mapper pou ke si plizyè apèl Docker ap kouri sou menm machin nan, yo pa pral mache sou youn ak lòt.
Sepandan, konfigirasyon sa a se pa nan tout senp, jan yo ka wè nan sa yo
Docker-in-Docker: Li vin pi mal
Ki sa ki sou kachèt la bati? Sa a kapab tou byen difisil. Moun yo souvan mande m "si mwen ap kouri Docker-in-Docker, ki jan mwen ka itilize imaj ki anime sou lame mwen an olye pou yo rale tout bagay tounen nan Docker entèn mwen an"?
Gen kèk moun inisyateur ki te eseye mare /var/lib/docker soti nan lame a nan yon veso Docker-in-Docker. Pafwa yo pataje /var/lib/docker ak plizyè resipyan.
Ou vle koripsyon done ou yo? Paske sa a se egzakteman sa ki pral domaje done ou!
Daemon Docker la te klèman fèt pou gen aksè eksklizif nan /var/lib/docker. Pa gen lòt bagay ki ta dwe "manyen, pike, oswa pouse" nenpòt ki dosye Docker ki sitiye nan katab sa a.
Poukisa se konsa? Paske sa a se rezilta youn nan leson ki pi difisil yo aprann pandan y ap devlope dotCloud. Motè veso dotCloud la te kouri lè li te gen plizyè pwosesis aksè nan /var/lib/dotcloud ansanm. Ke trik nouvèl atizanal tankou ranplasman fichye atomik (olye pou yo koreksyon an plas), kòd peppering ak kadna konsiltatif ak obligatwa, ak lòt eksperyans ak sistèm sekirite tankou SQLite ak BDB pa t 'toujou travay. Lè nou t ap redesign motè veso nou an, ki te vin tounen Docker, youn nan gwo desizyon konsepsyon yo se te konsolide tout operasyon veso yo anba yon sèl demon pou elimine tout istwa san sans.
Pa fè m mal: li se antyèman posib fè yon bagay bon, serye ak rapid ki enplike pwosesis miltip ak kontwòl paralèl modèn. Men, nou panse li pi senp ak pi fasil pou ekri ak kenbe kòd lè l sèvi avèk Docker kòm jwè a sèlman.
Sa vle di ke si ou pataje anyè /var/lib/docker ant plizyè ka Docker, w ap gen pwoblèm. Natirèlman, sa a ka travay, espesyalman nan premye etap yo nan tès la. "Koute, Ma, mwen ka kouri ubuntu kòm yon docker!" Men, eseye yon bagay ki pi konplèks, tankou rale menm imaj la nan de ka diferan, epi ou pral wè mond lan boule.
Sa vle di ke si sistèm CI ou fè bati ak rekonstwi, chak fwa ou rekòmanse veso Docker-in-Docker ou a, ou riske jete yon nuke nan kachèt li. Sa pa fre ditou!
Solisyon an
Ann fè yon pa dèyè. Èske ou reyèlman bezwen Docker-in-Docker oswa èske ou jis vle pou kapab kouri Docker ak bati ak kouri resipyan ak imaj ki soti nan sistèm CI ou pandan ke sistèm sa a CI tèt li nan yon veso?
Mwen parye pifò moun vle opsyon nan lèt, sa vle di yo vle yon sistèm CI tankou Jenkins pou kapab kouri kontenè. Ak fason ki pi fasil pou fè sa se tou senpleman mete yon priz Docker nan veso CI ou a epi asosye li ak drapo a -v.
Senpleman mete, lè ou kouri veso CI ou a (Jenkins oswa lòt), olye pou yo pirate yon bagay ansanm ak Docker-in-Docker, kòmanse li ak liy lan:
docker run -v /var/run/docker.sock:/var/run/docker.sock ...
Veso sa a pral kounye a gen aksè a priz Docker a epi kidonk li pral kapab kouri resipyan yo. Eksepte ke olye pou yo kouri resipyan "pitit", li pral lanse resipyan "frè ak sè".
Eseye sa a lè l sèvi avèk imaj Docker ofisyèl la (ki gen binè Docker la):
docker run -v /var/run/docker.sock:/var/run/docker.sock
-ti docker
Li sanble ak travay tankou Docker-in-Docker, men li pa Docker-in-Docker: lè veso sa a kreye resipyan adisyonèl, yo pral kreye nan Docker nan nivo siperyè. Ou pa pral fè eksperyans efè segondè yo nan nidifikasyon ak kachèt asanble a pral pataje atravè plizyè apèl.
Remak: Vèsyon anvan atik sa a konseye lyen binè Docker soti nan lame a nan veso a. Sa a te vin tounen enfidèl kòm motè Docker la pa kouvri bibliyotèk estatik oswa pre-estatik ankò.
Se konsa, si ou vle sèvi ak Docker soti nan Jenkins CI, ou gen 2 opsyon:
enstale Docker CLI lè l sèvi avèk sistèm anbalaj imaj debaz la (sa vle di si imaj ou a baze sou Debian, sèvi ak pakè .deb), lè l sèvi avèk API Docker.
Kèk piblisite 🙂
Mèsi paske w rete avèk nou. Ou renmen atik nou yo? Vle wè plis kontni enteresan? Sipòte nou pa mete yon lòd oswa rekòmande pou zanmi,
Dell R730xd 2 fwa pi bon mache nan sant done Equinix Tier IV nan Amstèdam? Sèlman isit la
Sous: www.habr.com