Hoe't ik Docker binnen Docker rûn en wat der út kaam

Hoi allegearre! Yn syn foarige artikel, Ik beloofde te praten oer it útfieren fan Docker yn Docker en de praktyske aspekten fan it brûken fan dizze les. It is tiid om jo belofte te hâlden. In betûfte devopser sil wierskynlik beswier meitsje dat dejingen dy't Docker nedich binne yn Docker gewoan de Docker-daemon-socket fan 'e host nei de kontener trochstjoere en dit sil genôch wêze yn 99% fan 'e gefallen. Mar haast net om koekjes nei my te smiten, om't wy sille prate oer it feitlik rinnen fan Docker yn Docker. Dizze oplossing hat in protte mooglike tapassingen en dit artikel giet oer ien fan har, dus sit werom en rjochtsje jo earms foar jo.

Hoe't ik Docker binnen Docker rûn en wat der út kaam

Thús

It begon allegear op in reinige septimberjûn doe't ik de masine skjinmakke dy't ik hierde foar $ 5 op Digital Ocean, dy't beferzen wie troch it feit dat Docker alle 24 gigabytes oan beskikbere skiifromte hie folbrocht mei syn ôfbyldings en konteners. De irony wie dat al dizze ôfbyldings en konteners transient wiene en allinich nedich wiene om de prestaasjes fan myn applikaasje te testen elke kear as in nije ferzje fan in bibleteek of ramt waard frijlitten. Ik besocht shell-skripts te skriuwen en in cron-skema op te setten om jiskefet op te romjen, mar it holp net: elke kear einige it ûnûntkomber mei dat de skiifromte fan myn tsjinner opiten waard en de tsjinner hong (op syn bêst). Op in stuit kaam ik in artikel oer hoe't jo Jenkins yn in kontener útfiere kinne en hoe't it buildpipelines kin oanmeitsje en wiskje fia in docker-daemon-socket dy't deryn trochstjoerd is. Ik fûn it idee leuk, mar ik besleat fierder te gean en besykje te eksperimintearjen mei direkt Docker yn Docker te rinnen. Op dat stuit like it my in folslein logyske oplossing om Docker-ôfbyldings te downloaden en konteners te meitsjen foar alle applikaasjes dy't ik nedich wie foar testen yn in oare kontener (litte wy it in staging-container neame). It idee wie om in staging-kontener te begjinnen mei de flagge -rm, dy't automatysk de hiele kontener en al syn ynhâld wisket as it stoppe wurdt. Ik tink mei de Docker-ôfbylding fan Docker sels (https://hub.docker.com/_/docker), mar it blykte te omslachtig te wêzen en it is my noait slagge om it sa te wurkjen te krijen dat ik it nedich hie en ik woe sels hielendal gean.

Oefenje. Kegels

Ik sette út om de kontener te meitsjen sa't ik nedich wie en gie myn eksperiminten troch, wat resultearre yn in myriade fan knoppen. It resultaat fan myn selsmarteling wie it folgjende algoritme:

  1. Wy lansearje de Docker-kontener yn ynteraktive modus.

    docker run --privileged -it docker:18.09.6

    Jou omtinken oan de ferzje fan 'e kontener, stap rjochts of lofts en jo DinD feroaret yn in pompoen. Eins brekke dingen frij faak as in nije ferzje wurdt útbrocht.
    Wy moatte daliks yn 'e skulp.

  2. Wy besykje út te finen hokker konteners rinne (Antwurd: gjin), mar litte wy it kommando dochs útfiere:

    docker ps

    Jo sille in bytsje ferrast wêze, mar it docht bliken dat de Docker-daemon net iens rint:

    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. Litte wy it sels útfiere:

    dockerd &

    In oare onaangename ferrassing:

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

  4. Ynstallearje de iptables en bash-pakketten (alles is nofliker om te wurkjen yn bash dan yn sh):

    apk add --no-cache iptables bash

  5. Litte wy bash begjinne. Uteinlik binne wy ​​wer yn 'e gewoane shell

  6. Litte wy besykje Docker nochris út te fieren:

    dockerd &

    Wy moatte in lang blêd mei logs sjen dy't einiget mei:

    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. Druk op Enter. Wy binne werom yn 'e bash.

Fanôf no kinne wy ​​besykje oare konteners yn ús Docker-kontener te lansearjen, mar wat as wy in oare Docker-kontener wolle lansearje yn ús Docker-kontener of giet der wat mis en de kontener crasht? Begjin op 'e nij.

Eigen DinD container en nije eksperiminten

Hoe't ik Docker binnen Docker rûn en wat der út kaam
Om foar te kommen dat de boppesteande stappen hieltyd wer werhelle wurde, haw ik myn eigen DinD-container makke:

https://github.com/alekslitvinenk/dind

De wurkjende DinD-oplossing joech my de mooglikheid om Docker rekursyf binnen Docker út te fieren en aventoerlike eksperiminten te dwaan.
Ik sil sa'n (suksesfol) eksperimint beskriuwe mei it útfieren fan MySQL en Nodejs no.
De meast ûngeduldige kinne sjen hoe't it hjir wie

Dat litte wy begjinne:

  1. Wy lansearje DinD yn ynteraktive modus. Yn dizze ferzje fan DinD moatte wy alle havens manuell yn kaart bringe dy't ús bernecontainers kinne brûke (ik wurkje hjir al oan)

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

    Wy komme yn 'e bash, wêrfan't wy daliks begjinne kinne mei it lansearjen fan bernekonteners.

  2. Start MySQL:

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

  3. Wy ferbine mei de databank op deselde manier as wy dêr lokaal mei ferbine. Lit ús soargje dat alles wurket.

  4. Start de twadde kontener:

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

    Tink derom dat de havenmapping krekt sil wêze 8080:8080, om't wy poarte 80 al yn kaart brocht hawwe fan 'e host nei de âlderkontener nei poarte 8080.

  5. Wy geane nei localhost yn 'e browser, soargje derfoar dat de tsjinner antwurdet "Hello World!"

Yn myn gefal blykte it eksperimint mei nestele Docker-konteners frij posityf te wêzen en ik sil it projekt trochgean te ûntwikkeljen en it te brûken foar staging. It liket my ta dat dit in folle lichtere oplossing is as Kubernetes en Jenkins X. Mar dit is myn subjektive miening.

Ik tink dat it alles is foar it artikel fan hjoed. Yn it folgjende artikel sil ik eksperiminten yn mear detail beskriuwe mei Docker rekursyf yn Docker útfiere en mappen djip yn nestele konteners montearje.

PS As jo ​​​​dit projekt nuttich fine, jou it dan in stjer op GitHub, fork it en fertel jo freonen.

Bewurkje1 Korrizjearre flaters, rjochte op 2 fideo's

Boarne: www.habr.com

Add a comment