Bok svima! U njegovom
početak
Sve je počelo jedne kišne rujanske večeri kada sam čistio stroj koji sam unajmio za 5 dolara na Digital Oceanu, a koji je bio zamrznut jer je Docker svojim slikama i spremnicima napunio svih 24 gigabajta raspoloživog prostora na disku. Ironija je bila u tome što su sve te slike i spremnici bili prolazni i bili su potrebni samo za testiranje performansi moje aplikacije svaki put kada se objavi nova verzija biblioteke ili okvira. Pokušao sam napisati skripte ljuske i postaviti cron raspored za čišćenje smeća, ali nije pomoglo: svaki put je neizbježno završilo s pojedenim prostorom na disku mog poslužitelja i spuštanjem poslužitelja (u najboljem slučaju). U nekom sam trenutku naišao na članak o tome kako pokrenuti Jenkins u spremniku i kako može stvarati i brisati cjevovode za izgradnju kroz utičnicu docker demona koja je proslijeđena u njega. Svidjela mi se ideja, ali sam odlučio ići dalje i pokušati eksperimentirati s izravnim pokretanjem Dockera unutar Dockera. Tada mi se činilo sasvim logičnim rješenjem preuzeti Docker slike i napraviti kontejnere za sve aplikacije koje su mi bile potrebne za testiranje unutar drugog kontejnera (nazovimo ga staging kontejner). Ideja je bila pokrenuti pripremni spremnik s oznakom -rm, koja automatski briše cijeli spremnik i sav njegov sadržaj kada se zaustavi. Petljao sam sa Docker slikom iz samog Dockera (
Praksa. Čunjevi
Odlučila sam napraviti spremnik kako trebam i nastavila s eksperimentima, što je rezultiralo bezbrojnim pupoljcima. Rezultat mog samomučenja bio je sljedeći algoritam:
-
Pokrećemo Docker spremnik u interaktivnom načinu rada.
docker run --privileged -it docker:18.09.6
Obratite pažnju na verziju spremnika, zakoračite desno ili lijevo i vaš DinD se pretvara u bundevu. Zapravo, stvari se često pokvare kada se objavi nova verzija.
Moramo odmah ući u školjku. -
Pokušavamo saznati koji spremnici rade (odgovor: nijedan), ali ipak pokrenimo naredbu:
docker ps
Bit ćete malo iznenađeni, ali ispada da Docker demon uopće nije pokrenut:
error during connect: Get http://docker:2375/v1.40/containers/json: dial tcp: lookup docker on 192.168.65.1:53: no such host
-
Pokrenimo ga sami:
dockerd &
Još jedno neugodno iznenađenje:
failed to start daemon: Error initializing network controller: error obtaining controller instance: failed to create NAT chain DOCKER: Iptables not found
-
Instalirajte iptables i bash pakete (sve je ugodnije raditi u bashu nego u sh):
apk add --no-cache iptables bash
-
Pokrenimo bash. Napokon smo opet u uobičajenoj ljusci
-
Pokušajmo ponovno pokrenuti Docker:
dockerd &
Trebali bismo vidjeti dugačak list dnevnika koji završava s:
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
-
Pritisni enter. Vratili smo se u bash.
Od sada možemo pokušati pokrenuti druge spremnike unutar našeg Docker spremnika, ali što ako želimo pokrenuti još jedan Docker spremnik unutar našeg Docker spremnika ili nešto pođe po zlu i spremnik se sruši? Počni sve ispočetka.
Vlastiti DinD kontejner i novi eksperimenti
Kako bih izbjegao stalno ponavljanje gornjih koraka, napravio sam vlastiti DinD spremnik:
Radno DinD rješenje dalo mi je mogućnost rekurzivnog pokretanja Dockera unutar Dockera i izvođenja avanturističkih eksperimenata.
Sada ću opisati jedan takav (uspješan) eksperiment s pokretanjem MySQL-a i Nodejsa.
Oni najnestrpljiviji mogu vidjeti kako je bilo ovdje
Dakle, krenimo:
-
DinD pokrećemo u interaktivnom načinu rada. U ovoj verziji DinD-a moramo ručno mapirati sve priključke koje naši dječji spremnici mogu koristiti (već radim na tome)
docker run --privileged -it -p 80:8080 -p 3306:3306 alekslitvinenk/dind
Ulazimo u bash, odakle možemo odmah pokrenuti podređene spremnike.
-
Pokrenite MySQL:
docker run --name mysql -e MYSQL_ROOT_PASSWORD=strongpassword -d -p 3306:3306 mysql
-
S bazom se povezujemo na isti način kao što bismo se s njom spajali lokalno. Pobrinimo se da sve radi.
-
Pokrenite drugi spremnik:
docker run -d --rm -p 8080:8080 alekslitvinenk/hello-world-nodejs-server
Imajte na umu da će mapiranje luka biti točno 8080:8080, budući da smo već mapirali port 80 od glavnog računala do nadređenog spremnika u port 8080.
-
Idemo na localhost u pregledniku, provjerimo odgovara li poslužitelj "Hello World!"
U mom slučaju, eksperiment s ugniježđenim Docker spremnicima pokazao se prilično pozitivnim i nastavit ću razvijati projekt i koristiti ga za inscenaciju. Čini mi se da je ovo puno lakše rješenje od Kubernetesa i Jenkinsa X. Ali ovo je moje subjektivno mišljenje.
Mislim da je to sve za današnji članak. U sljedećem ću članku detaljnije opisati eksperimente s rekurzivnim pokretanjem Dockera u Dockeru i montiranjem direktorija duboko u ugniježđene spremnike.
PS Ako smatrate da je ovaj projekt koristan, dajte mu zvjezdicu na GitHubu, račvajte ga i recite svojim prijateljima.
Edit1 Ispravljene pogreške, fokusiran na 2 videa
Izvor: www.habr.com