Tere kõigile! Tema omas
Algus
Kõik sai alguse ühel vihmasel septembriõhtul, kui koristasin Digital Oceanis 5 dollari eest renditud masinat, mis külmutas, kuna Docker oli oma piltide ja konteineritega täitnud kõik 24 gigabaiti vaba kettaruumi. Iroonia oli selles, et kõik need pildid ja konteinerid olid mööduvad ning neid oli vaja ainult minu rakenduse toimivuse testimiseks iga kord, kui teegi või raamistiku uus versioon välja anti. Proovisin kirjutada shelliskripte ja seada üles prügi koristamise ajakava, kuid see ei aidanud: iga kord lõppes see paratamatult sellega, et mu serveri kettaruum söödi ära ja server jäi rippuma (parimal juhul). Mingil hetkel sattusin artiklile selle kohta, kuidas Jenkinsi konteineris käivitada ja kuidas see saab luua ja kustutada ehituskonveierid sinna edastatud dokkedeemoni pesa kaudu. Mulle meeldis see idee, kuid otsustasin minna kaugemale ja proovida Dockeri otse käivitamist Dockeris. Toona tundus mulle täiesti loogiline lahendus laadida alla Dockeri pildid ja luua teise konteineri (nimetagem seda lavastuskonteineri) sees kõikidele rakendustele, mida mul testimiseks vaja läks. Idee oli käivitada vahekonteiner lipuga -rm, mis kustutab automaatselt kogu konteineri ja selle sisu, kui see seisatakse. Ma nuputasin Dockeri pilti Dockerilt endalt (
Harjuta. Koonused
Võtsin nõu, et konteiner töötaks nii, nagu mul vaja oli, ja jätkasin katseid, mille tulemusel tekkis lugematu arv pungi. Minu enesepiinamise tulemuseks oli järgmine algoritm:
-
Käivitame Dockeri konteineri interaktiivses režiimis.
docker run --privileged -it docker:18.09.6
Pöörake tähelepanu konteineri versioonile, astuge paremale või vasakule ja teie DinD muutub kõrvitsaks. Tegelikult lähevad asjad üsna sageli katki, kui uus versioon välja tuleb.
Peame viivitamatult kesta sisenema. -
Püüame välja selgitada, millised konteinerid töötavad (Vastus: puudub), kuid käivitame siiski käsu:
docker ps
Olete pisut üllatunud, kuid selgub, et Dockeri deemon isegi ei tööta:
error during connect: Get http://docker:2375/v1.40/containers/json: dial tcp: lookup docker on 192.168.65.1:53: no such host
-
Teeme seda 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
-
Installige iptables ja bash paketid (bashis on kõike meeldivam töötada kui sh-s):
apk add --no-cache iptables bash
-
Käivitame bashi. Lõpuks oleme tagasi tavapärases kestas
-
Proovime Dockerit uuesti käivitada:
dockerd &
Peaksime nägema pikka palkide lehte, mis lõppevad:
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
-
Vajutage sisestusklahvi. Oleme tagasi kambaga.
Nüüdsest saame proovida oma Dockeri konteineris teisi konteinereid käivitada, kuid mis siis, kui tahame oma Dockeri konteineris käivitada teise Dockeri konteineri või midagi läheb valesti ja konteiner jookseb kokku? Alustage kõike uuesti.
Oma DinD konteiner ja uued katsed
Et ülaltoodud samme ei kordaks ikka ja jälle, lõin oma DinD konteineri:
Töötav DinD-lahendus andis mulle võimaluse Dockeri sees rekursiivselt käivitada ja seikluslikumaid katseid teha.
Kirjeldan nüüd ühte sellist (edukat) katset MySQL-i ja Nodejs-i käitamisega.
Kõige kannatamatumad näevad, kuidas siin oli
Alustame siis:
-
Käivitame DinD interaktiivses režiimis. Selles DinD versioonis peame käsitsi kaardistama kõik pordid, mida meie alamkonteinerid saavad kasutada (töötan selle kallal juba)
docker run --privileged -it -p 80:8080 -p 3306:3306 alekslitvinenk/dind
Saame bashisse, kust saame kohe hakata lastekonteinereid vette laskma.
-
Käivitage MySQL:
docker run --name mysql -e MYSQL_ROOT_PASSWORD=strongpassword -d -p 3306:3306 mysql
-
Ühendame andmebaasiga samamoodi nagu sellega lokaalselt. Teeme kindlaks, et kõik töötab.
-
Käivitage teine konteiner:
docker run -d --rm -p 8080:8080 alekslitvinenk/hello-world-nodejs-server
Pange tähele, et sadama kaardistamine on täpne 8080:8080, kuna oleme juba vastendanud pordi 80 hostist emakonteinerisse pordiga 8080.
-
Me läheme brauseris saidile localhost, veenduge, et server vastaks "Tere maailm!"
Minu puhul osutus eksperiment pesastatud Dockeri konteineritega üsna positiivseks ja jätkan projekti arendamist ja kasutan seda lavastuseks. Mulle tundub, et see on palju kergem lahendus kui Kubernetes ja Jenkins X. Aga see on minu subjektiivne arvamus.
Ma arvan, et see on tänase artikli jaoks kõik. Järgmises artiklis kirjeldan üksikasjalikumalt katseid Dockeri rekursiivse käivitamisega Dockeris ja kataloogide paigaldamisega sügavale pesastatud konteineritesse.
PS Kui leiate, et see projekt on kasulik, pange sellele GitHubis tärn, ühendage see ja rääkige sellest oma sõpradele.
Edit1 Parandatud vead, keskendunud 2 videole
Allikas: www.habr.com