Pozdravljeni vsi skupaj! V njegovem
začenja
Vse se je začelo nekega deževnega septembrskega večera, ko sem čistil stroj, ki sem ga najel za 5$ na Digital Oceanu in je bil zamrznjen, ker je Docker s svojimi slikami in kontejnerji zapolnil vseh 24 gigabajtov razpoložljivega diskovnega prostora. Ironija je bila v tem, da so bile vse te slike in vsebniki začasni in so bili potrebni le za testiranje delovanja moje aplikacije vsakič, ko je bila izdana nova različica knjižnice ali ogrodja. Poskušal sem pisati lupinske skripte in nastaviti časovni razpored za čiščenje smeti, vendar ni pomagalo: vsakič se je neizogibno končalo tako, da je bil pojeden prostor na disku mojega strežnika in je strežnik (v najboljšem primeru) visel. Na neki točki sem naletel na članek o tem, kako zagnati Jenkins v vsebniku in kako lahko ustvari in izbriše gradbene cevovode prek vtičnice docker daemon, ki je posredovana vanj. Ideja mi je bila všeč, vendar sem se odločil, da grem dlje in poskusim eksperimentirati z neposrednim izvajanjem Dockerja znotraj Dockerja. Takrat se mi je zdela povsem logična rešitev, da naložim slike Dockerja in ustvarim kontejnerje za vse aplikacije, ki sem jih potreboval za testiranje znotraj drugega kontejnerja (recimo mu staging container). Ideja je bila zagnati uprizoritveni vsebnik z zastavico -rm, ki samodejno izbriše celoten vsebnik in vso njegovo vsebino, ko je ustavljen. Poigraval sem se s sliko Docker iz samega Dockerja (
Vadite. Stožci
Odločil sem se, da bo posoda delovala tako, kot sem potreboval, in nadaljeval s poskusi, kar je privedlo do neštetih popkov. Rezultat mojega samomučenja je bil naslednji algoritem:
-
Vsebnik Docker zaženemo v interaktivnem načinu.
docker run --privileged -it docker:18.09.6
Bodite pozorni na različico posode, stopite desno ali levo in vaš DinD se spremeni v bučo. Pravzaprav se stvari precej pogosto pokvarijo, ko se izda nova različica.
Takoj moramo priti v lupino. -
Poskušamo ugotoviti, kateri vsebniki se izvajajo (odgovor: noben), vendar vseeno zaženimo ukaz:
docker ps
Nekoliko boste presenečeni, vendar se je izkazalo, da demon Docker sploh ne deluje:
error during connect: Get http://docker:2375/v1.40/containers/json: dial tcp: lookup docker on 192.168.65.1:53: no such host
-
Zaženimo ga sami:
dockerd &
Še eno neprijetno presenečenje:
failed to start daemon: Error initializing network controller: error obtaining controller instance: failed to create NAT chain DOCKER: Iptables not found
-
Namestite pakete iptables in bash (v bashu je vse bolj prijetno delati kot v sh):
apk add --no-cache iptables bash
-
Zaženimo bash. Končno smo spet v običajni lupini
-
Poskusimo znova zagnati Docker:
dockerd &
Morali bi videti dolg list dnevnikov, ki se konča z:
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
-
Pritisnite Enter. Spet smo v bašu.
Od zdaj naprej lahko poskusimo zagnati druge vsebnike znotraj našega vsebnika Docker, toda kaj, če želimo zagnati še en vsebnik Docker znotraj našega vsebnika Docker ali gre kaj narobe in se vsebnik zruši? Začni znova.
Lastna DinD posoda in novi poskusi
Da bi se izognil ponavljanju zgornjih korakov znova in znova, sem ustvaril svoj vsebnik DinD:
Delujoča rešitev DinD mi je dala možnost rekurzivnega izvajanja Dockerja znotraj Dockerja in izvajanja bolj pustolovskih poskusov.
Zdaj bom opisal en tak (uspešen) eksperiment z izvajanjem MySQL in Nodejs.
Najbolj neučakani si lahko ogledate, kako je bilo tukaj
Torej, začnimo:
-
DinD zaženemo v interaktivnem načinu. V tej različici DinD moramo ročno preslikati vsa vrata, ki jih lahko uporabljajo naši podrejeni vsebniki (na tem že delam)
docker run --privileged -it -p 80:8080 -p 3306:3306 alekslitvinenk/dind
Pridemo v bash, od koder lahko takoj začnemo zaganjati podrejene vsebnike.
-
Zaženi MySQL:
docker run --name mysql -e MYSQL_ROOT_PASSWORD=strongpassword -d -p 3306:3306 mysql
-
Z bazo se povežemo na enak način, kot bi se z njo povezali lokalno. Poskrbimo, da vse deluje.
-
Zaženite drugi vsebnik:
docker run -d --rm -p 8080:8080 alekslitvinenk/hello-world-nodejs-server
Upoštevajte, da bo preslikava vrat natančna 8080:8080, saj smo vrata 80 od gostitelja do nadrejenega vsebnika že preslikali v vrata 8080.
-
V brskalniku gremo na localhost in poskrbimo, da strežnik odgovori "Hello World!"
V mojem primeru se je poskus z ugnezdenimi Docker kontejnerji izkazal za precej pozitivnega in projekt bom še naprej razvijal in ga uporabljal za uprizoritev. Zdi se mi, da je to veliko lažja rešitev kot Kubernetes in Jenkins X. Ampak to je moje subjektivno mnenje.
Mislim, da je to vse za današnji članek. V naslednjem članku bom podrobneje opisal eksperimente z rekurzivnim izvajanjem Dockerja v Dockerju in nameščanjem imenikov globoko v ugnezdene vsebnike.
PS Če se vam zdi ta projekt koristen, ga označite z zvezdico na GitHubu, ga razdelite in povejte svojim prijateljem.
Uredi1 Popravljene napake, osredotočeno na 2 videa
Vir: www.habr.com