Jinsi nilivyoendesha Docker ndani ya Docker na nini kilitoka ndani yake

Salaam wote! Kwake makala iliyopita, Niliahidi kuzungumza juu ya kuendesha Docker katika Docker na vipengele vya vitendo vya kutumia somo hili. Ni wakati wa kutimiza ahadi yako. Kisambazaji chenye uzoefu labda kitapinga kwamba wale wanaohitaji Docker ndani ya Docker wanasambaza tu soketi ya daemon ya Docker kutoka kwa mwenyeji hadi kwenye kontena na hii itatosha katika 99% ya kesi. Lakini usikimbilie kunitupia kuki, kwa sababu tutazungumza juu ya kuendesha Docker ndani ya Docker. Suluhisho hili lina programu nyingi zinazowezekana na nakala hii inahusu mmoja wao, kwa hivyo kaa nyuma na unyooshe mikono yako mbele yako.

Jinsi nilivyoendesha Docker ndani ya Docker na nini kilitoka ndani yake

mwanzo

Yote ilianza jioni ya Septemba yenye mvua nilipokuwa nikisafisha mashine niliyokodisha kwa $5 kwenye Bahari ya Dijiti, ambayo ilikuwa imeganda kutokana na ukweli kwamba Docker alikuwa amejaza gigabytes zote 24 za nafasi ya disk na picha zake na vyombo. Jambo la kushangaza lilikuwa kwamba picha na kontena hizi zote zilikuwa za muda mfupi na zilihitajika tu kujaribu utendakazi wa programu yangu kila wakati toleo jipya la maktaba au mfumo lilipotolewa. Nilijaribu kuandika maandishi ya ganda na kusanidi ratiba ya cron ya kusafisha takataka, lakini haikusaidia: kila wakati iliisha na nafasi ya diski ya seva yangu kuliwa na seva kunyongwa (bora). Wakati fulani, niligundua nakala kuhusu jinsi ya kuendesha Jenkins kwenye kontena na jinsi inaweza kuunda na kufuta bomba za ujenzi kupitia tundu la daemon la docker lililotumwa ndani yake. Nilipenda wazo hilo, lakini niliamua kwenda mbali zaidi na kujaribu kujaribu kuendesha Docker moja kwa moja ndani ya Docker. Wakati huo, ilionekana kwangu suluhisho la kimantiki kabisa kupakua picha za Docker na kuunda vyombo vya programu zote ambazo nilihitaji kwa majaribio ndani ya chombo kingine (wacha tuite chombo cha kuweka). Wazo lilikuwa ni kuanzisha kontena iliyo na bendera ya -rm, ambayo hufuta kiotomatiki kontena nzima na yaliyomo ndani yake wakati imesimamishwa. Nilicheza na picha ya Docker kutoka Docker yenyewe (https://hub.docker.com/_/docker), lakini iligeuka kuwa ngumu sana na sikuwahi kufanikiwa kuifanya ifanye kazi jinsi nilivyohitaji na nilitaka kwenda mwenyewe.

Fanya mazoezi. Koni

Niliamua kufanya kontena lifanye kazi jinsi nilivyohitaji na nikaendelea na majaribio yangu, ambayo yalisababisha maelfu ya buds. Matokeo ya kujitesa kwangu yalikuwa algorithm ifuatayo:

  1. Tunazindua chombo cha Docker katika hali ya maingiliano.

    docker run --privileged -it docker:18.09.6

    Zingatia toleo la chombo, piga hatua kulia au kushoto na DinD yako inageuka kuwa malenge. Kwa kweli, mambo huvunjika mara nyingi wakati toleo jipya linatolewa.
    Lazima tuingie kwenye ganda mara moja.

  2. Tunajaribu kujua ni vyombo gani vinavyoendesha (Jibu: hakuna), lakini wacha tuendeshe amri:

    docker ps

    Utashangaa kidogo, lakini inabadilika kuwa daemon ya Docker haifanyi kazi hata:

    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. Wacha tuiendeshe wenyewe:

    dockerd &

    Mshangao mwingine usio na furaha:

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

  4. Sakinisha iptables na vifurushi vya bash (kila kitu ni cha kupendeza zaidi kufanya kazi kwa bash kuliko sh):

    apk add --no-cache iptables bash

  5. Wacha tuzindue bash. Hatimaye tumerudi kwenye ganda la kawaida

  6. Wacha tujaribu kuendesha Docker tena:

    dockerd &

    Tunapaswa kuona karatasi ndefu ya magogo inayoishia na:

    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. Bonyeza Enter. Tumerudi kwenye bash.

Kuanzia sasa na kuendelea, tunaweza kujaribu kuzindua vyombo vingine ndani ya kontena letu la Docker, lakini vipi ikiwa tunataka kuzindua kontena nyingine ya Docker ndani ya kontena letu la Docker au kitu kitaenda vibaya na kontena kuharibika? Anza tena.

Mwenyewe chombo cha DinD na majaribio mapya

Jinsi nilivyoendesha Docker ndani ya Docker na nini kilitoka ndani yake
Ili kuzuia kurudia hatua zilizo hapo juu tena na tena, niliunda chombo changu cha DinD:

https://github.com/alekslitvinenk/dind

Suluhisho la kufanya kazi la DinD lilinipa uwezo wa kuendesha Docker ndani ya Docker kwa kujirudia na kufanya majaribio zaidi ya adventurous.
Nitaelezea jaribio moja kama (lililofanikiwa) la kuendesha MySQL na Nodejs sasa.
Wale wasio na subira wanaweza kuona jinsi ilivyokuwa hapa

Kwa hivyo, wacha tuanze:

  1. Tunazindua DinD katika hali ya maingiliano. Katika toleo hili la DinD, tunahitaji kupanga mwenyewe bandari zote ambazo kontena zetu za watoto zinaweza kutumia (tayari ninashughulikia hili)

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

    Tunaingia kwenye bash, kutoka ambapo tunaweza kuanza mara moja kuzindua vyombo vya watoto.

  2. Zindua MySQL:

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

  3. Tunaunganisha kwenye hifadhidata kwa njia sawa na vile tungeunganisha nayo ndani ya nchi. Hebu tuhakikishe kuwa kila kitu kinafanya kazi.

  4. Zindua chombo cha pili:

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

    Tafadhali kumbuka kuwa ramani ya bandari itakuwa haswa 8080:8080, kwa kuwa tayari tumepanga bandari 80 kutoka seva pangishi hadi kontena kuu hadi bandari 8080.

  5. Tunaenda kwa mwenyeji kwenye kivinjari, hakikisha kuwa seva inajibu "Hujambo Ulimwengu!"

Kwa upande wangu, majaribio ya vyombo vya Docker vilivyowekwa kiota yaligeuka kuwa chanya kabisa na nitaendelea kukuza mradi huo na kuutumia kwa utengenezaji. Inaonekana kwangu kuwa hii ni suluhisho nyepesi zaidi kuliko Kubernetes na Jenkins X. Lakini hii ni maoni yangu ya kibinafsi.

Nadhani hiyo ni yote kwa makala ya leo. Katika nakala inayofuata nitaelezea kwa undani zaidi majaribio ya kuendesha Docker kwa kujirudia katika Docker na saraka za kuweka ndani ndani ya vyombo vilivyowekwa.

PS Iwapo unaona mradi huu kuwa muhimu, tafadhali upe nyota kwenye GitHub, uma na uwaambie marafiki zako.

Hariri1 Makosa yaliyosahihishwa, yaliyolenga video 2

Chanzo: mapenzi.com

Kuongeza maoni