مان ڊڪر جي اندر ڊڪر کي ڪيئن ڊوڙايو ۽ ان مان ڇا نڪتو

هيلو سڀ! هن جي اڳوڻو مضمون، مون واعدو ڪيو ته ڊڪر ۾ ڊڪر کي هلائڻ ۽ هن سبق کي استعمال ڪرڻ جي عملي پهلوئن بابت ڳالهائڻ. اهو توهان جو واعدو رکڻ جو وقت آهي. هڪ تجربيڪار ڊوپسر شايد اعتراض ڪندو ته جن کي ڊڪر جي اندر Docker جي ضرورت آهي بس ڊاڪر ڊيمون ساکٽ کي ميزبان کان ڪنٽينر ۾ اڳتي وڌو ۽ اهو 99٪ ڪيسن ۾ ڪافي هوندو. پر مون تي ڪوڪيز اڇلائڻ لاءِ تڪڙ نه ڪريو، ڇو ته اسان اصل ۾ ڊاڪر اندر ڊڪر کي هلائڻ بابت ڳالهائينداسين. ھن حل ۾ ڪيتريون ئي ممڪن ايپليڪيشنون آھن ۽ ھي مضمون انھن مان ھڪڙي بابت آھي، تنھنڪري پوئتي ويھي رھو ۽ پنھنجي ھٿن کي پنھنجي اڳيان سڌو ڪريو.

مان ڊڪر جي اندر ڊڪر کي ڪيئن ڊوڙايو ۽ ان مان ڇا نڪتو

شروعات

