Pikir sacara saksama sateuacan nganggo Docker-in-Docker pikeun CI atanapi lingkungan tés

Pikir sacara saksama sateuacan nganggo Docker-in-Docker pikeun CI atanapi lingkungan tés

Docker-in-Docker mangrupikeun lingkungan daemon Docker virtualisasi anu ngajalankeun dina wadahna sorangan pikeun ngawangun gambar wadahna. Tujuan utama nyiptakeun Docker-in-Docker nyaéta pikeun ngabantosan ngembangkeun Docker sorangan. Loba jalma make eta pikeun ngajalankeun Jenkins CI. Ieu sigana normal dina mimitina, tapi lajeng timbul masalah anu bisa dihindari ku masang Docker dina wadahna Jenkins CI. Artikel ieu ngabejaan Anjeun kumaha ngalakukeun ieu. Upami anjeun resep kana solusi akhir tanpa detil, baca bagian terakhir tulisan, "Ngarengsekeun Masalah."

Pikir sacara saksama sateuacan nganggo Docker-in-Docker pikeun CI atanapi lingkungan tés

Docker-in-Docker: "Alus"

Langkung ti dua taun ka pengker abdi nempatkeun kana Docker bandéra – hak husus jeung nulis versi mimiti dind. Tujuanana nyaéta pikeun ngabantosan tim inti ngembangkeun Docker langkung gancang. Sateuacan Docker-in-Docker, siklus pangembangan has sapertos kieu:

  • hackity hack;
  • ngawangun;
  • stopping a ngajalankeun daemon Docker;
  • ngaluncurkeun daemon Docker anyar;
  • nguji;
  • ngulang siklus.

Upami anjeun hoyong ngadamel rakitan anu tiasa diulang (nyaéta, dina wadah), teras janten langkung rumit:

  • hackity hack;
  • pastikeun yén versi kerja tina Docker dijalankeun;
  • ngawangun Docker anyar sareng Docker lami;
  • eureun Docker daemon;
  • ngamimitian daemon Docker anyar;
  • nguji;
  • ngeureunkeun daemon Docker anyar;
  • malikan deui.

Kalayan datangna Docker-in-Docker, prosésna janten langkung saderhana:

  • hackity hack;
  • assembly + peluncuran dina hiji tahap;
  • ngulang siklus.

Henteu langkung saé ku cara kieu?

Pikir sacara saksama sateuacan nganggo Docker-in-Docker pikeun CI atanapi lingkungan tés

Docker-in-Docker: "Bad"

Sanajan kitu, sabalikna mun kapercayaan popular, Docker-in-Docker teu 100% béntang, ponies na unicorns. Maksud kuring nyaéta yén aya sababaraha masalah anu kedah diémutan ku pamekar.

Salah sahijina ngeunaan LSM (modul kaamanan Linux) sapertos AppArmor sareng SELinux: nalika ngajalankeun wadahna, "Docker internal" tiasa nyobian nerapkeun profil kaamanan anu bakal konflik atanapi ngabingungkeun "Docker éksternal". Ieu mangrupikeun masalah anu paling hese pikeun direngsekeun nalika nyobian ngahijikeun palaksanaan asli bendera -privileged. parobahan kuring digawé tur sagala tés bakal lulus dina mesin Debian kuring jeung VMs test Ubuntu, tapi maranéhna bakal ngadat jeung kaduruk dina mesin Michael Crosby (anjeunna Fedora sakumaha Abdi ngelingan). Abdi teu tiasa apal cukang lantaran pasti tina masalah, tapi bisa jadi sabab Mike mangrupakeun bodo wijaksana anu gawéna kalayan SELINUX = ngalaksanakeun (I dipaké AppArmor) sarta parobahan kuring teu nyandak profil SELinux kana rekening.

Docker-in-Docker: "Jahat"

