Kuidas ma käivitasin Dockerit Dockeris ja mis sellest välja tuli

Tere, kõigile! Oma eelnevas artiklis, lubasin rääkida Dockerist Dockeris ja praktilistest aspektidest, mis selle tegevuse rakendamisega kaasnevad. On aeg oma lubadus täita. Kogenud DevOps võib ehk vastu vaielda, et neile, kellele on vaja Dockerit Dockeris, piisab lihtsalt Docker daemon'i socket'i edastamisest hostist konteinerisse, ja sellest piisab 99% juhtudest. Kuid ärge kiirustage mind küpsistega viskama, sest jutt on tõelisest Dockerist Dockeris. Sellel lahendusel on palju võimalikke rakendusvaldkondi ja üks neist on see artikkel, nii et istuge mugavalt ja sirutage oma käed enda ette.

Kuidas ma käivitasin Dockerit Dockeris ja mis sellest välja tuli

Algus

Kõik algas ühe vihmase septembri õhtul, kui ma puhastasin 5 dollari eest üüritud masinat Digital Oceanis, mis oli täielikult kinni jäänud, kuna Docker oli täitnud kõik 24 gigabayti saadaval olevat kettaruumi oma piltidega ja konteineritega. Irooniline oli see, et kõik need pildid ja konteinerid olid ajutised ning vajalikud vaid selleks, et testida minu rakenduse toimivust iga kord, kui mõni teek või raamistik uuendus ilmus. Proovisin kirjutada shell-skripte ja seadistada cron'i ajastust prügi puhastamiseks, kuid see ei päästnud: iga kord lõppes see parimal juhul sellega, et minu serveri kettaruum oli ära süüa saanud ja server hangus. Ühel hetkel sattusin artiklile selle kohta, kuidas Jenkinsit konteineris käivitada ja kuidas see saab luua ja eemaldada ehitustorusid Docker daemon'i edastatud pistiku kaudu. Idee meeldis mulle, kuid otsustasin minna kaugemale ja eksperimenteerida Docker'i käivitamisega Docker'i sees. Tookord tundus loogilise lahendusena laadida Docker'i pilte ja luua konteinerid kõigile rakendustele, mida mul testimiseks vaja oli, teise konteineri sees (nimetame seda staging konteineriks). Idee oli käivitada staging konteiner -rm lipuga, mis kustutab automaatselt kogu konteineri koos kogu selle sisuga, kui see peatatakse. Kaevusin Docker'i pildiga, mille pakkus Docker ise.https://hub.docker.com/_/docker), aga see osutus liiga keeruliseks ja mul ei õnnestunud seda tööle panna nii, nagu ma tahtsin; tahtsin kogu teekonna ise läbi käia.

Praktika. Kogemused

Seadsin eesmärgiks saada konteiner tööle nii, nagu mulle sobib, ning jätkasin katsetusi, mille tulemusena tekkis hulganisti kogemusi. Minu eneseväljenduse lõpptulemusena sai järgmine algoritm:

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

    docker run --privileged -it docker:18.09.6

    Pange tähele konteineri versiooni, samm paremale või vasakule ja teie DinD muutub kõrvitsaks. Tegelikult puruneb kõik üsna ofte, kui välja antakse uus versioon.
    Peame kohe sisestama shell'i.

  2. Proovime teada saada, millised konteinerid on käivitatud (Vastus: ühtegi), kuid teeme siiski käsu:

    docker ps

    Teid üllatab, aga 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. Installime iptables ja bash paketid (bashis on töötamine alati toredam kui sh):

    apk add --no-cache iptables bash

  5. Käivitame bash'i. Lõ finalmente oleme taas tuttavas shellis

  6. Proovime Dockerit uuesti käivitada:

    dockerd &

    Me peaksime nägema pikka logiteksti, mis lõppeb:

    INFO[2019-11-25T19:51:19.448080400Z] Daemon on lõpetanud initsialiseerimise          
    INFO[2019-11-25T19:51:19.474439300Z] API kuulab aadressil /var/run/docker.sock

  7. Vajutame Enterit. Oleme taas bashis.

Alates sellest hetkest saame proovida käivitada teisi konteinerid meie Docker konteineris, aga mis siis, kui me tahame tõsta veel ühe Docker konteineri meie Docker konteineris või kui midagi läheb valesti ja konteiner «langeb»? Alustada uuesti algusest.

Omandatud DinD konteiner ja uued eksperimendid

Kuidas ma käivitasin Dockerit Dockeris ja mis sellest välja tuli
Kuna ma ei soovi neid samme jälle ja jälle korrata, olen loonud oma DinD konteineri:

https://github.com/alekslitvinenk/dind

Töötav DinD lahendus andis mulle võimaluse käivitada Dockerit Dockeris rekursiivselt ja teha julgemat katsetust.
Ühe sellise (eduka) eksperimendi käivitamisest MySQL ja Nodejs'iga kavan ka nüüd rääkida.
Kõige kannatamatud saavad vaadata, kuidas see välja nägi siin

Vaata videot

Nii, alustame:

  1. Käivitame DinD interaktiivses režiimis. Selles versioonis peame käsitsi suunama kõik sadamad, mida võivad kasutada meie alamkontainerid (olen selle kallal juba töötamas).

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

    Jõuame bash'i, kust saame kohe alustada alamkontainerite käivitamisega.

  2. Käivitame MySQL:

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

  3. Ühendame 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 portide suunamine on siin täpselt 8080:8080, kuna oleme juba suunanud port 80 hostist vanemkonteinerisse porti 8080.

  5. Külastame brauseris localhost'i ja veendume, et server vastab "Hello World!".

Minu puhul osutus eksperiment sisemiste Docker-konteineritega üsna positiivseks ja kavatsema projekti edasi arendada ning kasutada seda stardiks. Minu arvates on see palju kergem lahendus kui Kubernetes ja Jenkins X. Kuid see on minu subjektiivne arvamus.

Arvan, et tänase artikli jaoks on see kõik. Järgmises artiklis kirjeldan põhjalikumalt katsetusi Dockerit Dockeris käivitamise ja kaustade sisemisse sisendisse mountimisega.

P.S. Kui leiate selle projekti kasulikuna, siis palun pange sellele tähe GithHubis, tehke fork ja rääkige sõpradele.

Muuda1 Parandasin vead, keskendusin 2 videole

Allikas: habr.com

Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid 🔥 Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster