Deploying a Go application with Docker Container

আপনি এই আর্টিকেল পড়ার আগ্রহ প্রকাশ করেছেন মানে ধরেই নিচ্ছি আপনি প্রযুক্তির লোকজন। আপনি যদি না হয়ে থাকেন তাতেও কোন সমস্যা নেই। আপনার হাতে আছে ইন্টারনেট সংযুক্ত ডিভাইস আর সার্চ ইঞ্জিন, ব্যাস! আপনি সব টার্ম সম্পর্কে জেনে যাবেন। ইন্টারনেট থেকে শল্যচিকিৎসা, কৃষিকাজ কিংবা অন্যন্য কাজ শেখা না গেলেও প্রযুক্তি, সফটওয়্যার ইঞ্জিনিয়ারিং কিংবা তার অংশের সব জিনিসপত্র আপনি শিখতে পারেন সহজে।

এবার মুলকথায় আসি, আমরা যারা ডেভেলপার, সফটওয়্যার ইঞ্জিনিয়ার কিংবা <some buzz words here> তাদের দৈনন্দিন কাজের অংশ হচ্ছে কোন একটা অ্যাপ্লিকেশন বানানো যা দিয়ে বাস্তবিক কিছু সমস্যার সমাধান হবে, মানব সভ্যতার কাজে লাগবে। আমরা সেই অ্যাপ্লিকেশন গুলো আমাদের লোকাল প্লাটফর্মে টেস্ট করে দেখি, বিভিন্ন ভার্সনে টেস্ট করি, অসংখ্যবার করি। যার জন্য আমাদের বিভিন্ন অ্যাপ্লিকেশনের জন্য বিভিন্ন প্যাকেজ, ডিপেন্ডেন্সি আরও সুসম্পর্কিত জিনিসপত্র লাগে। তো এরকম একটা পরিস্থিতির সুন্দর সমাধান হচ্ছে ডকার, ডকার খাঁটি বাংলায় এমন একটা জিনিস যেখানে আমাদের অ্যাপ্লিকেশন গুলো স্বতন্ত্রভাবে চালানোর জন্য যত রকমের ওএস লেভেলের জিনিস, প্যাকেজ, লাইব্রেরি আরো যা লাগে সব যোগান দেয়। সব থেকে মজার জিনিস আমরা প্রত্যেক অ্যাপ্লিকেশনের জন্য আলাদা আলাদা এমন বান্ডল তৈরী করতে পারবো। যাদেরকে ইমেজ বলে আর একটা চলমান ইমেজকে বলে কন্টেইনার

Go অ্যাপ্লিকেশন

আমরা অ্যাপ্লিকেশন ডেভেলপমেন্ট নিয়ে তেমন বিস্তারিত ফোকাস করবোনা। এখানে আমার লিখা গিটহাবের একটি খুব সাধারণ অ্যাপ্লিকেশন ব্যবহার করবো, যার রুট এন্ডপয়েন্টে আমরা একটা জেসন রেসপন্স পাবো {"Greetings" : "You are awesome!"}

অ্যাপ্লিকেশনটি আপনার লোকাল মেশিনে নিতে চাইলে, ক্লোন করুন –

git clone https://github.com/ihumaunkabir/go-docker-deployment.git

ডকার ইমেজ তৈরী

তারপর প্রজেক্ট ডিরেক্টরিতে যান। এখানে আপনি আপনি একটি Dockerfile পাবেন। আমাদের মুল লক্ষ্য এই Dockerfile কিভাবে করবো এবং সকল প্যারামিটারের ব্যাখ্যা জানবো। একটা ইমেজ ধাপে ধাপে বিল্ড করার জন্য আমরা Dockerfile কনফিগার করি। আমরা নিচের Dockerfile টি দেখি।

আমরা এবার বিস্তারিত ব্যাখ্যায় আসি-

FROM আমরা ডকারের রিপোজিটরি থেকে golang:alpine ইমেজের উপর ভিত্তির করে আমাদের ইমেজটি তৈরী করছি। আমরা লিনাক্সের alpine লিনাক্স ডিস্ট্রো ব্যবহার করবো। এই ইমেজের সাইজ মাত্র 5MB, যার ভিতরে golang ইন্সটল করাই আছে।

