گو ایپلیکیشن کو ڈوکرائز کرنے کا طریقہ – مرحلہ وار مکمل واک تھرو

تصور کریں کہ آپ اپنا سورس کوڈ کسی ایسے شخص کے ساتھ شیئر کرنا چاہتے ہیں جس کے کمپیوٹر پر گو انسٹال نہیں ہے۔ بدقسمتی سے، یہ شخص آپ کی درخواست نہیں چلا سکے گا۔ یہاں تک کہ اگر آپ نے Go انسٹال کر رکھا ہے تو، مختلف مقامی ترقیاتی ماحول کی وجہ سے ایپلیکیشن کا رویہ مختلف ہو سکتا ہے۔

تو آپ اپنی درخواست کو کیسے بنڈل کرتے ہیں تاکہ یہ تمام مقامی ماحول میں اسی طرح چل سکے؟ یہ وہ جگہ ہے جہاں ڈوکر کھیل میں آتا ہے۔

ابتدائیوں کے لیے، Docker ہمیشہ سمجھنے کے لیے آسان تصور نہیں ہوتا ہے۔ لیکن میں وعدہ کرتا ہوں کہ ایک بار جب آپ اسے سمجھ لیں گے تو یہ بہت دلچسپ ہوگا۔ یہ اتنا دلچسپ ہے کہ آپ اپنے استعمال کردہ ہر ایپلیکیشن کو ڈاک کرنا چاہیں گے۔

اس مضمون میں، ہم گو ایپلیکیشن کو کیس اسٹڈی کے طور پر لیں گے۔ یہاں بیان کردہ کنٹینرائزیشن کے بنیادی تصورات قابل منتقلی ہیں، لہذا اس بارے میں زیادہ فکر نہ کریں کہ آپ کی درخواست کو کسی دوسری زبان میں ڈاک کرنا کیسا نظر آئے گا۔

آئیے صرف Docker، تصاویر اور کنٹینرز کے ساتھ ایک گو ایپ کو Dockerizing کی بنیادی باتوں کو دیکھتے ہیں، Docker Compose کا استعمال کرتے ہوئے ایک ایپلیکیشن کے لیے متعدد کنٹینرز ترتیب دینے، اور Docker Compose فائلوں کو منظم کرنے کے لیے۔

اس مضمون کے اختتام تک، آپ کو بنیادی طور پر سمجھ آ جائے گی کہ ڈوکر کیا ہے، تصویر یا کنٹینر کیا ہے، اور Docker Compose کا استعمال کرتے ہوئے متعدد منحصر کنٹینرز کو کیسے مربوط کیا جائے۔

ہم کیا احاطہ کریں گے:

  1. شرطیں

  2. Docker کیا ہے؟

  3. ڈوکر کو انسٹال کرنے کا طریقہ

  4. ڈاکر فائل کیا ہے؟

  5. ڈوکر کمپوز کیا ہے؟

  6. ایپ کنٹینر

  7. ڈیٹا بیس کنٹینر

  8. phpMyAdmin کنٹینر

  9. سب کچھ ایک ساتھ چلائیں

  10. ختم

شرطیں

اس ٹیوٹوریل کی پیروی کرنے کے لیے آپ کو Docker کے بارے میں کسی پیشگی معلومات کی ضرورت نہیں ہے۔ یہ مضمون ایک ابتدائی POV کو ذہن میں رکھ کر لکھا گیا ہے، لہذا اگر آپ اس تصور میں نئے ہیں تو یہ ٹھیک ہے۔

یہاں استعمال کردہ گو کوڈنگ کی مثالوں کو مکمل طور پر استعمال کرنے اور سمجھنے کے لیے، گولانگ کے بارے میں کچھ بنیادی معلومات حاصل کرنا مددگار ثابت ہوگا۔ اگر آپ پہلے سے ہی سمجھتے ہیں کہ اپنے مقامی کمپیوٹر پر گو ایپلیکیشن کیسے ترتیب دی جائے، تو اب شروع کرنے کا اچھا وقت ہے۔ اگر نہیں، تو اس مضمون کو دیکھیں کہ گو میں کوڈنگ کیسے شروع کی جائے۔

Docker کیا ہے؟

تصور کریں کہ آپ کے پاس ایک باکس ہے۔ اپنا کوڈ اور اسے چلانے کے لیے درکار ہر چیز کو اس باکس میں رکھیں۔ یعنی وہ پروگرامنگ لینگویج جو آپ استعمال کرتے ہیں اور کوئی اور بیرونی پیکیج جو آپ کو انسٹال کرنے کی ضرورت ہے۔

اگر کسی کو آپ کی درخواست کی ضرورت ہے، تو بس اسے باکس دے دیں۔ آپ اس باکس کو جتنے لوگوں کو چاہیں آگے بھیج سکتے ہیں۔ آپ کو اپنے کمپیوٹر پر کوئی بھی زبان یا کوئی اور چیز انسٹال کرنے کی ضرورت نہیں ہے کیونکہ آپ کی ضرورت کی ہر چیز پہلے ہی باکس میں موجود ہے۔ لہذا جب آپ اپنی درخواست چلاتے ہیں، تو آپ اصل میں کیا کر رہے ہیں اس باکس کی ایک مثال چلانا ہے۔

ایپ باکس کے اندر چلتی ہے، جو ایک معیاری ماحول ہے۔ اس کا مطلب یہ ہے کہ ہر اس شخص کے لیے جو باکس کو وصول کرتا ہے اور "کھلاتا ہے”، ایپلیکیشن بالکل اسی طرح چلے گی۔

