Salut à tutti ! In u so
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 (
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:
-
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. -
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
-
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
-
Installa l'iptables è i pacchetti bash (tuttu hè più piacevule per travaglià in bash cà in sh):
apk add --no-cache iptables bash
-
Lancemu bash. Infine simu tornati in a cunchiglia di solitu
-
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
-
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
Per evità di ripetiri i passi sopra una volta è più, aghju creatu u mo propiu cuntainer 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:
-
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.
-
Lanciate MySQL:
docker run --name mysql -e MYSQL_ROOT_PASSWORD=strongpassword -d -p 3306:3306 mysql
-
Cunnettamu à a basa di dati in u listessu modu cum'è avemu da cunnette à questu in u locu. Assicuratevi chì tuttu funziona.
-
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.
-
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