Dockerni Docker ichida qanday ishga tushirdim va undan nima chiqdi

Hammaga salom! Uning ichida oldingi maqola, Men Docker-ni Docker-da ishga tushirish va ushbu darsdan foydalanishning amaliy jihatlari haqida gapirishga va'da berdim. Va'dangizni bajarish vaqti keldi. Tajribali ishlab chiquvchi, ehtimol Docker ichida Dockerga muhtoj bo'lganlar Docker demon soketini xostdan konteynerga yuborishiga e'tiroz bildirishi mumkin va bu 99% hollarda etarli bo'ladi. Lekin menga cookie-fayllarni tashlashga shoshilmang, chunki biz Docker-ni Docker ichida ishlatish haqida gaplashamiz. Ushbu yechim ko'plab mumkin bo'lgan ilovalarga ega va ushbu maqola ulardan biri haqida, shuning uchun orqaga o'tiring va qo'llaringizni oldingizda to'g'rilang.

Dockerni Docker ichida qanday ishga tushirdim va undan nima chiqdi

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 (https://hub.docker.com/_/docker), lekin bu juda og'ir bo'lib chiqdi va men uni hech qachon kerakli tarzda ishlashga erisha olmadim va men o'zimning oxirigacha borishni xohladim.

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:

  1. 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.

  2. 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

  3. 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

  4. Iptables va bash paketlarini o'rnating (hamma narsa sh-ga qaraganda bash-da ishlash yoqimliroq):

    apk add --no-cache iptables bash

  5. Keling, bashni ishga tushiramiz. Nihoyat, biz odatdagi qobiqqa qaytamiz

  6. 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

  7. 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

Dockerni Docker ichida qanday ishga tushirdim va undan nima chiqdi
Yuqoridagi amallarni qayta-qayta takrorlamaslik uchun men o'zimning DinD konteynerimni yaratdim:

https://github.com/alekslitvinenk/dind

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:

  1. 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.

  2. MySQL-ni ishga tushiring:

    docker run --name mysql -e MYSQL_ROOT_PASSWORD=strongpassword -d -p 3306:3306 mysql

  3. Biz ma'lumotlar bazasiga mahalliy sifatida ulangandek ulanamiz. Keling, hamma narsa ishlayotganiga ishonch hosil qilaylik.

  4. 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.

  5. 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

a Izoh qo'shish