Docker کی مدد سے، آپ کی ایپ مختلف سسٹمز پر یکساں حالات میں چل سکتی ہے اور "یہ میری مشین پر کام کرتی ہے” کے مسئلے سے بچ سکتی ہے۔

تکنیکی ڈوکر کی شرائط میں، یہ باکس ہے ویڈیو چل رہا ہے مثال کنٹینر.

ایک تصویر ایک ہلکا پھلکا، اسٹینڈ اکیکیوٹ ایبل پیکیج ہے جس میں سافٹ ویئر چلانے کے لیے درکار ہر چیز ہوتی ہے۔ اس کا مطلب ہے کہ اس میں کوڈ، رن ٹائم، لائبریریاں، سسٹم ٹولز، اور یہاں تک کہ آپریٹنگ سسٹم بھی شامل ہے۔

ایک کنٹینر صرف ایک امیج کی چلانے کے قابل مثال ہے۔ یہ ایک مخصوص ایپلیکیشن کے لیے عمل درآمد کے ماحول کی نمائندگی کرتا ہے۔

اگر یہ سب تجریدی لگتا ہے تو پریشان نہ ہوں۔ ہم تھوڑی دیر میں اپنے ہاتھ گندے کر لیں گے۔

ڈوکر کو انسٹال کرنے کا طریقہ

Docker کو انسٹال کرنے کے لیے، ہم Docker ڈیسک ٹاپ انسٹال کریں گے، جو Docker انجن کے ساتھ بنڈل ہے۔ Docker Destop کنٹینر کے انتظام کے لیے ایک GUI ہے، اور آپ دیکھیں گے کہ یہ اگلے حصوں میں کتنا مفید ہے۔

اس تحریر کے وقت، میں WSL (Windows Subsystem for Linux) استعمال کر رہا ہوں۔ اگر آپ ایک ہی کام کر رہے ہیں تو، Docker کو مختلف آپریٹنگ سسٹمز کے لیے انسٹالیشن کی مختلف شرائط اور اقدامات درکار ہیں، لہذا آپ کو انسٹال کرنے سے پہلے ان پر غور کرنے کی ضرورت ہوگی۔

ڈبلیو ایس ایل پر ڈوکر ڈیسک ٹاپ انسٹال کرنے کے لیے

  1. ونڈوز ڈاؤن لوڈ اور انسٹال کریں۔ .exe فائل

  2. اسٹارٹ مینو سے ڈوکر ڈیسک ٹاپ لانچ کریں اور سیٹنگز پر جائیں۔

  3. منتخب کریں WSL 2 پر مبنی انجن استعمال کرتا ہے۔ پر جنرل ٹیگ

  4. اپلائی پر کلک کریں۔

یہ WSL انسٹالیشن کے لیے ہے۔ اگر آپ ایک مختلف آپریٹنگ سسٹم چلا رہے ہیں، تو آفیشل دستاویزات میں انسٹالیشن کے اختیارات کی فہرست موجود ہے۔

ڈاکر فائل کیا ہے؟

ابتدائی طور پر ایک باکس بنانے کے لیے، Docker آپ سے چند مختصر مراحل پر عمل کرنے کی ضرورت ہے۔ آپ کو انحصار اور رن ٹائم جاننے کی ضرورت ہے، اور آپ کے پاس سورس کوڈ ہونا ضروری ہے۔ یہ تمام اقدامات ڈاکر فائل میں درج ہیں۔

اس سے پہلے کہ ہم کریکنگ شروع کریں، آئیے ایک ورکنگ ڈائرکٹری بنائیں اور اسے دریافت کریں۔

mkdir go_book_api && cd go_book_api

اپنی درخواست میں گو ماڈیول کو شروع کرنے کے لیے درج ذیل کمانڈ کو چلائیں:

go mod init go_book_api

یہ ہے go.mod ایک فائل جو پروجیکٹ کے انحصار کو ٹریک کرتی ہے۔ منصوبے کی جڑ میں cmd ڈائریکٹری اور main.go اس میں فائل رکھو۔ یہ آپ کی درخواست کے داخلے کے نقطہ کے طور پر کام کرتا ہے۔ پر main.go آپ اپنی فائل میں ایک سادہ پرنٹ اسٹیٹمنٹ استعمال کر سکتے ہیں۔

// cmd/main.go
package main

import "fmt"

func main() {
	fmt.Println("Look at me gooo!")
}

اب پروجیکٹ روٹ میں ایک فائل بنائیں اور اسے کال کریں۔ Dockerfile. اس فائل میں کوئی توسیع نہیں ہے، لیکن سسٹم خود بخود تسلیم کرتا ہے کہ یہ ڈوکر کمانڈز کی فائل ہے۔

آئیے آگے بڑھیں اور درج ذیل کو اس فائل میں چسپاں کریں اور پھر ایک ایک کرکے ان کے ذریعے جائیں۔

# base image
FROM golang:1.24

# define the working directory
WORKDIR /app

# copy the go.mod and go.sum so that the packages to be installed
# are known in the container. ./ here is the WORKDIR, /app
COPY go.mod ./

# command to install modules
RUN go mod download

# copy source code into working dir
COPY . .

# build
RUN CGO_ENABLED=0 GOOS=linux go build -o /docker-gs-ping ./cmd/main.go

# run the compiled binary when the container starts
CMD ["/docker-gs-ping"]

زیادہ تر ڈاکر فائلیں ایک بنیادی تصویر کے ساتھ شروع ہوتی ہیں جس کی وضاحت کی گئی ہے: FROM کلیدی لفظ بیس امیج ایک بیس ٹیمپلیٹ ہے جو کم از کم آپریٹنگ سسٹم کا ماحول، لائبریریاں، یا کنٹینر کے اندر ایپلیکیشن بنانے اور چلانے کے لیے درکار انحصار فراہم کرتا ہے۔

