Hammaga salom! Uning ichida
start
Hammasi yomg'irli sentyabr oqshomida Digital Ocean-da 5 dollarga ijaraga olgan mashinamni tozalayotganimda boshlandi, Docker barcha 24 gigabayt disk maydonini tasvir va konteynerlar bilan to'ldirgani sababli muzlatib qo'ydi. Ajablanarlisi shundaki, bu tasvirlar va konteynerlarning barchasi vaqtinchalik edi va har safar kutubxona yoki ramkaning yangi versiyasi chiqarilganda mening ilovamning ishlashini tekshirish uchun kerak edi. Men qobiq skriptlarini yozishga va axlatni tozalash uchun cron jadvalini o'rnatishga harakat qildim, lekin bu yordam bermadi: har safar bu muqarrar ravishda mening serverimning disk maydoni yeb qo'yilishi va serverning osilishi (eng yaxshisi) bilan tugaydi. Bir nuqtada men Jenkinsni konteynerda qanday ishga tushirish va unga yuborilgan docker demon soketi orqali qurilish quvurlarini qanday yaratishi va o'chirishi haqida maqolaga duch keldim. Bu gβoya menga yoqdi, lekin men oldinga borishga qaror qildim va Docker ichida toβgβridan-toβgβri Docker-ni ishga tushirish bilan tajriba oβtkazishga qaror qildim. O'sha paytda menga Docker tasvirlarini yuklab olish va boshqa konteyner ichida sinovdan o'tkazish uchun zarur bo'lgan barcha ilovalar uchun konteynerlar yaratish (keling, uni staging konteyneri deb ataymiz) mantiqiy yechim bo'lib tuyuldi. Maqsad -rm bayrog'i bilan staging konteynerini ishga tushirish edi, u to'xtatilganda butun konteynerni va uning barcha tarkibini avtomatik ravishda o'chirib tashlaydi. Men Dockerning o'zidan Docker tasviri bilan ishladim (
Amaliyot. Konuslar
Men konteynerni kerakli tarzda ishlashga kirishdim va tajribalarimni davom ettirdim, natijada son-sanoqsiz kurtaklar paydo bo'ldi. O'zimni qiynashimning natijasi quyidagi algoritm edi:
-
Biz Docker konteynerini interaktiv rejimda ishga tushiramiz.
docker run --privileged -it docker:18.09.6
Idishning versiyasiga e'tibor bering, o'ngga yoki chapga qadam qo'ying va sizning DinDingiz qovoqqa aylanadi. Darhaqiqat, yangi versiya chiqarilganda narsalar tez-tez buziladi.
Biz darhol qobiqqa kirishimiz kerak. -
Biz qaysi konteynerlar ishlayotganini aniqlashga harakat qilyapmiz (Javob: yo'q), lekin baribir buyruqni bajaramiz:
docker ps
Siz biroz hayron qolasiz, lekin Docker demoni ishlamayotgani ma'lum bo'ldi:
error during connect: Get http://docker:2375/v1.40/containers/json: dial tcp: lookup docker on 192.168.65.1:53: no such host
-
Keling, buni o'zimiz boshqaramiz:
dockerd &
Yana bir yoqimsiz ajablanib:
failed to start daemon: Error initializing network controller: error obtaining controller instance: failed to create NAT chain DOCKER: Iptables not found
-
Iptables va bash paketlarini o'rnating (hamma narsa sh-ga qaraganda bash-da ishlash yoqimliroq):
apk add --no-cache iptables bash
-
Keling, bashni ishga tushiramiz. Nihoyat, biz odatdagi qobiqqa qaytamiz
-
Keling, Dockerni qayta ishga tushirishga harakat qilaylik:
dockerd &
Biz quyidagi bilan tugaydigan uzun varaqni ko'rishimiz kerak:
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
-
Enter tugmasini bosing. Bashga qaytdik.
Bundan buyon biz Docker konteynerimiz ichida boshqa konteynerlarni ishga tushirishga harakat qilishimiz mumkin, lekin agar biz Docker konteynerimiz ichida boshqa Docker konteynerini ishga tushirmoqchi boβlsak yoki biror narsa notoβgβri ketsa va konteyner qulab tushsa-chi? Hammasini qaytadan boshlang.
O'z DinD konteyneri va yangi tajribalar
Yuqoridagi amallarni qayta-qayta takrorlamaslik uchun men o'zimning DinD konteynerimni yaratdim:
Ishchi DinD yechimi menga Docker-ni Docker ichida rekursiv ishga tushirish va ko'proq sarguzashtli tajribalar qilish qobiliyatini berdi.
Men hozir MySQL va Nodejs bilan ishlash bo'yicha shunday (muvaffaqiyatli) tajribani tasvirlab bermoqchiman.
Eng sabrsizlar bu erda qanday bo'lganini ko'rishlari mumkin
Shunday qilib, boshlaymiz:
-
Biz DinD-ni interaktiv rejimda ishga tushiramiz. DinD ning ushbu versiyasida biz bolalar konteynerlarimiz foydalanishi mumkin bo'lgan barcha portlarni qo'lda xaritalashimiz kerak (men bu ustida ishlayapman)
docker run --privileged -it -p 80:8080 -p 3306:3306 alekslitvinenk/dind
Biz bashga kiramiz, u erdan darhol bolalar konteynerlarini ishga tushirishni boshlashimiz mumkin.
-
MySQL-ni ishga tushiring:
docker run --name mysql -e MYSQL_ROOT_PASSWORD=strongpassword -d -p 3306:3306 mysql
-
Biz ma'lumotlar bazasiga mahalliy sifatida ulangandek ulanamiz. Keling, hamma narsa ishlayotganiga ishonch hosil qilaylik.
-
Ikkinchi konteynerni ishga tushiring:
docker run -d --rm -p 8080:8080 alekslitvinenk/hello-world-nodejs-server
Shuni esda tutingki, port xaritasi aniq bo'ladi 8080:8080, chunki biz allaqachon 80-portni xostdan ota-konteynerga 8080-portga moslashtirganmiz.
-
Biz brauzerda localhost-ga o'tamiz, server "Salom dunyo!" Deb javob berishiga ishonch hosil qiling.
Mening holatimda, ichki o'rnatilgan Docker konteynerlari bilan tajriba juda ijobiy bo'ldi va men loyihani ishlab chiqishda davom etaman va undan sahnalashtirish uchun foydalanaman. Menimcha, bu Kubernetes va Jenkins Xga qaraganda ancha engilroq yechim. Lekin bu mening subyektiv fikrim.
Menimcha, bugungi maqola uchun hammasi shu. Keyingi maqolada men Docker-ni Docker-da rekursiv ishga tushirish va kataloglarni ichki o'rnatilgan konteynerlarga chuqur o'rnatish bo'yicha tajribalarni batafsil tasvirlab beraman.
PS Agar siz ushbu loyihani foydali deb bilsangiz, iltimos, unga GitHub-da yulduzcha bering, uni bog'lang va do'stlaringizga ayting.
Edit1 Xatolar tuzatildi, 2 ta videoga e'tibor qaratildi
Manba: www.habr.com