Kuinka juoksin Dockeria Dockerin sisällä ja mitä siitä tuli

Hei kaikki! Hänen edellinen artikkeli, Lupasin puhua Dockerin käyttämisestä Dockerissa ja tämän oppitunnin käytön käytännön näkökohdista. On aika pitää lupauksesi. Kokenut devopseri todennäköisesti vastustaa sitä, että ne, jotka tarvitsevat Dockerin Dockerin sisällä, yksinkertaisesti välittävät Docker-daemon-liittimen isännästä säiliöön ja tämä riittää 99% tapauksista. Mutta älä kiirehdi heittämään minulle keksejä, koska puhumme Dockerin käyttämisestä Dockerin sisällä. Tällä ratkaisulla on monia mahdollisia sovelluksia, ja tämä artikkeli käsittelee yhtä niistä, joten istu alas ja suorista kätesi edessäsi.

Kuinka juoksin Dockeria Dockerin sisällä ja mitä siitä tuli

alku

Kaikki alkoi sateisena syyskuun iltana, kun siivosin Digital Oceanista 5 dollarilla vuokraamaani konetta, joka oli jäässä, koska Docker oli täyttänyt kaikki 24 gigatavua vapaata levytilaa kuvillaan ja konteillaan. Ironista oli, että kaikki nämä kuvat ja säiliöt olivat ohimeneviä ja niitä tarvittiin vain testatakseni sovellukseni suorituskykyä aina, kun kirjastosta tai kehyksestä julkaistiin uusi versio. Yritin kirjoittaa shell-skriptejä ja asettaa cron-aikataulun roskien siivoamiseksi, mutta se ei auttanut: joka kerta se väistämättä päättyi palvelimeni levytilan syömiseen ja palvelimen roikkumiseen (parhaimmillaan). Jossain vaiheessa törmäsin artikkeliin, jossa kerrottiin, kuinka Jenkins ajetaan säiliössä ja kuinka se voi luoda ja poistaa build-putkia siihen välitetyn Docker-daemon-socketin kautta. Pidin ajatuksesta, mutta päätin mennä pidemmälle ja yrittää kokeilla Dockerin käyttöä suoraan Dockerin sisällä. Minusta tuntui tuolloin täysin loogiselta ratkaisulta ladata Docker-kuvat ja luoda kontit kaikille testaamiseen tarvittaville sovelluksille toisen kontin (kutsutaanko sitä staging-säiliöksi) sisällä. Ajatuksena oli käynnistää staging-säilö lipulla -rm, joka automaattisesti poistaa koko säilön ja sen sisällön, kun se pysäytetään. Käsittelin itse Dockerin Docker-kuvaa (https://hub.docker.com/_/docker), mutta se osoittautui liian hankalaksi, enkä koskaan saanut sitä toimimaan haluamallani tavalla ja halusin mennä loppuun asti itse.

Harjoitella. Käpyjä

Päätin saada säiliön toimimaan haluamallani tavalla ja jatkoin kokeitani, joiden tuloksena syntyi lukemattomia silmuja. Itsekidutukseni tuloksena oli seuraava algoritmi:

  1. Käynnistämme Docker-kontin interaktiivisessa tilassa.

    docker run --privileged -it docker:18.09.6

    Kiinnitä huomiota säiliön versioon, astu oikealle tai vasemmalle ja DinD muuttuu kurpitsaksi. Itse asiassa asiat hajoavat melko usein, kun uusi versio julkaistaan.
    Meidän on välittömästi päästävä kuoreen.

  2. Yritämme selvittää, mitkä säilöt ovat käynnissä (Vastaus: ei mitään), mutta suoritetaan silti komento:

    docker ps

    Tulet hieman yllättymään, mutta käy ilmi, että Docker-daemon ei ole edes käynnissä:

    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. Suoritetaan se itse:

    dockerd &

    Toinen epämiellyttävä yllätys:

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

  4. Asenna iptables- ja bash-paketit (kaikki on miellyttävämpää työskennellä bashissa kuin sh:ssä):

    apk add --no-cache iptables bash

  5. Aloitetaan bash. Lopulta olemme palanneet tavalliseen kuoreen

  6. Yritetään käynnistää Docker uudelleen:

    dockerd &

    Meidän pitäisi nähdä pitkä lokiarkki, joka päättyy:

    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. Paina Enter. Olemme palanneet kasaan.

Tästä lähtien voimme yrittää laukaista muita kontteja Docker-kontissamme, mutta entä jos haluamme laukaista toisen Docker-kontin Docker-kontissamme tai jokin menee pieleen ja kontti kaatuu? Aloittaa alusta.

Oma DinD-kontti ja uusia kokeita

Kuinka juoksin Dockeria Dockerin sisällä ja mitä siitä tuli
Välttääkseni yllä olevien vaiheiden toistamista yhä uudelleen ja uudelleen, loin oman DinD-säilön:

https://github.com/alekslitvinenk/dind

Toimiva DinD-ratkaisu antoi minulle mahdollisuuden ajaa Dockeria Dockerin sisällä rekursiivisesti ja tehdä seikkailunhaluisempia kokeita.
Aion kuvata nyt yhtä tällaista (onnistunutta) kokeilua MySQL:n ja Nodejs-ajon kanssa.
Kärsimättömimmät näkevät kuinka täällä kävi

Joten aloitetaan:

  1. Käynnistämme DinD:n interaktiivisessa tilassa. Tässä DinD-versiossa meidän on kartoitettava manuaalisesti kaikki portit, joita lapsisäiliömme voivat käyttää (työstän jo tätä)

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

    Pääsemme bashiin, josta voimme heti aloittaa lapsikonttien laukaisun.

  2. Käynnistä MySQL:

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

  3. Yhdistämme tietokantaan samalla tavalla kuin muodostaisimme yhteyden siihen paikallisesti. Varmistetaan, että kaikki toimii.

  4. Käynnistä toinen kontti:

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

    Huomaa, että porttikartoitus on täsmällinen 8080:8080, koska olemme jo yhdistäneet portin 80 isännästä emosäilöön porttiin 8080.

  5. Siirrymme selaimessa localhostiin ja varmistamme, että palvelin vastaa "Hei maailma!"

Minun tapauksessani koe sisäkkäisillä Docker-konteilla osoittautui varsin positiiviseksi ja jatkan projektin kehittämistä ja käyttöä lavastusta varten. Minusta tämä on paljon kevyempi ratkaisu kuin Kubernetes ja Jenkins X. Mutta tämä on minun subjektiivinen mielipiteeni.

Luulen, että siinä kaikki tämän päivän artikkelissa. Seuraavassa artikkelissa kuvailen yksityiskohtaisemmin kokeiluja Dockerin suorittamisesta rekursiivisesti Dockerissa ja hakemistojen asentamisesta syvälle sisäkkäisiin säilöihin.

PS. Jos pidät tätä projektia hyödyllisenä, anna sille tähti GitHubissa, haaroittele se ja kerro ystävillesi.

Edit1 Korjattu virheet, keskittynyt kahteen videoon

Lähde: will.com

Lisää kommentti