اس صورت میں بنیادی تصویر ہو گی: golang:1.24 . بیس امیج ایک آپریٹنگ سسٹم ہو سکتا ہے جیسے کہ لینکس۔ اس صورت میں۔ اگر آپ اپنا کوڈ کسی ایسے شخص کو دے رہے ہیں جو لینکس آپریٹنگ سسٹم نہیں چلا رہا ہے، تو آپ کو پریشان ہونے کی ضرورت نہیں ہے کیونکہ وہ آپ کی ایپلیکیشن کو ایسے ماحول میں چلا رہے ہوں گے جس میں پہلے سے کم سے کم لینکس OS انسٹال ہو۔ اسی طرح، جن لوگوں کے پاس مقامی طور پر گو انسٹال نہیں ہے وہ آپ کی ایپلیکیشن چلا سکتے ہیں۔

یہ جاننے کے لیے کہ اپنی ڈاکر فائل کو ترتیب دیتے وقت کون سی بیس امیج استعمال کرنی ہے، آپ شائع شدہ امیجز کے لیے آفیشل ڈوکر ہب ریپوزٹری کو ہمیشہ قریب سے دیکھ سکتے ہیں۔ اس صورت میں، آپ گولانگ کی طرف سے سرکاری طور پر جاری کردہ ڈیفالٹ تصویر کو یہاں دیکھ سکتے ہیں۔

اگلا مرحلہ ورکنگ ڈائرکٹری کی وضاحت کرنا ہے۔ باکس کے اندر آپ کو ایک ایسا فائل سسٹم ملے گا جو آپ کو لینکس سسٹم پر ملنے والی تقریباً ایک جیسی ہے۔ اس طرح کے فولڈرز ہیں: /app، /bin ، /usr اور /var وغیرہ۔ اس صورت میں، آپ نے جس ورکنگ ڈائرکٹری کی وضاحت کی ہے وہ ہے: /appاور یہ ختم ہو گیا ہے WORKDIR حکم

ورکنگ ڈائرکٹری سیٹ کرنے کے بعد go.mod اور go.sum فائل کو فائل میں شامل کریں تاکہ ڈوکر کو معلوم ہو کہ باکس میں کون سی انحصار شامل کرنا ہے۔

کہ COPY ڈوکر میں کمانڈز دو یا زیادہ دلائل لیتے ہیں: ایک سورس ڈائرکٹری اور ایک ٹارگٹ ڈائرکٹری۔ اس معاملے میں میں اسے کاپی کرنا چاہتا ہوں۔ go.mod اور go.sum باکس کی ورکنگ ڈائرکٹری میں /app.

باکس میں بیان کردہ تمام ماڈیولز کو ڈاؤن لوڈ اور انسٹال کرنے کے لیے ایک کمانڈ چلائیں۔ go.mod فائل ڈوکر ماحول میں کمانڈ چلانے کے لیے، استعمال کریں: RUN پھر حکم ہوگا: go mod download اس صورت میں.

اگلا مرحلہ آپ کے پاس موجود سورس کوڈ کو اپنی ورکنگ ڈائرکٹری میں کاپی کرنا ہے۔

اب ہمارے پاس انحصار اور سورس کوڈ ہے۔ آخری مرحلہ گو ایپلیکیشن کو ایک ہی قابل عمل میں بنانا ہے جسے ماحول کے اندر (کنٹینر کے اندر) چلایا جا سکتا ہے۔

کنٹینر کے اندر، مرتب شدہ بائنریز موجود ہیں: /docker-gs-pingیہ آپ کے کوڈ کو مرتب کرنے کا نتیجہ ہے۔ main.go فائل آخری مرحلہ ہے۔ RUN ایک کمانڈ جو ڈوکر کو کہتی ہے کہ وہ اسے بنانے کے بعد ایک قابل عمل بائنری چلائے۔ اس کا مطلب ہے "جب کنٹینر چلنا شروع ہو تو اس بائنری فائل پر عمل کریں۔”

ان مراحل کے ذریعے، Docker ایک تصویر بناتا ہے (ایک باکس، تشبیہ کے لحاظ سے) جسے صارف چلا سکتا ہے۔ تصویر بنانے کے لیے، بس اپنے ٹرمینل میں درج ذیل کمانڈ کو چلائیں:

docker build -t go_book_api .

کہ docker build کمانڈ Docker سے کہتی ہے کہ Dockerfile میں درج مراحل پر عمل کرتے ہوئے تصویر بنائیں۔ -t ٹیگ کے لیے ایک جھنڈا ہے اور کنٹینر چلاتے وقت بعد میں تصویر کا حوالہ دینے میں آپ کی مدد کرتا ہے۔

ٹیگز کے ساتھ تصویر کو ایک نام دیں۔ go_book_api اس صورت میں. کہ . آخری حصہ اہم ہے کیونکہ یہ ڈوکر کو بتاتا ہے کہ زیر بحث ڈوکر فائل کہاں ہے اور اسے کون سی فائلوں کی تصویر میں کاپی کرنے کی ضرورت ہے۔

میرے IDE میں عمارت اس طرح دکھتی ہے:

IDE ٹرمینل کا اسکرین شاٹ دکھا رہا ہے کہ ڈوکر امیج بن رہی ہے۔

اگر آپ ڈاکر کمپوز میں امیجز ٹیب کو چیک کرتے ہیں تو آپ دیکھیں گے کہ امیج بن چکی ہے۔

