Kaixo guztioi! Berean
ΠΠ°ΡΠ°Π»ΠΎ
Dena iraileko arratsalde euritsu batean hasi zen Digital Ocean-en 5 dolarren truke alokatu nuen makina garbitzen ari nintzela, izoztuta zegoen Docker-ek bere irudi eta edukiontziekin erabilgarri zegoen diskoko 24 gigabyte guztiak bete zituelako. Ironia zen irudi eta edukiontzi horiek guztiak iragankorrak zirela eta nire aplikazioaren errendimendua probatzeko soilik behar zirela liburutegi edo esparru baten bertsio berri bat askatzen zen bakoitzean. Saiatu nintzen shell script-ak idazten eta cron programazioa konfiguratzen zaborra garbitzeko, baina ez zuen lagundu: ezinbestean amaitzen zen bakoitzean nire zerbitzariaren diskoko espazioa jan eta zerbitzaria zintzilik (onenean). Noizbait, Jenkins edukiontzi batean exekutatu nola exekutatu eta bertan birbidaltzen den docker daemon socket baten bidez eraikitzeko kanalizazioak sortu eta ezaba ditzakeenari buruzko artikulu bat topatu nuen. Ideia gustatu zitzaidan, baina urrunago joatea eta Dockerren barruan Docker zuzenean exekutatzen esperimentatzen saiatzea erabaki nuen. Garai hartan, irtenbide guztiz logikoa iruditu zitzaidan Docker irudiak deskargatzea eta beste edukiontzi baten barruan probatzeko behar nituen aplikazio guztientzako edukiontziak sortzea (eszenaratzeko edukiontzia dei dezagun). Ideia zen -rm bandera duen etapa-edukiontzi bat abiaraztea, automatikoki edukiontzi osoa eta bere eduki guztia gelditzen denean ezabatzen duena. Docker beraren Docker irudia moldatu nuen (
Praktikatu. Konoak
Ontzia behar nuen moduan funtzionatzeari ekin nion eta nire esperimentuekin jarraitu nuen, eta horrek fruitu ugari sortu zituen. Nire autotorturaren emaitza algoritmo hau izan zen:
-
Docker edukiontzia modu interaktiboan abiarazten dugu.
docker run --privileged -it docker:18.09.6
Erreparatu ontziaren bertsioari, urrats eskuinera edo ezkerrera eta zure DinD kalabaza bihurtzen da. Izan ere, gauzak sarritan apurtzen dira bertsio berri bat kaleratzen denean.
Berehala sartu behar dugu oskoletan. -
Zein edukiontzi exekutatzen ari diren jakiten saiatzen ari gara (Erantzuna: bat ere ez), baina exekutatu dezagun komandoa hala ere:
docker ps
Pixka bat harritu egingo zara, baina Docker deabrua ez da martxan jartzen ere egiten:
error during connect: Get http://docker:2375/v1.40/containers/json: dial tcp: lookup docker on 192.168.65.1:53: no such host
-
Exekutatu dezagun geuk:
dockerd &
Beste sorpresa desatsegin bat:
failed to start daemon: Error initializing network controller: error obtaining controller instance: failed to create NAT chain DOCKER: Iptables not found
-
Instalatu iptables eta bash paketeak (dena atseginagoa da bash-en lan egiteko sh-n baino):
apk add --no-cache iptables bash
-
Abiarazi dezagun bash. Azkenik, ohiko oskoletara itzuli gara
-
Saia gaitezen Docker berriro abiarazten:
dockerd &
Honekin amaitzen den erregistro-orri luze bat ikusi beharko genuke:
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
-
Sakatu Sartu. Itzuli gara.
Hemendik aurrera, gure Docker edukiontziaren barruan beste edukiontzi batzuk abiarazten saia gaitezke, baina zer gertatzen da gure Docker edukiontziaren barruan beste Docker edukiontzi bat abiarazi nahi badugu edo zerbait gaizki gertatzen bada eta edukiontzia huts egiten badu? Hasi berriro.
DinD edukiontzi propioa eta esperimentu berriak
Aurreko urratsak behin eta berriz errepika ez daitezen, nire DinD edukiontzi propioa sortu nuen:
Lanean ari den DinD irtenbideak Docker-en Docker-en barruan modu errekurtsiboan exekutatzeko eta esperimentu abenturazaleagoak egiteko gaitasuna eman zidan.
MySQL eta Nodejs exekutatzeko esperimentu (arrakastatsu) bat deskribatuko dut orain.
Pazientzia handienek hemen nola zegoen ikus dezakete
Beraz, hasi:
-
DinD modu interaktiboan abiarazten dugu. DinD-ren bertsio honetan, gure haurren edukiontziak erabil ditzaketen portu guztiak eskuz mapatu behar ditugu (dagoeneko lanean ari naiz)
docker run --privileged -it -p 80:8080 -p 3306:3306 alekslitvinenk/dind
Bashean sartuko gara, eta handik berehala has gaitezen haurrentzako edukiontziak jaurtitzen.
-
Abiarazi MySQL:
docker run --name mysql -e MYSQL_ROOT_PASSWORD=strongpassword -d -p 3306:3306 mysql
-
Datu-basera lokalean konektatuko ginen moduan konektatzen gara. Ea dena funtzionatzen duela.
-
Abiarazi bigarren edukiontzia:
docker run -d --rm -p 8080:8080 alekslitvinenk/hello-world-nodejs-server
Kontuan izan portuaren mapa zehatza izango dela 8080:8080, dagoeneko 80 ataka ostalaritik edukiontzi nagusira 8080 atakara mapatu baitugu.
-
Arakatzailean localhost-era joaten gara, ziurtatu zerbitzariak "Kaixo Mundua!" erantzuten duela.
Nire kasuan, habiaraturiko Docker edukiontziekin egindako esperimentua nahiko positiboa izan zen eta proiektua garatzen eta eszenaratzeko erabiltzen jarraituko dut. Kubernetes eta Jenkins X baino askoz irtenbide arinagoa dela iruditzen zait. Baina hau da nire iritzi subjektiboa.
Uste dut hori guztia dela gaurko artikulurako. Hurrengo artikuluan zehatzago deskribatuko ditut Docker errekurtsiboki Docker-en exekutatzen diren esperimentuak eta direktorioak habiaratutako edukiontzietan sakonduz.
PS Proiektu hau erabilgarria iruditzen bazaizu, eman izar bat GitHub-en, sar ezazu eta esan zure lagunei.
Edit1 Akatsak zuzenduta, 2 bideotan zentratuta
Iturria: www.habr.com