ENV GO111MODULE একটি এনভায়রনমেন্ট ভ্যারিয়েবল, এই ভ্যারিয়েবলই যাবতীয় প্যাকেজগুলো ইমপোর্ট করে। CGO_ENABLED=0 করা হয় সাধারণত কন্টেইনার সাইজ কমানোর জন্য। CGO হচ্ছে, C আর Go, এটা নিস্ক্রীয় করা থাকলে Go’র প্যাকেজ C কোড ইমপোর্ট করা বন্ধ করে দেয়। তারপরের GOOS=linux অপারেটিং সিস্টেম আর GOARCH=amd64 প্রসেসর আর্কিটেকচার।

WORKDIR এর মাধ্যমে আমরা ডিরেক্টরি পরিবর্তন করি। COPY দিয়ে মডিউল কপি করি এবং RUN দিয়ে ডিপেন্ডেন্সিগুলো ডাউনলোড করি এবং অ্যাপ্লিকেশন বিল্ড করি। go.mod মডিউল ফাইলে ডিপেন্ডেন্সিগুলো থাকে। ( বোনাস: আমরা জানি যে go mod init github.com/userName/appName কমান্ড দিয়ে Go Module তৈরী করতে পারি। তারপর আমরা go build দিয়ে অ্যাপ্লিকেশন বিল্ড করি এবং বিল্ড করার পর go.sum এবং appName.exe তৈরী হয়। go.sum ফাইলে ক্রিপ্টোগ্রাফিক হ্যাশ আকারে মডিউলের সুনির্দিষ্ট ভার্সনগুলো জমা থাকে। )

EXPOSE দিয়ে আমরা পোর্ট কন্টেইনার থেকে বাইরে একসেস করার জন্য পাঠাই। যেমন এখানে পোর্ট ব্যবহার করা হয়েছে 3000 চাইলে এটা পরিবর্তন করে অন্য দেওয়া যায় সমস্যা নেই।

CMD দিয়ে যখন আমাদের ইমেজটা চলবে তখন একটা ডিফল্ট কমান্ড রান করাচ্ছি।

ব্যাস! ডকার ফাইল তৈরী করা শেষ এখন আমরা ইমেজ টা বিল্ড করবো। সেজন্য আমাদের কমান্ডলাইনে লিখতে হবে-

docker build . -t go-docker-dep

-t ট্যাগ ফ্ল্যাগ। আপনি চাইলে go-docker-dep এর পরিবর্তে অন্য ট্যাগও ব্যবহার করতে পারেন। সেক্ষেত্রে ইমেজ চালু করার সময় একই ট্যাগ দিতে হবে।

ইমেজ বিল্ড করা শেষ। এখন আমরা ইমেজটি রান করবো। আগেই বলেছিলাম যে, একটি চলমান ইমেজ-ই কিন্তু কন্টেইনার। যখন একটা ইমেজ চলমান থাকবে তখন আমরা সেটাকে বলবো কন্টেইনার। তাহলে এবার ইমেজটি রান করা যাক-

docker run -p 3000:3000 go-docker-dep

-p পোর্ট ফ্ল্যাগ। go-docker-dep আমাদের ইমেজের ট্যাগ।

যাক আমাদের ইমেজ চলছে, কন্টেইনার প্রস্তুত। সার্ভার ঠিক ঠাক কাজ করছে কি না দেখে নেওযা যাক নিচের এড্রেসে গিয়ে –

http://localhost:3000 আপনার হোস্ট আইপি ভিন্ন হলে localhost এর পরিবর্তে সঠিক IP লিখতে হবে। তাহলে আমরা রেসপন্স হিসেবে পাবো-

{"Greetings" : "You are awesome!"}

আমাদের ডকার কন্টেইনার ঠিক ঠাক মত চলছে এবং আমরা আমাদের অ্যাপ্লিকেশনের কাঙ্ক্ষিত আউটপুট পেয়েছি।

লিখায় কোন ত্রুটি পেলে আমাকে জানান আমি সংযোজন করবো। ভাল লাগলে শেয়ার করুন। ধন্যবাদ।

গিটহাব রিপোজিটরি https://github.com/ihumaunkabir/go-docker-deployment

Sharing is caring