ڈوکر ڈیسک ٹاپ پر بنی ہوئی کنٹینر امیج کا اسکرین شاٹ

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

آپ دائیں جانب چھوٹے پلے بٹن پر کلک کرکے تصویری مثال (کنٹینر) لانچ کرسکتے ہیں۔

ایک نیا کنٹینر لانچ کرنے کے لیے ڈوکر کمپوز موڈل کا اسکرین شاٹ۔

آپ اپنے کنٹینر کو ایک وضاحتی نام دے سکتے ہیں (بصورت دیگر ڈوکر ایک بے ترتیب نام پیدا کرے گا) اور رن بٹن پر کلک کریں۔ جب کنٹینر چلنا شروع ہو جائے گا، آپ کو اس کے لاگ پیج پر بھیج دیا جائے گا۔

کنٹینر چل رہا ہے! آپ دیکھ سکتے ہیں کہ یہ آپ کی درخواست کی چل رہی مثال ہے۔

ڈوکر کمپوز میں چلنے والے ڈوکر کنٹینر کا اسکرین شاٹ

ڈوکر کمپوز کیا ہے؟

اگر آپ ایک سادہ گو ایپلیکیشن بنا رہے ہیں جس کے لیے کسی بیرونی انحصار کی ضرورت نہیں ہے، تو اوپر والا سیٹ اپ کافی ہونا چاہیے۔

یہاں کی مثال میں، ایپلیکیشن کو Books API کے لیے سمجھا جاتا ہے، لہذا آپ توقع کریں گے کہ اس کے پاس کچھ خدمات ہوں گی جیسے ڈیٹا بیس، اور ڈیٹا بیس مینیجر کلائنٹ جیسے کہ phpMyAdmin ویژولائزیشن یا ڈسپلے ٹیبلز کے لیے۔

اگر آپ یہ سب ایک فائل میں ترتیب دینا چاہتے ہیں، تو یہ صرف Docker کا استعمال کرتے ہوئے قدرے پیچیدہ ہو جاتا ہے۔ اس کی وجہ یہ ہے کہ ڈوکر آپ کو ایک فائل میں گو کے لیے ایک بیس امیج، آپ کے ڈیٹا بیس کے لیے ایک بیس امیج وغیرہ شامل کرنے کی اجازت نہیں دیتا ہے۔

آپ ایک چھوٹے آپریٹنگ سسٹم کی بنیادی تصویر استعمال کر سکتے ہیں اور پھر ان دیگر سروسز کو انحصار کے طور پر دستی طور پر انسٹال کرنے کے لیے کمانڈ چلا سکتے ہیں، لیکن یہ طریقہ آپ کی ایپلیکیشن کو برقرار رکھنے اور اسکیل کرنا مشکل بنا دیتا ہے۔ اس کی سفارش نہیں کی جاتی ہے کیونکہ اگر ایک انحصار کریش ہو جاتا ہے تو پوری ایپلیکیشن فوری طور پر گر جائے گی۔

اس صورت حال کو حل کرنے کے لیے، Docker Compose آپ کو آپ کی درخواست کے لیے متعدد باہم منسلک کنٹینرز رکھنے کی اجازت دیتا ہے۔ ڈوکر کمپوز کنٹینر کے عمل کو درست ترتیب میں ہینڈل کرتا ہے، جس سے ایک کنٹینر کو دوسرے کنٹینر سے فولڈرز استعمال کرنے کی اجازت ملتی ہے، یا دوسرے کنٹینر میں ڈیٹا اسٹور کرنے کی بھی اجازت ہوتی ہے۔

خانہ کے بارے میں پچھلی مشابہت وہی ہے۔ تاہم، Docker Compose کی رعایت کے ساتھ، اب آپ کو صرف ایک باکس رکھنے کی ضرورت نہیں ہے۔

مختلف ڈویلپرز کی طرف اشارہ کرنے والے تیر کے ساتھ کئی کنٹینرز پر مشتمل ایک باکس کی تصویر

ڈوکر کمپوز کا مقصد آپ کی ایپلی کیشن کو چلانے کے لیے درکار متعدد امیجز کو مربوط کرنے میں مدد کرنا ہے۔ آپ اسے ایک سے زیادہ خانوں کو جوڑنے کے طور پر سوچ سکتے ہیں۔

جیسا کہ پہلے بیان کیا گیا ہے، ایپلیکیشن اس پر چلتی ہے: Go book api کنٹینرز کتاب کے ڈیٹا کو اس میں ذخیرہ کرنے کی اجازت دیتے ہیں جو آپ کی ایپلیکیشن تیار کرے گی: mysql یہ ایک کنٹینر ہے جو ایک ڈیٹا بیس ہے اور آپ phpMyadmin کا ​​استعمال کرکے ڈیٹا بیس کو دیکھ سکتے ہیں: phpMyadmin کنٹینر

اسے تکنیکی طور پر دیکھنے کے لیے: docker-compose.yml یہ فائل پروجیکٹ روٹ میں واقع ہے۔ اس فائل کا نام اہم ہے؛ ڈوکر کمپوز صرف درج ذیل فائل کے ناموں کو قبول کرتا ہے: compose.yml ، docker-compose.yml یا docker-compose.yaml. فائل ایکسٹینشن بتاتی ہے کہ کمانڈ درج ذیل زبان میں لکھی گئی تھی۔ yaml یہ ایک زبان ہے جو بنیادی طور پر فائلوں کو ترتیب دینے کے لیے استعمال ہوتی ہے۔

