Hvernig ég rak Docker inni í Docker og hvað kom út úr því

Hæ allir! Í hans Fyrri grein, Ég lofaði að tala um að keyra Docker í Docker og hagnýtu þætti þess að nota þessa lexíu. Það er kominn tími til að standa við loforð þitt. Reyndur devopser mun líklega mótmæla því að þeir sem þurfa Docker inni í Docker áframsenda einfaldlega Docker púkainnstunguna frá hýslinum inn í gáminn og það dugar í 99% tilvika. En ekki flýta þér að henda kökum í mig, því við munum tala um að keyra Docker í Docker. Þessi lausn hefur mörg möguleg forrit og þessi grein fjallar um eina þeirra, svo hallaðu þér aftur og réttaðu handleggina fyrir framan þig.

Hvernig ég rak Docker inni í Docker og hvað kom út úr því

Byrja

Þetta byrjaði allt á rigningarlegu septemberkvöldi þegar ég var að þrífa vélina sem ég leigði fyrir $5 á Digital Ocean, sem var frosin vegna þess að Docker hafði fyllt öll 24 gígabæt af tiltæku diskplássi með myndum sínum og ílátum. Kaldhæðnin var að allar þessar myndir og ílát voru tímabundin og voru aðeins nauðsynleg til að prófa frammistöðu forritsins míns í hvert skipti sem ný útgáfa af bókasafni eða ramma var gefin út. Ég reyndi að skrifa skeljaforskriftir og setja upp cron áætlun til að hreinsa upp sorp, en það hjálpaði ekki: í hvert skipti sem það endaði óhjákvæmilega með því að diskpláss netþjónsins míns var étið upp og þjónninn hékk (í besta falli). Á einhverjum tímapunkti rakst ég á grein um hvernig á að keyra Jenkins í gámi og hvernig það getur búið til og eytt byggingarleiðslum í gegnum docker púka fals sem er áframsend inn í það. Mér líkaði hugmyndin, en ég ákvað að ganga lengra og reyna að gera tilraunir með að keyra Docker beint inni í Docker. Á þeim tíma fannst mér það algjörlega rökrétt lausn að hlaða niður Docker myndum og búa til gáma fyrir öll forritin sem ég þurfti til að prófa inni í öðrum gámi (köllum það sviðsetningarílát). Hugmyndin var að setja af stað sviðsetningargám með -rm fánanum sem eyðir sjálfkrafa öllum gámnum og öllu innihaldi hans þegar það er stöðvað. Ég fiktaði í Docker myndinni frá Docker sjálfum (https://hub.docker.com/_/docker), en það reyndist of fyrirferðarmikið og ég náði aldrei að fá það til að virka eins og ég þurfti og ég vildi fara alla leið sjálfur.

Æfðu þig. Keilur

Ég lagði upp með að láta gáminn virka eins og ég þurfti og hélt áfram tilraunum mínum, sem leiddi af sér ógrynni af brum. Niðurstaðan af sjálfspyntingu minni var eftirfarandi reiknirit:

  1. Við ræsum Docker ílátið í gagnvirkum ham.

    docker run --privileged -it docker:18.09.6

    Gefðu gaum að útgáfu ílátsins, stígðu til hægri eða vinstri og DinD þinn breytist í grasker. Reyndar brotna hlutirnir nokkuð oft þegar ný útgáfa er gefin út.
    Við verðum strax að komast inn í skelina.

  2. Við erum að reyna að komast að því hvaða gámar eru í gangi (Svar: enginn), en keyrum samt skipunina:

    docker ps

    Þú verður svolítið hissa, en það kemur í ljós að Docker púkinn er ekki einu sinni í gangi:

    error during connect: Get http://docker:2375/v1.40/containers/json: dial tcp: lookup docker on 
    192.168.65.1:53: no such host

  3. Við skulum keyra það sjálf:

    dockerd &

    Önnur óþægileg óvart:

    failed to start daemon: Error initializing network controller: error obtaining controller instance: failed 
    to create NAT chain DOCKER: Iptables not found

  4. Settu upp iptables og bash pakkana (allt er skemmtilegra að vinna í bash en í sh):

    apk add --no-cache iptables bash

  5. Við skulum hefja bash. Loksins erum við komin aftur í venjulega skel

  6. Við skulum reyna að ræsa Docker aftur:

    dockerd &

    Við ættum að sjá langt blað af annálum sem endar á:

    INFO[2019-11-25T19:51:19.448080400Z] Daemon has completed initialization          
    INFO[2019-11-25T19:51:19.474439300Z] API listen on /var/run/docker.sock

  7. Ýttu á Enter. Við erum aftur komin í bashið.

Héðan í frá getum við reynt að ræsa aðra gáma inni í Docker gámnum okkar, en hvað ef við viljum ræsa annan Docker gám inni í Docker gámnum okkar eða eitthvað fer úrskeiðis og gámurinn hrynur? Byrjaðu upp á nýtt.

Eigið DinD gámur og nýjar tilraunir

Hvernig ég rak Docker inni í Docker og hvað kom út úr því
Til að forðast að endurtaka ofangreind skref aftur og aftur, bjó ég til minn eigin DinD ílát:

https://github.com/alekslitvinenk/dind

Virka DinD lausnin gaf mér möguleika á að keyra Docker inni í Docker afturkvæmt og gera ævintýralegri tilraunir.
Ég ætla að lýsa einni slíkri (vel heppnuðu) tilraun með að keyra MySQL og Nodejs núna.
Þeir óþolinmóðustu geta séð hvernig þetta var hér

Svo skulum byrja:

  1. Við ræsum DinD í gagnvirkum ham. Í þessari útgáfu af DinD þurfum við að kortleggja handvirkt allar hafnir sem barnagámarnir okkar geta notað (ég er nú þegar að vinna í þessu)

    docker run --privileged -it 
    -p 80:8080 
    -p 3306:3306 
    alekslitvinenk/dind

    Við komumst inn í bashið, þaðan sem við getum strax byrjað að sjósetja barnagáma.

  2. Ræstu MySQL:

    docker run --name mysql -e MYSQL_ROOT_PASSWORD=strongpassword -d -p 3306:3306 mysql

  3. Við tengjumst gagnagrunninum á sama hátt og við myndum tengjast honum á staðnum. Við skulum ganga úr skugga um að allt virki.

  4. Ræstu annan ílátið:

    docker run -d --rm -p 8080:8080 alekslitvinenk/hello-world-nodejs-server

    Vinsamlegast athugaðu að kortlagning hafnar verður nákvæmlega 8080:8080, þar sem við höfum þegar varpað höfn 80 frá hýsilnum yfir í móðurgáminn á höfn 8080.

  5. Við förum á localhost í vafranum, vertu viss um að þjónninn svari „Halló heimur!“

Í mínu tilviki reyndist tilraunin með hreiðra Docker gáma vera nokkuð jákvæð og ég mun halda áfram að þróa verkefnið og nota það til sviðsetningar. Mér sýnist þetta vera miklu léttari lausn en Kubernetes og Jenkins X. En þetta er huglæg skoðun mín.

Ég held að það sé allt fyrir grein dagsins. Í næstu grein mun ég lýsa nánar tilraunum með að keyra Docker endurkvæmt í Docker og festa möppur djúpt í hreiður ílát.

PS Ef þér finnst þetta verkefni gagnlegt, vinsamlegast gefðu því stjörnu á GitHub, gafflaðu því og segðu vinum þínum frá.

Breyta1 Leiðréttar villur, einbeitti sér að 2 myndböndum

Heimild: www.habr.com

Bæta við athugasemd