اهو سڀ ڪجهه سيپٽمبر جي برسات جي شام تي شروع ٿيو جڏهن مان ڊجيٽل سمنڊ تي $5 لاءِ ڪرائي تي ڏنل مشين کي صاف ڪري رهيو هوس، جيڪا هن حقيقت جي ڪري منجمد ٿي وئي هئي ته ڊڪر پنهنجي تصويرن ۽ ڪنٽينرز سان موجود ڊسڪ اسپيس جي 24 گيگا بائيٽ کي ڀري ڇڏيو هو. ستم ظريفي اها هئي ته اهي سڀئي تصويرون ۽ ڪنٽينر عارضي هئا ۽ صرف منهنجي ايپليڪيشن جي ڪارڪردگي کي جانچڻ لاءِ هر وقت لائبريري يا فريم ورڪ جو نئون ورزن جاري ڪيو ويو. مون ڪوشش ڪئي شيل اسڪرپٽ لکڻ ۽ ڪچري کي صاف ڪرڻ لاءِ ڪرون شيڊول قائم ڪرڻ ، پر اهو مدد نه ڪيو: هر ڀيري اهو ناگزير طور تي ختم ٿي ويو منهنجي سرور جي ڊسڪ اسپيس کائي وڃڻ ۽ سرور لٽڪڻ (بهترين طور تي). ڪجهه نقطي تي، مون وٽ هڪ مضمون آيو ته جينڪنز کي ڪيئن هلائڻ لاء هڪ ڪنٽينر ۾ ۽ اهو ڪيئن ٺاهي ۽ ختم ڪري سگهي ٿو تعمير پائپ لائنز ذريعي ڊاکر ڊيمن ساکٽ ذريعي ان ۾ اڳتي وڌايو ويو. مون کي اهو خيال پسند آيو، پر مون فيصلو ڪيو ته اڳتي وڌو ۽ تجربو ڪرڻ جي ڪوشش ڪريو سڌو سنئون ڊاڪر اندر ڊڪر کي هلائڻ. ان وقت، اهو مون کي مڪمل طور تي منطقي حل لڳي رهيو هو ڊاڪر تصويرون ڊائون لوڊ ڪرڻ ۽ انهن سڀني ايپليڪيشنن لاءِ ڪنٽينر ٺاهي جيڪي مون کي ٻئي ڪنٽينر جي اندر جاچڻ لاءِ گهربل آهن (اچو ته ان کي اسٽيجنگ ڪنٽينر سڏين). اهو خيال هو ته اسٽيجنگ ڪنٽينر کي -rm پرچم سان شروع ڪيو وڃي، جيڪو خودڪار طريقي سان مڪمل ڪنٽينر ۽ ان جي سڀني مواد کي ختم ڪري ٿو جڏهن اهو بند ڪيو وڃي. مون ڊاڪر جي تصوير سان ڊاڪر کان پاڻ کي ڇڪايو (https://hub.docker.com/_/docker)، پر اهو تمام گهڻو مشڪل ثابت ٿيو ۽ مان ڪڏهن به ان کي حاصل ڪرڻ ۾ ڪامياب نه ٿي سگهيو آهيان جيئن مون کي ضرورت هئي ۽ مان چاهيان ٿو ته هر طريقي سان پاڻ هلان.

مشق. ڪونز

مان ڪنٽينر کي ڪم ڪرڻ لاءِ تيار ٿي ويس جيئن مون کي ضرورت هئي ۽ پنهنجا تجربا جاري رکيا، جنهن جي نتيجي ۾ بيشمار ڪڪرن جو نتيجو نڪتو. منهنجي خود تشدد جو نتيجو هيٺ ڏنل الگورتھم هو:

  1. اسان ڊاڪر ڪنٽينر کي انٽرويو موڊ ۾ لانچ ڪيو.

    docker run --privileged -it docker:18.09.6

    ڪنٽينر جي نسخي تي ڌيان ڏيو، ساڄي يا کاٻي قدم ۽ توهان جو DinD ڪدو ۾ ڦيرايو. حقيقت ۾، شيون اڪثر ڀڃندا آهن جڏهن هڪ نئون نسخو جاري ڪيو ويو آهي.
    اسان کي فوري طور تي شيل ۾ داخل ٿيڻ گهرجي.

  2. اسان اهو معلوم ڪرڻ جي ڪوشش ڪري رهيا آهيون ته ڪهڙا ڪنٽينر هلي رهيا آهن (جواب: ڪو به نه)، پر اچو ته حڪم هلون ڪنهن به صورت ۾:

    docker ps

    توهان ٿورو حيران ٿي ويندا، پر اهو ظاهر ٿئي ٿو ته ڊاکر ڊيمن به نه هلندو آهي:

    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. اچو ته پاڻ هلون:

    dockerd &

    ٻيو ناپسنديده تعجب:

    failed to start daemon: Error initializing network controller: error obtaining controller instance: failed 
    to create NAT chain DOCKER: Iptables not found

  4. انسٽال ڪريو iptables ۽ bash پيڪيجز (سڀ ڪجھ وڌيڪ خوشگوار آھي بش ۾ ڪم ڪرڻ لاءِ sh جي ڀيٽ ۾):

    apk add --no-cache iptables bash

  5. اچو ته لانچ ڪريون bash. آخرڪار اسان معمول جي شيل ۾ واپس آيا آهيون

  6. اچو ته Docker کي ٻيهر هلائڻ جي ڪوشش ڪريون:

    dockerd &

    اسان کي ڏسڻ گهرجي لاگن جي هڪ ڊگهي شيٽ سان ختم ٿيڻ سان:

    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. اسان واپس بش ۾ آهيون.

ھاڻي کان، اسان ڪوشش ڪري سگھون ٿا ٻين ڪنٽينرز کي اسان جي ڊاڪر ڪنٽينر اندر لانچ ڪرڻ جي، پر ڇا جيڪڏھن اسان کي اسان جي ڊاکر ڪنٽينر جي اندر ھڪڙو ٻيو ڊاکر ڪنٽينر لانچ ڪرڻ گھرجي يا ڪجھھ غلط ٿي وڃي ۽ ڪنٽينر حادثو ٿئي؟ سڀ ٻيهر شروع ڪريو.

پنهنجو DinD ڪنٽينر ۽ نوان تجربا

مان ڊڪر جي اندر ڊڪر کي ڪيئن ڊوڙايو ۽ ان مان ڇا نڪتو
مٿي ڏنل قدمن کي بار بار ورجائڻ کان بچڻ لاءِ، مون پنهنجو DinD ڪنٽينر ٺاهيو:

https://github.com/alekslitvinenk/dind

ڪم ڪندڙ DinD حل مون کي ڊاڪر اندر ڊاکر کي بار بار هلائڻ ۽ وڌيڪ جرئتمند تجربا ڪرڻ جي صلاحيت ڏني.
مان ھاڻي MySQL ۽ Nodejs کي ھلائڻ سان ھڪڙو (ڪاميابي) تجربو بيان ڪرڻ وارو آھيان.
سڀ کان وڌيڪ بي صبر ڏسي سگهي ٿو ته اهو هتي ڪيئن هو

تنهن ڪري ، اچو ته شروع ڪريون:

  1. اسان DinD کي انٽرويو موڊ ۾ لانچ ڪيو. DinD جي هن نسخي ۾، اسان کي دستي طور تي سڀني بندرگاهن کي نقشي ڪرڻ جي ضرورت آهي جيڪي اسان جا ٻار ڪنٽينر استعمال ڪري سگھن ٿا (مان اڳ ۾ ئي ان تي ڪم ڪري رهيو آهيان)

    docker run --privileged -it 
    -p 80:8080 
    -p 3306:3306 
    alekslitvinenk/dind

    اسان بيش ۾ وڃون ٿا، جتان اسان فوري طور تي ٻارن جي ڪنٽينر کي لانچ ڪرڻ شروع ڪري سگھون ٿا.

  2. MySQL لانچ ڪريو:

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

  3. اسان ڊيٽابيس سان ساڳي طرح ڳنڍيون ٿا جيئن اسان ان کي مقامي طور تي ڳنڍيندا سين. اچو ته پڪ ڪريو ته هر شي ڪم ڪري ٿي.

  4. ٻيو ڪنٽينر لانچ ڪريو:

    docker run -d --rm -p 8080:8080 alekslitvinenk/hello-world-nodejs-server

    مهرباني ڪري نوٽ ڪريو ته پورٽ ميپنگ بلڪل صحيح هوندي 8080:8080، ڇاڪاڻ ته اسان اڳ ۾ ئي بندرگاهه 80 کي ميزبان کان والدين ڪنٽينر تائين پورٽ 8080 ڏانهن نقشو ڪيو آهي.

  5. اسان برائوزر ۾ localhost ڏانھن وڃون ٿا، پڪ ڪريو ته سرور جواب ڏئي ٿو "هيلو ورلڊ!"

منهنجي صورت ۾، nested Docker ڪنٽينرز سان تجربو ڪافي مثبت ثابت ٿيو ۽ مان منصوبي کي ترقي ڪرڻ ۽ اسٽيجنگ لاءِ استعمال ڪرڻ جاري رکندس. اهو مون کي لڳي ٿو ته هي ڪبرنيٽس ۽ جينڪنز ايڪس جي ڀيٽ ۾ گهڻو وڌيڪ هلڪو حل آهي. پر هي منهنجو موضوعي راء آهي.

مان سمجهان ٿو ته اهو سڀ ڪجهه اڄ جي مضمون لاء آهي. ايندڙ آرٽيڪل ۾ آئون بيان ڪندس وڌيڪ تفصيلي تجربن سان ڊاڪر کي بار بار هلائڻ سان ڊاڪر ۾ ۽ چڙهڻ واريون ڊائريڪٽريون اندريون ڪنٽينرز ۾.

پي ايس جيڪڏھن توھان ھي پروجيڪٽ مفيد ڳوليندا آھيو، مھرباني ڪري ان کي GitHub تي ھڪڙو اسٽار ڏيو، ان کي ڇڪيو ۽ پنھنجي دوستن کي ٻڌايو.

ايڊٽ 1 درست ٿيل غلطيون، 2 وڊيوز تي مرڪوز

جو ذريعو: www.habr.com

تبصرو شامل ڪريو