services:
  app:
    depends_on:
      - database
    build: 
      context: .
    container_name: go_book_api
    hostname: go_book_api
    networks:
      - go_book_api_net
    ports:
      - 8080:8080
    env_file:
      - .env
    
  database:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
      MYSQL_DATABASE: ${DB_NAME}
      MYSQL_PASSWORD: ${DB_PASSWORD}
      MYSQL_USER: ${DB_USER}
    volumes:
      - mysql-go:/var/lib/mysql
    ports:
      - 3356:3306
    networks:
      - go_book_api_net

  phpmyadmin:
    image: phpmyadmin
    restart: always
    ports:
      - 9000:80
    environment:
      PMA_HOST: database
      PMA_ARBITRARY: 1
    depends_on:
      - database
    networks:
      - go_book_api_net

volumes:
  mysql-go:

networks:
  go_book_api_net:
    driver: bridge

ڈوکر کمپوز فائل کی جڑ کی سطح پر ہمارے پاس ہے: services . یہ تمام کنٹینرز ہیں جو آپ کی درخواست کو چلانے کے لیے درکار ہیں، اور Docker Compose کے تناظر میں، ہر ایک کو سروس سمجھا جاتا ہے۔

کہ app کنٹینر

 app:
    depends_on:
      - database
    build: 
      context: .
    container_name: go_book_api
    hostname: go_book_api
    networks:
      - go_book_api_net
    ports:
      - 8080:8080
    env_file:
      - .env

پہلا کنٹینر ہے۔ app ایک کنٹینر جو گو ایپلیکیشن ہے۔ کے تحت app ایک کنٹینر کے لیے، ہمیں کچھ پیرامیٹرز کی وضاحت کرنے کی ضرورت ہے کہ اس کنٹینر کو بھی چلنا چاہیے۔

کہ depends_on پراپرٹیز کنٹینر کے اندر خدمات کے آغاز اور بند ہونے کے آرڈر کو کنٹرول کرتی ہیں۔ اس طرح، اگر کنٹینر A شروع کرنے کے لیے کنٹینر B پر انحصار کرتا ہے، تو کنٹینر A کو استعمال کرنے کے لیے کنٹینر B کو پہلے شروع کرنا چاہیے۔ اس صورت میں، database کنٹینر کو شروع کرنے سے پہلے اسے شروع کرنا ضروری ہے۔ app کنٹینر براہ کرم نوٹ کریں کہ اس کا مطلب یہ نہیں ہے۔ app ہمیشہ انتظار کریں گے database میں تیار ہوں۔

درج ذیل خصوصیات ہیں۔ build ڈوکر کمپوز کو آپ کے مقامی پروجیکٹ میں ڈوکر امیج بنانے کی ہدایت کرتا ہے۔ ایپلیکیشن کی ڈاکر فائل ایپ کے روٹ میں ہے، اس لیے اس کا استعمال کرتے ہوئے روٹ پاتھ کی وضاحت کریں: context مندرجہ ذیل خصوصیات: . .

کنٹینر کو ایک مخصوص نام دینے کے لیے، استعمال کریں: container_name. hostname یہ وہی ہے جو دوسرے کنٹینرز مواصلات کے لئے استعمال کرتے ہیں.

ڈوکر کمپوز کا پورا نقطہ ایک سے زیادہ کنٹینرز کو ایک دوسرے کے ساتھ بات چیت کرنے کی اجازت دینا ہے۔ یہ کام وہ اپنے نیٹ ورک کی مدد سے کرتے ہیں۔ تو ایک اور پراپرٹی بنائیں اور networksدرج کریں اور اسے ایک نام دیں۔ go_book_api_net . دوسرے تمام کنٹینرز کو جو آپ اس کنٹینر کے ساتھ منسلک کرنا چاہتے ہیں۔ appآپ اسی نیٹ ورک کی وضاحت کریں گے۔

درج ذیل خصوصیات ہیں۔ ports . آپ کی درخواست ایک API ہے۔ اس کا مطلب ہے کہ یہ بیک اینڈ گو سرور پر چل رہا ہے۔ API تک رسائی حاصل کرنے کے لیے، آپ کو کنٹینر میں موجود پورٹ سے مقامی بندرگاہ کا نقشہ بنانا چاہیے۔ نقشہ سازی بندرگاہوں. 8080 کمپیوٹر سے پورٹ تک 8080 کنٹینر میں۔

کہ env_file پراپرٹی ڈوکر کمپوز کو بتاتی ہے کہ ماحولیاتی متغیرات کو کہاں پڑھنا ہے۔ اس صورت میں .env اپنے کنٹینر کے لیے ضروری متغیرات کو ذخیرہ کرنے کے لیے فائل کو اپنے پروجیکٹ کی جڑ میں محفوظ کریں۔

کہ database کنٹینر

  database:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
      MYSQL_DATABASE: ${DB_NAME}
      MYSQL_PASSWORD: ${DB_PASSWORD}
      MYSQL_USER: ${DB_USER}
    volumes:
      - mysql-go:/var/lib/mysql
    ports:
      - 3356:3306
    networks:
      - go_book_api_net

دوسرا کنٹینر ہے۔ database کنٹینر آپ درج خدمات کو کوئی بھی نام دے سکتے ہیں جو آپ چاہتے ہیں، لیکن اپنے کنٹینرز کو وضاحتی نام دینا ہمیشہ ایک اچھا اصول ہوتا ہے۔

گو ایپلیکیشن ڈیٹا بیس کے لیے، اس صورت میں آپ MySQL ڈیٹا بیس کے ساتھ کام کر رہے ہوں گے۔ ایپلیکیشن چلانے کے لیے MySQL کی ضرورت ہے، لہذا آپ کو اسے خدمات میں سے ایک کے طور پر سیٹ اپ کرنے کی ضرورت ہے۔

