Tere kõigile! Oma , 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.

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 (), 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:
Käivitame Docker konteineri interaktiivses režiimis.
docker run --privileged -it docker:18.09.6Pange 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.Proovime välja selgitada, millised konteinerid on käivitatud (Vastus: ei mingeid), kuid viiesime käsu ikkagi läbi:
docker psTe 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 hostKä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 foundPaigaldame iptables ja bash paketid (bashis on kindlasti meeldivam töötada kui sh):
apk add --no-cache iptables bashKäivitame bash. Lfinally oleme taas tuttavas shellis
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.sockPä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
Kuna ma ei taha korrata ülaltoodud samme jälle ja jälle, lõin oma DinD konteineri:
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

Nii et alustame:
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/dindMeie pääseme konsooli, kus saame kohe alustada alamosade käivitamisega.
Käivitame MySQL:
docker run --name mysql -e MYSQL_ROOT_PASSWORD=strongpassword -d -p 3306:3306 mysqlÜhendume andmebaasiga nagu me seda teeksime kohalikult. Veendume, et kõik töötab.
Käivitame teise konteineri:
docker run -d --rm -p 8080:8080 alekslitvinenk/hello-world-nodejs-serverPange tähele, et pordi kaardistamine on siin just 8080:8080, kuna oleme juba kaardistanud pordi 80 hostist vanemasse konteinerisse pordile 8080.
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