Masalah anu kadua nyaéta sareng supir panyimpen Docker. Nalika anjeun ngajalankeun Docker-in-Docker, Docker éksternal dijalankeun dina luhureun sistem file biasa (EXT4, BTRFS, atanapi naon waé anu anjeun gaduh) sareng Docker internal dijalankeun dina luhureun sistem salinan-on-tulis (AUFS, BTRFS, Device Mapper. , jsb). , gumantung kana naon anu dikonpigurasikeun pikeun ngagunakeun Docker éksternal). Ieu nyiptakeun seueur kombinasi anu moal jalan. Contona, anjeun moal tiasa ngajalankeun AUFS di luhur AUFS.

Upami anjeun ngajalankeun BTRFS dina luhureun BTRFS, éta kedah dianggo dina mimitina, tapi upami aya subvolume nested, ngahapus subvolume indungna bakal gagal. Modul Device Mapper henteu gaduh namespace, janten upami sababaraha instansi Docker ngajalankeun éta dina mesin anu sami, aranjeunna sadayana bakal tiasa ningali (sareng pangaruh) gambar-gambar dina silih sareng dina alat cadangan wadahna. Ieu goréng.

Aya workarounds pikeun ngajawab loba masalah ieu. Contona, upami anjeun hoyong nganggo AUFS dina Docker internal, ngan ukur polder / var / lib / docker kana volume sareng anjeun bakal saé. Docker parantos nambihan sababaraha ruang ngaran dasar kana nami target Device Mapper supados upami sababaraha sauran Docker dijalankeun dina mesin anu sami, aranjeunna moal ngaléngkah.

Nanging, pangaturan sapertos kitu henteu saderhana, sapertos anu tiasa ditingali tina ieu artikel dina gudang dind on GitHub.

Docker-in-Docker: Éta parah

Kumaha upami ngawangun cache? Ieu ogé bisa jadi rada hese. Jalma sering naroskeun ka kuring "upami kuring ngajalankeun Docker-in-Docker, kumaha kuring tiasa nganggo gambar anu di-host dina host kuring tinimbang narik sadayana deui kana Docker internal kuring"?

Sababaraha urang enterprising geus nyoba ngabeungkeut / var / lib / docker ti host kana wadahna Docker-in-Docker. Kadang-kadang aranjeunna bagikeun /var/lib/docker sareng sababaraha wadah.

Pikir sacara saksama sateuacan nganggo Docker-in-Docker pikeun CI atanapi lingkungan tés
Naha anjeun badé ngaruksak data anjeun? Kusabab ieu kahayang bakal ngaruksak data anjeun!

Daemon Docker jelas dirancang pikeun gaduh aksés ekslusif kana /var/lib/docker. Henteu aya anu sanés kedah "ngarampa, nyodok, atanapi ngadorong" file Docker anu aya dina folder ieu.

Naha jadi kieu? Kusabab ieu mangrupikeun hasil tina salah sahiji pelajaran anu paling hese diajar nalika ngembangkeun dotCloud. Mesin wadah dotCloud dijalankeun ku sababaraha prosés ngaksés /var/lib/dotcloud sakaligus. Trik licik sapertos ngagantian file atom (gaganti éditan di tempat), kode peppering sareng konci piwuruk sareng wajib, sareng ékspérimén sanés sareng sistem anu aman sapertos SQLite sareng BDB henteu salawasna jalan. Nalika kami ngadesain ulang mesin wadahna, anu antukna janten Docker, salah sahiji kaputusan desain anu ageung nyaéta pikeun ngahijikeun sadaya operasi wadah dina hiji daemon pikeun ngaleungitkeun sagala omong kosong.

Entong lepat: sapinuhna mungkin pikeun ngadamel anu saé, dipercaya sareng gancang anu ngalibatkeun sababaraha prosés sareng kontrol paralel modern. Tapi kami pikir éta langkung saderhana sareng langkung gampang nyerat sareng ngajaga kode nganggo Docker salaku hiji-hijina pamuter.