یاد رکھیں کہ آپ کو اپنا کنٹینر بنانے کے لیے بیس امیج کی ضرورت ہے۔ اس صورت میں بنیادی تصویر ہو گی: mysql:8.0 آپ image اوپر کی خصوصیات۔ جب آپ اس کنٹینر کو ترتیب دینے کی کوشش کرتے ہیں، تو Docker Compose جانتا ہے کہ پہلے سے موجود سرکاری تصویر سے ڈیٹا بیس کنٹینر کیسے بنایا جائے۔

اگر آپ نے پہلے کبھی مقامی طور پر ڈیٹا بیس ترتیب دیا ہے، تو آپ جانتے ہیں کہ کنفیگریشن ایک ایسا مرحلہ ہے جسے آپ چھوڑ نہیں سکتے۔ آپ جو بھی ڈیٹا بیس بناتے ہیں اس کے لیے صارف، پاس ورڈ اور ڈیٹا بیس کا نام درکار ہوتا ہے۔ ان متغیرات کو اس میں ترتیب دیا جا سکتا ہے: environment جائیداد ان اقدار کو ہارڈ کوڈنگ کرنے کے بجائے: .env ایک فائل بنائیں اور ماحولیاتی متغیرات کا حوالہ دیں جیسا کہ یہاں کیا گیا ہے۔

ڈیٹا بیس سرور عام طور پر آنے والے کنکشنز کے لیے مخصوص پورٹ پر سنتا ہے، قطع نظر اس سے کہ ڈیٹا بیس مقامی طور پر چل رہا ہے یا دور سے۔ جیسا کہ آپ نے بیان کیا ہے۔ app کنٹینرز کے لیے، آپ اپنے ڈیٹا بیس کے لیے ایک پورٹ سیٹ کر سکتے ہیں اور اسے کنٹینر پر متعلقہ پورٹ پر نقشہ بنا سکتے ہیں۔ اگر آپ مقامی طور پر ڈیٹا بیس تک رسائی حاصل کرنا چاہتے ہیں تو اسے پورٹ پر کریں: 3356تمام درخواستیں بندرگاہ پر بھیجی جاتی ہیں۔ 3306 یہ ڈیٹا بیس کنٹینر میں ہے۔

ایک بار جب کنٹینر تیار ہو جاتا ہے اور ایپلیکیشن چلتی ہے اور پیدا ہوتی ہے اور ڈیٹا بیس میں ڈیٹا کو ذخیرہ کرنا شروع کر دیتی ہے، آپ دیکھیں گے کہ جب بھی آپ کنٹینر کو روکیں گے اور دوبارہ شروع کریں گے، ڈیٹا بیس میں ذخیرہ شدہ ڈیٹا ضائع ہو جائے گا۔

اس سے بچنے کے لیے، آپ کو اپنا ڈیٹا کنٹینر کے باہر اسٹور کرنا چاہیے۔ یہ اس بات کو یقینی بناتا ہے کہ جب بھی کنٹینر چلنا بند ہو جائے تو ڈیٹا بیس کا مواد ضائع نہیں ہوتا ہے۔

حجم کے لیے یہی ہے۔ آپ تمام مواد کو ذخیرہ کرنے کے لیے ڈیٹا بیس کنٹینر کے باہر ایک مخصوص مقام مختص کر سکتے ہیں۔ آپ کے لیے volume اس صورت میں، مخصوص اسٹوریج کی جگہ ہے: mysql-go:/var/lib/mysql .

بالکل اسی طرح جیسے نیٹ ورک قائم کرنا app اوپر کنٹینر go_book_api_netاس ڈیٹا بیس کنٹینر کے لیے ایک ہی نیٹ ورک کی وضاحت کریں۔ چونکہ ہم چاہتے ہیں کہ کنٹینرز ایک دوسرے کے ساتھ بات چیت کریں، اس لیے ان کا ایک ہی نیٹ ورک میں ہونا سمجھ میں آتا ہے۔

کہ phpMyAdmin کنٹینر

اس صورت میں، آخری کنٹینر یا سروس جس کی آپ کو ترتیب دینے کی ضرورت ہے (اختیاری) وہ phpMyAdmin کنٹینر ہے۔ ڈیٹا بیس کلائنٹ استعمال کرنا آسان ہے کیونکہ میں اپنے ڈیٹا بیس کی ساخت اور مواد کو آسانی سے دیکھ سکتا ہوں۔

 phpmyadmin:
    image: phpmyadmin
    restart: always
    ports:
      - 9000:80
    environment:
      PMA_HOST: database
      PMA_ARBITRARY: 1
    depends_on:
      - database
    networks:
      - go_book_api_net

یہ عمل تقریباً اس کنٹینر سے ملتا جلتا ہے جسے ہم نے پہلے ترتیب دیا تھا۔ ہم فارمولہ کھینچ کر شروع کرتے ہیں۔ phpmyadmin کنٹینرز کی تعمیر کے لیے ڈوکر میں ایک تصویر۔

کہ restart یہاں کے اختیارات اس بات کو یقینی بنانے کے لیے ہیں کہ جب آپ کنٹینر کو روکیں اور دوبارہ شروع کریں تو phpMyAdmin خود بخود دوبارہ لوڈ ہو جائے۔

آپ اپنے مقامی ماحول میں میزبان سسٹم سے بندرگاہ کے ذریعے اس سروس تک رسائی حاصل کر سکتے ہیں۔ 9000 اور یہ بندرگاہ کا نقشہ بناتا ہے۔ 80 کنٹینر میں۔

