Sziasztok! Az övében
kezdet
Az egész egy esős szeptemberi estén kezdődött, amikor a Digital Ocean-on 5 dollárért bérelt gépemet takarítottam, ami lefagyott amiatt, hogy a Docker mind a 24 gigabájtnyi szabad lemezterületet feltöltött képeivel és konténereivel. Az irónia az volt, hogy ezek a képek és tárolók átmenetiek voltak, és csak az alkalmazásom teljesítményének teszteléséhez volt szükségük minden alkalommal, amikor egy könyvtár vagy keretrendszer új verziója megjelent. Megpróbáltam shell szkripteket írni és cron ütemezést beállítani a szemét eltakarítására, de ez nem segített: minden alkalommal elkerülhetetlenül a szerverem lemezterületének felemésztésével és a szerver lefagyásával (legjobb esetben) a vége. Valamikor rábukkantam egy cikkre, amely arról szólt, hogyan futtassuk a Jenkinst egy konténerben, és hogyan tud létrehozni és törölni build-folyamatokat az oda továbbított docker démon socketen keresztül. Tetszett az ötlet, de úgy döntöttem, tovább megyek, és megpróbálok kísérletezni a Docker közvetlen futtatásával a Dockeren belül. Abban az időben számomra teljesen logikus megoldásnak tűnt, hogy letöltöttem a Docker-képeket, és egy másik konténerben (nevezzük állomásozó konténerben) konténereket készítek minden olyan alkalmazáshoz, amelyre szükségem volt a teszteléshez. Az ötlet az volt, hogy indítsunk el egy átmeneti tárolót az -rm kapcsolóval, amely automatikusan törli a teljes tárolót és annak teljes tartalmát, ha leállítjuk. A Docker-képet magából a Dockerből bütykölgettem (
Gyakorlat. Kúpok
Elhatároztam, hogy a konténer úgy működjön, ahogyan szükségem volt, és folytattam a kísérleteimet, aminek eredményeként számtalan rügy keletkezett. Az önkínzásom eredménye a következő algoritmus volt:
-
A Docker tárolót interaktív módban indítjuk el.
docker run --privileged -it docker:18.09.6
Ügyeljen a tartály verziójára, lépjen jobbra vagy balra, és a DinD tökké változik. Valójában a dolgok gyakran megszakadnak, amikor új verziót adnak ki.
Azonnal be kell jutnunk a kagylóba. -
Próbáljuk kideríteni, hogy mely konténerek futnak (Válasz: egyik sem), de futtassuk le a parancsot:
docker ps
Kicsit meg fogsz lepődni, de kiderül, hogy a Docker démon nem is fut:
error during connect: Get http://docker:2375/v1.40/containers/json: dial tcp: lookup docker on 192.168.65.1:53: no such host
-
Futtassuk mi magunk:
dockerd &
Még egy kellemetlen meglepetés:
failed to start daemon: Error initializing network controller: error obtaining controller instance: failed to create NAT chain DOCKER: Iptables not found
-
Telepítse az iptables és a bash csomagokat (bash-ban minden kellemesebb, mint sh-ben):
apk add --no-cache iptables bash
-
Indítsuk el a bash-t. Végre visszatértünk a megszokott kagylóba
-
Próbáljuk meg újra futtatni a Dockert:
dockerd &
Egy hosszú naplólapot kell látnunk, amely a következőkkel végződik:
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
-
Nyomd meg az Entert. Visszatértünk a csapásra.
Mostantól megpróbálhatunk más konténereket elindítani a Docker-konténerünkön belül, de mi van akkor, ha egy másik Docker-konténert szeretnénk elindítani a Docker-konténerünkben, vagy valami elromlik, és a konténer összeomlik? Előről kezdeni.
Saját DinD konténer és új kísérletek
A fenti lépések újra és újra megismétlésének elkerülése érdekében létrehoztam egy saját DinD tárolómat:
A működő DinD megoldás lehetővé tette számomra, hogy a Dockert rekurzívan futtassam a Dockeren belül, és kalandosabb kísérleteket végezhessek.
Most egy ilyen (sikeres) kísérletet írok le a MySQL és a Nodejs futtatásával.
A legtürelmetlenebbek láthatják, milyen volt itt
Tehát kezdjük:
-
A DinD-t interaktív módban indítjuk el. A DinD ezen verziójában manuálisan kell leképeznünk az összes portot, amelyet gyermektárolóink használhatnak (már dolgozom ezen)
docker run --privileged -it -p 80:8080 -p 3306:3306 alekslitvinenk/dind
Beérünk a bashba, ahonnan azonnal elkezdhetjük a gyerekkonténerek vízre bocsátását.
-
Indítsa el a MySQL-t:
docker run --name mysql -e MYSQL_ROOT_PASSWORD=strongpassword -d -p 3306:3306 mysql
-
Ugyanúgy kapcsolódunk az adatbázishoz, mint helyileg. Győződjön meg róla, hogy minden működik.
-
Indítsa el a második tárolót:
docker run -d --rm -p 8080:8080 alekslitvinenk/hello-world-nodejs-server
Kérjük, vegye figyelembe, hogy a port-leképezés pontosan így lesz 8080:8080, mivel a 80-as portot a gazdagépről a szülőtárolóra már leképeztük a 8080-as portra.
-
A böngészőben a localhost oldalra lépünk, és győződjön meg arról, hogy a szerver válaszol: „Hello World!”
Az én esetemben a beágyazott Docker konténerekkel végzett kísérlet meglehetősen pozitívra sikeredett, és tovább fogom fejleszteni a projektet, és felhasználom a színpadra. Nekem úgy tűnik, hogy ez egy sokkal könnyedebb megoldás, mint a Kubernetes és a Jenkins X. De ez az én szubjektív véleményem.
Azt hiszem, ennyi a mai cikkhez. A következő cikkben részletesebben leírom a Docker Dockerben való rekurzív futtatásával kapcsolatos kísérleteket, valamint a könyvtárak beágyazott tárolókba való beillesztését.
PS Ha hasznosnak találja ezt a projektet, jelölje meg csillaggal a GitHubon, forgassa el, és mondja el barátainak.
Edit1 Javítva a hibák, 2 videóra összpontosítva
Forrás: will.com