Cumu eseguiu Docker in Docker è ciò chì ne esce

Salut à tutti ! In u so articulu precedente, Aghju prumessu di parlà di eseguisce Docker in Docker è l'aspettu praticu di l'usu di sta lezzione. Hè ora di mantene a vostra prumessa. Un devopser espertu prubabilmente ughjerà chì quelli chì anu bisognu di Docker in Docker simpricimenti trasmettenu u socket daemon Docker da l'ospite in u containeru è questu serà abbastanza in u 99% di i casi. Ma ùn affrettate micca à scaccià i cookies à mè, perchè parleremu di eseguisce veramente Docker in Docker. Sta suluzione hà parechje appiicazioni pussibili è stu articulu hè circa unu di elli, cusì à pusà daretu è dritta i vostri braccia davanti à voi.

Cumu eseguiu Docker in Docker è ciò chì ne esce

U principiu

Tuttu hà cuminciatu in una sera piovosa di settembre quandu stava pulendu a macchina chì aghju affittu per $ 5 nantu à l'Oceanu Digitale, chì era congelatu per via di u fattu chì Docker avia riempitu tutti i 24 gigabytes di u spaziu di discu dispunibule cù e so imagine è cuntenituri. L'ironia era chì tutte queste imaghjini è cuntenituri eranu transitori è eranu necessarii solu per pruvà a prestazione di a mo applicazione ogni volta chì una nova versione di una biblioteca o un framework hè stata liberata. Pruvatu di scrive script di cunchiglia è di stabilisce un cron scheduleru per pulizziari a basura, ma ùn hà micca aiutu: ogni volta chì inevitabbilmente finisci cù u spaziu di discu di u mo servitore chì hè manghjatu è u servitore pendu (in u megliu). À un certu puntu, aghju scontru un articulu nantu à cumu eseguisce Jenkins in un cuntainer è cumu si pò creà è sguassà pipeline di custruzzione attraversu un socket daemon docker trasmessu in questu. Mi piacia l'idea, ma aghju decisu di andà più in là è pruvà à sperimentà cù l'esecuzione diretta di Docker in Docker. À quellu tempu, mi pareva una soluzione cumpletamente logica per scaricà l'imaghjini di Docker è creà cuntenituri per tutte l'applicazioni chì avia bisognu per pruvà in un altru cuntainer (chiamemu un containeru di staging). L'idea era di inizià un cuntinuu di staging cù a bandiera -rm, chì sguassate automaticamente tuttu u cuntinuu è tuttu u so cuntenutu quandu hè firmatu. Aghju aghjustatu l'imaghjini di Docker da Docker stessu (https://hub.docker.com/_/docker), ma s'hè risultatu troppu ingombrante è ùn aghju mai riesciutu à fà u funziunamentu di a manera ch'ellu avia bisognu è aghju vulsutu andà finu à mè stessu.

Pratica. Coni

Aghju partitu per fà u cuntinuu di travaglià a manera ch'e aghju bisognu è cuntinuò i mo esperimenti, chì anu risultatu in una miriade di buddi. U risultatu di a mo auto-tortura era u seguente algoritmu:

  1. Lancemu u containeru Docker in modu interattivu.

    docker run --privileged -it docker:18.09.6

    Prestate attenzione à a versione di u cuntinuu, fate un passu à diritta o manca è u vostru DinD si trasforma in una zucca. In fatti, e cose si rompenu abbastanza spessu quandu una nova versione hè liberata.
    Avemu da entra subitu in a cunchiglia.

  2. Pruvamu di sapè quale cuntenituri sò in esecuzione (Risposta: nimu), ma eseguimu u cumandimu in ogni modu:

    docker ps

    Sarete un pocu sorpresu, ma risulta chì u daemon Docker ùn hè ancu in esecuzione:

    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. Eseguimu noi stessi:

    dockerd &

    Un'altra sorpresa spiacevoli:

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

  4. Installa l'iptables è i pacchetti bash (tuttu hè più piacevule per travaglià in bash cà in sh):

    apk add --no-cache iptables bash

  5. Lancemu bash. Infine simu tornati in a cunchiglia di solitu

  6. Pruvemu di inizià Docker di novu:

    dockerd &

    Avemu da vede una longa foglia di logs chì finiscinu cù:

    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. Press Enter. Semu di ritornu in u bash.

Da avà, pudemu pruvà à lancià altri cuntenituri in u nostru cuntainer Docker, ma chì se vulemu lancià un altru cuntainer Docker in u nostru containeru Docker o qualcosa va male è u cuntinuu crash? Cumincià tuttu di novu.

Propiu cuntainer DinD è novi esperimenti

Cumu eseguiu Docker in Docker è ciò chì ne esce
Per evità di ripetiri i passi sopra una volta è più, aghju creatu u mo propiu cuntainer DinD:

https://github.com/alekslitvinenk/dind

A suluzione DinD di travagliu m'hà datu a capacità di eseguisce Docker in Docker recursivamente è fà esperimenti più avventurosi.
Aghju da descriverà un tali esperimentu (successu) cù l'esecuzione di MySQL è Nodejs avà.
I più impazienti ponu vede cumu era quì

Allora principiamu:

  1. Lancemu DinD in modu interattivu. In questa versione di DinD, avemu bisognu di cartografi manualmente tutti i porti chì i nostri cuntenituri di i zitelli ponu aduprà (aghju digià travagliatu nantu à questu)

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

    Entramu in u bash, da induve pudemu immediatamente principià à lancià cuntenituri per i zitelli.

  2. Lanciate MySQL:

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

  3. Cunnettamu à a basa di dati in u listessu modu cum'è avemu da cunnette à questu in u locu. Assicuratevi chì tuttu funziona.

  4. Lanciate u secondu containeru:

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

    Per piacè nutate chì a mappa di u portu serà esattamente 8080:8080, postu chì avemu digià mappatu u portu 80 da l'ospitu à u containeru parent à u portu 8080.

  5. Andemu à localhost in u navigatore, assicuratevi chì u servitore risponde "Hello World!"

In u mo casu, l'esperimentu cù i cuntenituri Docker nidificati hè diventatu abbastanza pusitivu è continueraghju à sviluppà u prugettu è aduprà per staging. Mi pari chì questu hè una suluzione assai più ligera chì Kubernetes è Jenkins X. Ma questu hè a mo opinion subjectiva.

Pensu chì hè tuttu per l'articulu d'oghje. In u prossimu articulu, descriveraghju in più di detail esperimenti cù l'esecuzione di Docker recursivamente in Docker è a muntagna di repertorii in profondità in cuntenituri nidificati.

PS Se trova stu prughjettu utile, per piacè dà una stella nantu à GitHub, fork it è dite à i vostri amichi.

Mudificà 1 Errori curretti, focu annantu à 2 video

Source: www.habr.com

Add a comment