کے طور پر environment ، PMA_HOST phpMyAdmin کو درج ذیل میزبان سے منسلک ہونے کو کہو: database (یہ ایک ڈیٹا بیس کنٹینر ہے)۔ یہ کام کرتا ہے کیونکہ دونوں کنٹینرز ایک ہی نیٹ ورک پر ہیں۔ networks کی وجہ سے ہوتا ہے۔ PMA_ARBITRARY اس کا استعمال آپ کو UI کے ذریعے جڑنے کی اجازت دینے کے لیے کیا جاتا ہے اگر آپ کسی مختلف میزبان سے جڑنے کا فیصلہ کرتے ہیں (مثال کے طور پر، اگر آپ بعد میں کوئی اور ڈیٹا بیس ترتیب دیتے ہیں اور پھر بھی phpMyAdmin کے ذریعے جڑنا چاہتے ہیں)۔

ڈیٹا بیس کلائنٹ انحصار کرتے ہیں: database چونکہ یہ ایک کنٹینر ہے، آپ کو اس کی وضاحت کرنی چاہیے۔ depends_on:

volumes:
  mysql-go:

networks:
  go_book_api_net:
    driver: bridge

ڈوکر کمپوز فائل کا آخری سیکشن وہ ہے جہاں آپ اپنے کنٹینر کو سیٹ اپ کرنے کے لیے استعمال کیے جانے والے حجم اور نیٹ ورکس کے لیے نامزد اقدار کا اعلان کرتے ہیں۔

کے لیے volumesدرج ذیل اقدار کا اعلان کریں: mysql-go. اس کنٹینر کو ایک مخصوص سٹوریج مقام تفویض کریں جس کے ساتھ آپ اس والیوم کو منسلک کرنا چاہتے ہیں۔ آپ اسے ڈیٹا بیس کنٹینر میں استعمال ہوتے دیکھ سکتے ہیں۔

 volumes:
      - mysql-go:/var/lib/mysql

یہی تصور نیٹ ورکس پر لاگو ہوتا ہے۔ مندرجہ ذیل نیٹ ورکس کے نام ہیں: go_book_api_net ایک ہی نیٹ ورک کے اندر کوئی بھی کنٹینر اسے استعمال کر سکتا ہے۔ کہ driver نیٹ ورک کی قسم بتانے کے لیے یہاں اختیارات استعمال کیے جاتے ہیں۔ bridge نجی اندرونی نیٹ ورکس کے لیے استعمال کیا جاتا ہے۔

سب کچھ ایک ساتھ چلائیں

ڈوکر کمپوز سے پہلے، ایک واحد ڈاکر فائل تھی جس نے آپ کی گو ایپلیکیشن کے لیے ایک کنٹینر بنایا تھا۔ ڈوکر کمپوز کے ساتھ، آپ تین کنٹینرز (ایپلی کیشن کنٹینر، ڈیٹا بیس، اور phpMyAdmin) بناتے ہیں اور انہیں ایک ہی ایپلیکیشن کے طور پر مل کر کام کرنے کے لیے مربوط کرتے ہیں۔

آپ ان سب کو گٹ ہب جیسے پلیٹ فارم پر دھکیل سکتے ہیں اور کوئی آپ کی ایپلیکیشن کو اپنے کمپیوٹر پر مقامی طور پر ان سروسز (MySQL یا PhpMyAdmin) کو انسٹال کیے بغیر کلون، لانچ اور چلا سکتا ہے۔ تاہم، آپ کے پاس ڈوکر انسٹال ہونا ضروری ہے۔

کنٹینرز کو ایک ساتھ بنانے کے لیے، آپ درج ذیل کمانڈ استعمال کر سکتے ہیں: docker compose build:

IDE ٹرمینل اسکرین شاٹ تصویر کی تعمیر دکھا رہا ہے۔

اگر آپ Docker Compose UI کو دوبارہ چیک کرتے ہیں، تو آپ دیکھ سکتے ہیں کہ ایک نئی تصویر بنائی گئی ہے، جو ایپ سروس سے مطابقت رکھتی ہے۔

ڈوکر ڈیسک ٹاپ پر بنائی گئی تصویر کا اسکرین شاٹ

کنٹینر چلانا شروع کرنے کے لیے، آپ درج ذیل کمانڈ استعمال کر سکتے ہیں: docker compose up:

ٹرمینل IDE میں کنٹینر چلانے کا اسکرین شاٹ

اگر آپ ڈوکر کمپوز میں کنٹینرز کے ٹیب پر جائیں تو آپ دیکھ سکتے ہیں کہ کنٹینر چل رہا ہے۔

ڈوکر ڈیسک ٹاپ میں کنٹینر چلانے کا اسکرین شاٹ

ایپ کی اہم خدمات یہ ہیں: go_book_apiجب میں امیج چلاتا ہوں تو یہ نہیں چلتا کیونکہ بائنری چلتی ہے اور تقریباً فوراً نکل جاتی ہے۔

آپ کا main.goآئیے پورٹ پر سننے والے کم سے کم HTTP ہینڈلر فنکشن کو ترتیب دینے کے لیے کوڈ کو دوبارہ لکھتے ہیں۔ 8080:

// cmd/main.go
package main

import (
	"log"
	"net/http"
)

func main() {
	http.HandleFunc("/health", func(w http.ResponseWriter, r *http.Request) {
		w.WriteHeader(http.StatusOK)
		_, _ = w.Write([]byte("ok"))
	})

	log.Println("listening on :8080")
	if err := http.ListenAndServe(":8080", nil); err != nil {
		log.Fatal(err)
	}
}

