میں نے ڈوکر کو ڈوکر کے اندر کیسے چلایا اور اس سے کیا نکلا۔

سب کو سلام! اس میں پچھلا مضمون، میں نے ڈوکر میں ڈوکر چلانے اور اس سبق کو استعمال کرنے کے عملی پہلوؤں کے بارے میں بات کرنے کا وعدہ کیا۔ یہ اپنا وعدہ نبھانے کا وقت ہے۔ ایک تجربہ کار ڈیوپر شاید اعتراض کرے گا کہ جن کو Docker کے اندر Docker کی ضرورت ہے وہ بس Docker ڈیمون ساکٹ کو میزبان سے کنٹینر میں آگے بھیج دیتے ہیں اور یہ 99٪ معاملات میں کافی ہوگا۔ لیکن مجھ پر کوکیز پھینکنے میں جلدی نہ کریں، کیونکہ ہم دراصل Docker کے اندر Docker چلانے کے بارے میں بات کریں گے۔ اس حل میں بہت سے ممکنہ ایپلی کیشنز ہیں اور یہ مضمون ان میں سے ایک کے بارے میں ہے، لہذا پیچھے بیٹھیں اور اپنے بازوؤں کو اپنے سامنے سیدھا کریں۔

میں نے ڈوکر کو ڈوکر کے اندر کیسے چلایا اور اس سے کیا نکلا۔

شروع

یہ سب ستمبر کی ایک برسات کی شام کو شروع ہوا جب میں ڈیجیٹل اوشین پر $5 میں کرائے پر لی گئی مشین کو صاف کر رہا تھا، جو اس حقیقت کی وجہ سے منجمد ہو گئی تھی کہ ڈوکر نے اپنی تصاویر اور کنٹینرز سے دستیاب ڈسک کی تمام 24 گیگا بائٹس جگہ بھر دی تھی۔ ستم ظریفی یہ تھی کہ یہ تمام تصاویر اور کنٹینرز عارضی تھے اور جب بھی لائبریری یا فریم ورک کا نیا ورژن جاری کیا جاتا تھا تو صرف میری درخواست کی کارکردگی کو جانچنے کے لیے ان کی ضرورت تھی۔ میں نے شیل اسکرپٹس لکھنے اور کچرے کو صاف کرنے کے لیے کرون شیڈول ترتیب دینے کی کوشش کی، لیکن اس سے کوئی فائدہ نہیں ہوا: ہر بار جب یہ لامحالہ میرے سرور کی ڈسک کی جگہ کھا جانے اور سرور لٹکنے کے ساتھ ختم ہوتا ہے (بہترین طور پر)۔ کسی موقع پر، میں نے ایک مضمون دیکھا کہ جینکنز کو کنٹینر میں کیسے چلایا جائے اور یہ اس میں آگے بھیجے گئے ڈاکر ڈیمون ساکٹ کے ذریعے بلڈ پائپ لائن کیسے بنا اور حذف کر سکتا ہے۔ مجھے یہ خیال پسند آیا، لیکن میں نے مزید آگے جانے کا فیصلہ کیا اور Docker کے اندر براہ راست Docker چلانے کے ساتھ تجربہ کرنے کی کوشش کی۔ اس وقت، یہ مجھے ڈوکر امیجز کو ڈاؤن لوڈ کرنے اور ان تمام ایپلی کیشنز کے لیے کنٹینرز بنانے کا ایک مکمل منطقی حل لگتا تھا جن کی مجھے دوسرے کنٹینر کے اندر جانچ کے لیے ضرورت تھی (آئیے اسے سٹیجنگ کنٹینر کہتے ہیں)۔ خیال یہ تھا کہ اسٹیجنگ کنٹینر کو -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 کی نسبت bash میں کام کرنا ہر چیز زیادہ خوشگوار ہے):

    apk add --no-cache iptables bash

  5. آئیے بیش لانچ کریں۔ آخر کار ہم معمول کے خول میں واپس آ گئے۔

  6. آئیے ڈوکر کو دوبارہ شروع کرنے کی کوشش کریں:

    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. انٹر دبائیں. ہم واپسی میں آ گئے ہیں۔

اب سے، ہم اپنے Docker کنٹینر کے اندر دوسرے کنٹینرز کو لانچ کرنے کی کوشش کر سکتے ہیں، لیکن اگر ہم اپنے Docker کنٹینر کے اندر کوئی اور Docker کنٹینر لانچ کرنا چاہیں یا کچھ غلط ہو جائے اور کنٹینر کریش ہو جائے تو کیا ہوگا؟ دوبارہ شروع کریں۔

خود DinD کنٹینر اور نئے تجربات

میں نے ڈوکر کو ڈوکر کے اندر کیسے چلایا اور اس سے کیا نکلا۔
مندرجہ بالا اقدامات کو بار بار دہرانے سے بچنے کے لیے، میں نے اپنا DinD کنٹینر بنایا:

https://github.com/alekslitvinenk/dind

کام کرنے والے DinD حل نے مجھے Docker کے اندر Docker کو بار بار چلانے اور مزید مہم جوئی کے تجربات کرنے کی صلاحیت فراہم کی۔
میں اب 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. ہم براؤزر میں لوکل ہوسٹ پر جاتے ہیں، یقینی بنائیں کہ سرور "ہیلو ورلڈ!" کا جواب دیتا ہے۔

میرے معاملے میں، نیسٹڈ ڈوکر کنٹینرز کے ساتھ تجربہ کافی مثبت نکلا اور میں اس پروجیکٹ کو تیار کرتا رہوں گا اور اسے اسٹیجنگ کے لیے استعمال کرتا رہوں گا۔ مجھے ایسا لگتا ہے کہ یہ Kubernetes اور Jenkins X سے کہیں زیادہ ہلکا پھلکا حل ہے۔ لیکن یہ میری موضوعی رائے ہے۔

میرے خیال میں آج کے مضمون کے لیے بس اتنا ہی ہے۔ اگلے مضمون میں میں Docker کو بار بار ڈوکر میں چلانے اور نیسٹڈ کنٹینرز میں گہرائی میں ڈائرکٹریوں کو بڑھاتے ہوئے مزید تفصیل سے تجربات کی وضاحت کروں گا۔

PS اگر آپ کو یہ پروجیکٹ مفید لگتا ہے، تو براہ کرم اسے GitHub پر ایک ستارہ دیں، اسے فورک کریں اور اپنے دوستوں کو بتائیں۔

ترمیم 1 غلطیاں درست کی گئیں، 2 ویڈیوز پر فوکس کیا گیا۔

ماخذ: www.habr.com

نیا تبصرہ شامل کریں