Kuidas ma käivitasin Docker'i Docker'is ja mis sellest välja tuli

Tere kõigile! Oma eelnevas artiklis, lubasin rääkida Dokkeri käivitamisest Dokkeris ja selle praktiseerimise aspektidest. On aeg lubadust täita. Kogenud DevOps võib vastuväita, et need, kellele on vaja Dokkerit Dokkeris, edastavad lihtsalt hosti Dokkeri deemonisoketi konteinerisse, ja seda piisab 99% juhtudest. Kuid ärge kiirustage mind küpsistega viskama, sest jutt käib tõelisest Dokkeri käivitamisest Dokkeris. Sellel lahendusel on palju võimalikke rakendusi ja üks neist on see artikkel, nii et võtke mugavalt istet ja sirutage käed enda ette.

Kuidas ma käivitasin Docker'i Docker'is ja mis sellest välja tuli

Algus

Kõik algas vihmasel septembrikuu õhtul, kui puhastasin $5 eest loodud masinat Digital Oceanis, mis jääb täielikult seisma, kuna Dokker oli täitnud kõik 24 gigabaiti saadaval olnud kettaruumi oma piltide ja konteineritega. Iroonia seisnes selles, et kõik need pildid ja konteinerid olid üleminekuajaliselt ja vajalikud ainult selleks, et testida oma rakenduse töökindlust iga kord, kui vabanes uus versioon mõnest teegist või raamistikust. Proovisin kirjutada shell-skriptid ja seadistada cron-kava prügi puhastamiseks, kuid see ei aidanud: iga kord lõppes kõik paratamatult sellega, et minu serveri kettaruumi võeti ära ja server seisis (parimal juhul). Ühel hetkel sattusin artiklile, kuidas käivitada Jenkins konteineris ja kuidas see suudab luua ja kustutada ehituskanaleid läbi edastatud soketi dokkeri deemonile. Idee meeldis mulle, kuid otsustasin minna kaugemale ja proovida eksperimenteerida tõelise Dokkeri käivitamisega Dokkeris. Siis tundus mulle täiesti loogiline lahendus tõmmata dokkeripildid ja luua kõiki rakenduste konteinerid, mida mul vähegi vajadus oli, teise konteineri (nimetame seda staging konteineriks) sisse. Idee seisnes selles, et käivitada staging konteiner koos -rm lipuga, mis kustutab automaatselt kogu konteineri koos kõigi selle sisudega, kui see peatatakse. Otsisin dokkeripilti, mis pärineb Dokkerilt (https://hub.docker.com/_/docker), kuid see osutus liiga mahukaks ja mul ei õnnestunud seda tööle panna nii, nagu mulle vajalik oli; ma tahtsin kogu tee ise läbida.

Praktika. Koputused

Ma eesmärgiks oli panna konteiner töötama nii, nagu mulle sobib, ja jätkuvalt katsetasin, mille tulemuseks oli rohked probleemid. Minu enesehävitamise tulemusena tekkis järgmine algoritm:

  1. Käivitame Docker konteineri interaktiivses režiimis.

    docker run --privileged -it docker:18.09.6

    Pange tähele konteineri versiooni, samas suunas määramine või kõrvalekaldumine ja teie DinD muutub kõrvitsaks. Tegelikult puruneb kõik üsna sageli uue versiooni väljaandel.
    Peame kohe pääsema shelli.

  2. Proovime välja selgitada, millised konteinerid on käivitatud (Vastus: ei mingeid), kuid viiesime käsu ikkagi läbi:

    docker ps

    Te jääte natuke üllatuma, kuid selgub, et Docker daemon ei ole isegi käivitatud:

    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. Käivitame selle ise:

    dockerd &

    Veel üks ebameeldiv üllatus:

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

  4. Paigaldame iptables ja bash paketid (bashis on kindlasti meeldivam töötada kui sh):

    apk add --no-cache iptables bash

  5. Käivitame bash. Lfinally oleme taas tuttavas shellis

  6. proovime Dockerit veel kord käivitada:

    dockerd &

    Peame nägema pikka logikirja, mis lõppeb:

    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. Päevikusse vajutame Enter. Oleme taas bashis.

Alates hetkest, mil saame proovida käivitada teisi konteinerid meie Docker konteineri sees, aga mis siis, kui tahame käivitada veel ühe Docker konteineri meie Docker konteineri sees või midagi läheb valesti ja konteiner "kukub"? Alustame siis uuesti.

Oma DinD konteiner ja uued katsed

Kuidas ma käivitasin Docker'i Docker'is ja mis sellest välja tuli
Kuna ma ei taha korrata ülaltoodud samme jälle ja jälle, lõin oma DinD konteineri:

https://github.com/alekslitvinenk/dind

Töötav DinD lahendus võimaldas mul käivitada Dockerit Dockeris rekursiivselt ja teha julgeid katsetusi.
Ühte sellist (edukat) katset MySQL ja Nodejs käivitamisega kirjeldan nüüd.
Kõige kannatamatumad võivad vaadata, kuidas see oli siin

Mängi videot

Nii et alustame:

  1. Käivitame DinD interaktiivses režiimis. Käesolevas DinD versioonis on meil vaja käsitsi kaardistada kõik portid, mida meie alakeeravad konteinerid võivad kasutada (ma töötan juba selle nimel)

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

    Meie pääseme konsooli, kus saame kohe alustada alamosade käivitamisega.

  2. Käivitame MySQL:

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

  3. Ühendume andmebaasiga nagu me seda teeksime kohalikult. Veendume, et kõik töötab.

  4. Käivitame teise konteineri:

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

    Pange tähele, et pordi kaardistamine on siin just 8080:8080, kuna oleme juba kaardistanud pordi 80 hostist vanemasse konteinerisse pordile 8080.

  5. Läheme brauserisse localhost'ile ja veendume, et server vastab "Hello World!".

Minu puhul osutus katse pesakonteineritega üsna positiivseks ning kavatsege jätkata projekti arendamist ja selle kasutamist etappideks. Minu arvates on see palju kergem lahendus kui sama Kubernetes või Jenkins X. Kuid see on minu subjektiivne arvamus.

Mõtlen, et selle artikli jaoks on see kõik. Järgmises artiklis kirjeldan põhjalikumalt katseid rekursiivse Docker'i käivitamise ja kaustade sügavamale kaustadesse mountimisega.

P.S. Kui arvate, et see projekt on kasulik, palun andke sellele GitHub'is täht ja tehke fork ning rääkige oma sõpradele.

Edit1 Parandasin vigu, keskendusin 2 videole

Allikas: habr.com

Osta usaldusväärne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid 🔥 Osta usaldusväärne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster