Kuidas ma Dockerit Dockeri sees juhtisin ja mis sellest välja tuli

Tere kõigile! Tema omas Eelmine artikkel, lubasin rääkida Dockeri käivitamisest Dockeris ja selle õppetunni kasutamise praktilistest aspektidest. On aeg oma lubadus täita. Kogenud devopser vaidlustab tõenäoliselt selle, et need, kes vajavad Dockerit Dockeri sees, saadavad lihtsalt Dockeri deemoni pesa hostist konteinerisse ja sellest piisab 99% juhtudest. Kuid ärge kiirustage mulle küpsiseid loopima, sest me räägime Dockeri tegelikust käivitamisest Dockeris. Sellel lahendusel on palju võimalikke rakendusi ja see artikkel räägib neist ühest, nii et istuge ja sirutage käed enda ees.

Kuidas ma Dockerit Dockeri sees juhtisin ja mis sellest välja tuli

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 (https://hub.docker.com/_/docker), kuid see osutus liiga tülikaks ja mul ei õnnestunud seda kordagi nii tööle saada, nagu vajasin ja ma tahtsin ise lõpuni minna.

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:

  1. 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.

  2. 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

  3. 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

  4. Installige iptables ja bash paketid (bashis on kõike meeldivam töötada kui sh-s):

    apk add --no-cache iptables bash

  5. Käivitame bashi. Lõpuks oleme tagasi tavapärases kestas

  6. 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

  7. 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

Kuidas ma Dockerit Dockeri sees juhtisin ja mis sellest välja tuli
Et ülaltoodud samme ei kordaks ikka ja jälle, lõin oma DinD konteineri:

https://github.com/alekslitvinenk/dind

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:

  1. 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.

  2. Käivitage MySQL:

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

  3. Ühendame andmebaasiga samamoodi nagu sellega lokaalselt. Teeme kindlaks, et kõik töötab.

  4. 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.

  5. 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

Lisa kommentaar