اگر آپ گو میں نئے ہیں تو اوپر والے کوڈ کو آپ کو زیادہ پریشان نہ ہونے دیں۔ یہ سب کرتا ہے health ایک اختتامی نقطہ (8080 اس صورت میں) یہ "ٹھیک ہے” پرنٹ کرتا ہے۔

آپ کا Dockerfileآئیے کنٹینر شروع ہونے پر تیار کردہ بائنری کو چلانے کے لیے ایک کمانڈ شامل کریں۔

# run the compiled binary when the container starts
CMD ["/docker-gs-ping"]

اسے شامل کرنے کے بعد، آپ کو کنٹینر کو دوبارہ بنانے اور دوبارہ شروع کرنے کی ضرورت ہوگی۔ اب آپ تمام کنٹینرز کو چلتے ہوئے دیکھ سکتے ہیں۔

ڈوکر ڈیسک ٹاپ میں کنٹینر چلانے کا اسکرین شاٹ

جب آپ اگلا کلک کریں۔ go_book_api اگر آپ کنٹینر کو دیکھیں تو آپ دیکھیں گے کہ سرور پورٹ پر چل رہا ہے۔ 8080 جیسا کہ ترتیب دیا گیا ہے:

ڈوکر ڈیسک ٹاپ میں چلنے والے کنٹینر کا اسکرین شاٹ

چونکہ ایپ پورٹ پر چل رہی ہے۔ 8080 اور آپ /health ایک بار اختتامی نقطہ کے سیٹ اپ ہونے کے بعد، آپ اپنے براؤزر میں اس اختتامی نقطہ کو دیکھ سکتے ہیں اور "اوکے” آؤٹ پٹ کو دیکھ سکتے ہیں۔

اسٹیٹس اینڈ پوائنٹ کی تصویر براؤزر میں ٹھیک جواب دکھا رہی ہے۔

اس کے علاوہ، اگر آپ بے نقاب بٹن پر کلک کرتے ہیں۔ phpmyadmin بندرگاہیں ڈیٹا بیس کلائنٹس کو بندرگاہ پر مقامی طور پر رسائی کی اجازت دیتی ہیں۔ 9000. ماحول کے متغیرات کی بنیاد پر .env اگر آپ کے پاس فائل ہے تو آپ لاگ ان کر سکتے ہیں۔

phpMyAdmin لاگ ان فارم پر مشتمل براؤزر کا اسکرین شاٹ۔

ڈوکر ڈیسک ٹاپ میں تلاش کرنے کے لئے ایک اور دلچسپ چیز حجم ہے۔ ایک والیوم ٹیب ہے جہاں آپ دیکھ سکتے ہیں کہ کیا ترتیب دیا گیا ہے۔ mysql-go حجم

ڈوکر ڈیسک ٹاپ میں والیوم ٹیب کا اسکرین شاٹ

کسی بھی وقت، آپ ان حجموں/کنٹینرز کو Docker GUI میں کھول سکتے ہیں، فائلوں اور لاگز کو دیکھ سکتے ہیں، اور یہاں تک کہ ایک کنٹینر کو نیچے رکھ کر تجربہ کر سکتے ہیں کہ دوسرا کیسے رد عمل ظاہر کرتا ہے۔

اس پورے سیٹ اپ کے بعد آپ کیا محسوس کرتے ہیں؟ مقامی طور پر Go، MySQL یا phpMyAdmin کو انسٹال کرنے کی ضرورت نہیں تھی۔ پوری ایپلیکیشن کو مربوط کرنے کے لیے، ہم نے صرف سرکاری طور پر شائع شدہ بیس امیجز کا استعمال کیا۔ یہ ڈوکر کا جادو ہے۔

ختم

ڈوکر پہلے تو بہت تجریدی لگ سکتا ہے، لیکن ایک بار جب آپ اس کا بنیادی مقصد سمجھ لیں تو سب کچھ زیادہ واضح ہو جاتا ہے۔

اس آرٹیکل میں، آپ نے سیکھا کہ ڈوکر کیا ہے، مقامی گو ایپلیکیشن کو کنٹینرائز کرنے کا طریقہ، اور Docker Compose کا استعمال کرتے ہوئے متعدد کنٹینرز کا نظم کیسے کریں۔

اگر آپ کو یہ جاننے میں دشواری ہو رہی ہے کہ آپ کی ڈاکر فائل کو ترتیب میں کیوں اور کیسے ترتیب دیا گیا ہے، تو میرا مشورہ یہ ہے کہ خود اس کا پتہ لگانے میں زیادہ جنون میں نہ پڑیں۔ ایک ڈاکر ابتدائیہ کے طور پر، میں نے اس کا تصور کرنا اس طرح آسان پایا جیسے میں کوئی ترکیب تیار کر رہا ہوں۔ اگر آپ نے ایک تصویر بنانے کی کوشش کی ہے اور ناکام ہو گئے ہیں، تو آپ دیکھیں گے کہ کچھ اقدامات چھوڑے جا رہے ہیں۔

اگر آپ ڈوکر کو اس ٹیوٹوریل سے زیادہ تفصیل سے سمجھنا چاہتے ہیں تو، آفیشل ڈوکر دستاویزات میں کچھ حیرت انگیز وسائل ہیں۔ میں آپ کو ایسا کرنے کی ترغیب دیتا ہوں، کیونکہ یہ مضمون صرف ان حیرت انگیز چیزوں کی سطح کو کھرچتا ہے جو آپ کنٹینرائزیشن سے حاصل کر سکتے ہیں۔

اوپر تک سکرول کریں۔