Ieu ngandung harti yén lamun babagi diréktori /var/lib/docker antara sababaraha instansi Docker, anjeun bakal boga masalah. Tangtosna, ieu tiasa jalan, khususna dina tahap awal tés. "Dengekeun, Ma, abdi tiasa ngajalankeun ubuntu salaku docker!" Tapi cobian hal anu langkung kompleks, sapertos narik gambar anu sami tina dua instansi anu béda, sareng anjeun bakal ningali dunya kaduruk.

Ieu ngandung harti yén upami sistem CI anjeun ngalaksanakeun ngawangun sareng ngawangun deui, unggal waktos anjeun ngabalikan deui wadahna Docker-in-Docker anjeun, anjeun résiko ngaluarkeun nuke kana cache na. Ieu teu tiis pisan!

alamat

Hayu urang mundur salengkah. Naha anjeun leres-leres peryogi Docker-in-Docker atanapi anjeun ngan ukur hoyong tiasa ngajalankeun Docker sareng ngawangun sareng ngajalankeun wadah sareng gambar tina sistem CI anjeun bari sistem CI sorangan aya dina wadahna?

Atuh bet paling jalma hayang pilihan dimungkinkeun, hartina maranéhna rék sistem CI kawas Jenkins bisa ngajalankeun peti. Sareng cara panggampangna pikeun ngalakukeun ieu nyaéta ngan saukur nyelapkeun stop kontak Docker kana wadahna CI anjeun sareng ngahubungkeun éta sareng bandéra -v.

Kantun nempatkeun, nalika anjeun ngajalankeun wadahna CI anjeun (Jenkins atanapi anu sanés), tibatan hacking hiji hal sareng Docker-in-Docker, mimitian ku garis:

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

Wadah ieu ayeuna bakal gaduh aksés kana stop kontak Docker sahingga tiasa ngajalankeun wadahna. Iwal ti ngajalankeun "anak" wadahna, éta bakal ngajalankeun "duduluran" wadahna.

Coba ieu nganggo gambar docker resmi (anu ngandung binér Docker):

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

Sigana sareng jalan sapertos Docker-in-Docker, tapi sanés Docker-in-Docker: nalika wadah ieu nyiptakeun wadah tambahan, aranjeunna bakal didamel dina Docker tingkat luhur. Anjeun moal ngalaman efek samping tina nyarang sareng cache assembly bakal dibagikeun dina sababaraha telepon.

Catetan: Versi sateuacana tina tulisan ieu nyarankeun ngahubungkeun binér Docker tina host kana wadahna. Ieu ayeuna parantos teu tiasa dipercaya sabab mesin Docker henteu deui nyertakeun perpustakaan statik atanapi caket statik.

Janten, upami anjeun hoyong nganggo Docker ti Jenkins CI, anjeun gaduh 2 pilihan:
masang Docker CLI ngagunakeun sistem bungkusan gambar dasar (ie lamun gambar anjeun dumasar kana Debian, pamakéan .deb bungkusan), ngagunakeun Docker API.

Sababaraha iklan 🙂

Hatur nuhun pikeun tetep sareng kami. Naha anjeun resep artikel kami? Hoyong ningali eusi anu langkung narik? Dukung kami ku cara nempatkeun pesenan atanapi nyarankeun ka babaturan, cloud VPS pikeun pamekar ti $4.99, analog unik tina server tingkat éntri, anu diciptakeun ku kami pikeun anjeun: Sakabeh bebeneran ngeunaan VPS (KVM) E5-2697 v3 (6 Cores) 10GB DDR4 480GB SSD 1Gbps ti $ 19 atanapi kumaha babagi server a? (sadia kalawan RAID1 na RAID10, nepi ka 24 cores sarta nepi ka 40GB DDR4).

Dell R730xd 2 kali langkung mirah dina puseur data Equinix nagara golongan IV di Amsterdam? Ngan di dieu 2 x Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100 TV ti $199 di Walanda! Dell R420 - 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB - ti $99! Baca ngeunaan Kumaha ngawangun Infrastruktur Corp. kelas kalawan pamakéan Dell R730xd E5-2650 v4 server patut 9000 euro pikeun Penny a?

sumber: www.habr.com

Tambahkeun komentar