System Design শেখো
শেখো / ডিপ্লয়মেন্ট ও ইনফ্রা

Containers ও Docker

9 মিনিট Module 9 · Deployment & Infrastructure
এক নজরে
  • Container হলো অ্যাপ্লিকেশন আর তার সব dependency একসাথে প্যাকেজ করার হালকা উপায়।
  • VM-এর তুলনায় container অনেক হালকা কারণ এটি host OS-এর kernel শেয়ার করে।
  • Docker দিয়ে Dockerfile লিখে image বানানো হয়, আর সেই image থেকে container চালানো হয়।

সমস্যাটা কী?

ধরো তুমি তোমার laptop-এ একটা Node.js অ্যাপ বানালে। তোমার মেশিনে Node-এর version 18, একটা নির্দিষ্ট library version, আর কিছু environment variable সেট করা আছে। সব ঠিকঠাক চলছে। এবার সেটা তুমি একজন সহকর্মীকে দিলে, কিংবা production server-এ deploy করলে — আর হঠাৎ অ্যাপ crash করল। কারণ? সেখানে হয়তো Node 16, library-র অন্য version, কিংবা একটা missing dependency।

এই বিখ্যাত সমস্যাটার নাম "It works on my machine"। এক মেশিন থেকে আরেক মেশিনে environment ভিন্ন হওয়ায় code-এর আচরণ বদলে যায়। প্রতিবার নতুন server setup করতে গিয়ে ঘণ্টার পর ঘণ্টা OS, runtime, dependency install করতে হয়, আর তাতেও মেলে না।

Container এই সমস্যার সমাধান। এটি তোমার অ্যাপ আর তার সব dependency (runtime, library, config) একটা box-এ প্যাকেজ করে দেয়, যাতে যেকোনো মেশিনে একইভাবে চলে।

মূল ধারণা

Container হলো একটি হালকা, standalone, executable প্যাকেজ যাতে একটি অ্যাপ্লিকেশন চালানোর জন্য প্রয়োজনীয় সবকিছু — code, runtime, system tools, library এবং setting — অন্তর্ভুক্ত থাকে।

মূল কথা হলো isolation আর consistency। প্রতিটি container তার নিজের আলাদা পরিবেশে চলে, কিন্তু host মেশিনের OS kernel শেয়ার করে। এর ফলে container তৈরি হতে ভারী Virtual Machine-এর মতো পুরো operating system লাগে না।

এখানে দুটি শব্দ গুলিয়ে ফেলা সহজ — Image আর Container

  • Image: একটি read-only template বা blueprint। যেমন একটা ক্লাসের definition, কিংবা কেকের recipe।
  • Container: সেই image চালালে যে চলমান instance তৈরি হয়। যেমন ক্লাস থেকে বানানো object, কিংবা recipe দিয়ে বানানো আসল কেক।

একটি image থেকে তুমি যত খুশি container চালাতে পারো, ঠিক যেমন একটা recipe থেকে অনেকগুলো কেক বানানো যায়।

কীভাবে কাজ করে

VM বনাম Container

পার্থক্য বুঝতে নিচের তুলনাটা দেখো:

বৈশিষ্ট্যVirtual MachineContainer
OSপ্রতিটি VM-এ আলাদা পূর্ণ guest OShost OS-এর kernel শেয়ার করে
আকারকয়েক GBসাধারণত কয়েক MB
Boot সময়মিনিটসেকেন্ড
Isolationশক্তিশালী (hardware-level)process-level
Resource খরচবেশিকম
একটি মেশিনে সংখ্যাকয়েকটিশত শত

VM-এ প্রতিটি instance-এর জন্য আলাদা পুরো OS চালাতে হয়, তাই ভারী। Container শুধু অ্যাপ আর dependency রাখে, kernel শেয়ার করে, তাই হালকা।

Dockerfile দিয়ে Image বানানো

Docker-এ image তৈরি হয় একটা Dockerfile থেকে, যেখানে ধাপে ধাপে নির্দেশনা লেখা থাকে:

# base image বেছে নাও
FROM node:18-alpine

# কাজের ডিরেক্টরি
WORKDIR /app

# শুধু dependency ফাইল আগে copy করো (cache-এর জন্য)
COPY package*.json ./
RUN npm install

# বাকি code copy করো
COPY . .

# কোন port খোলা থাকবে
EXPOSE 3000

# container চালু হলে যে command চলবে
CMD ["node", "server.js"]

এরপর docker build -t myapp . দিলে image তৈরি হয়, আর docker run -p 3000:3000 myapp দিলে container চালু হয়।

Layers

প্রতিটি Dockerfile instruction (FROM, COPY, RUN) একটি করে layer তৈরি করে। Docker এই layer-গুলো cache করে রাখে। পরের বার build-এ যেসব layer বদলায়নি, সেগুলো আবার তৈরি না করে reuse করে।

এজন্যই উপরের উদাহরণে আমরা package.json আগে copy করেছি — code বদলালেও যদি dependency না বদলায়, তাহলে npm install layer cache থেকেই আসবে, build দ্রুত হবে।

সহজ উদাহরণ

Container-কে ভাবো ঢাকার রাস্তার বিরিয়ানির প্যাকেট হিসেবে। প্যাকেটের ভেতরে চাল, মাংস, মসলা, এমনকি চামচ — সবকিছু একসাথে। তুমি প্যাকেটটা বাসায় নাও, অফিসে নাও বা বন্ধুকে দাও — স্বাদ একদম একই থাকবে, কারণ সব উপকরণ ভেতরেই আছে। অন্যদিকে VM হলো পুরো একটা রেস্তোরাঁ আলাদা করে বানানো — অনেক ভারী আর খরচসাপেক্ষ। আর "recipe" (image) একটাই, কিন্তু সেই recipe দিয়ে অনেকগুলো প্যাকেট (container) বানানো যায়।

প্রকারভেদ

Container ecosystem-এ কয়েকটি গুরুত্বপূর্ণ অংশ আছে:

  • Image: blueprint, read-only।
  • Container: চলমান instance।
  • Registry: image সংরক্ষণ ও শেয়ার করার ভাণ্ডার। যেমন Docker Hub, GitHub Container Registry, Amazon ECR। তুমি docker push দিয়ে image upload করো, আর অন্য কেউ docker pull দিয়ে নামিয়ে চালায়।
  • Volume: container মুছে গেলেও যে data থাকা দরকার (যেমন database file), তা রাখার জন্য persistent storage।
  • Network: একাধিক container-এর মধ্যে যোগাযোগের ব্যবস্থা।

কখন ব্যবহার করবে / করবে না

ব্যবহার করবে যখন:

  • একই অ্যাপ একাধিক environment (dev, staging, production)-এ একইভাবে চালাতে চাও।
  • Microservices architecture, যেখানে প্রতিটি service আলাদাভাবে deploy হয়।
  • দ্রুত scale করা বা নতুন instance চালু করা দরকার।
  • CI/CD pipeline-এ reproducible build চাও।

কম দরকার যখন:

  • একদম ছোট একটা static website, যেখানে container-এর overhead অপ্রয়োজনীয়।
  • যে অ্যাপের শক্তিশালী hardware-level isolation দরকার (নিরাপত্তার কারণে VM ভালো)।
সাবধান

Container ভেতরে data রাখলে container মুছে গেলে সেই data হারিয়ে যায়। Database বা important file অবশ্যই volume-এ রাখো, container-এর filesystem-এ নয়। আর কখনো password বা secret key সরাসরি Dockerfile-এ লিখো না — সেগুলো image-এর layer-এ থেকে যায় এবং পরে পড়া যায়।

বাস্তব উদাহরণ

একটি bKash-জাতীয় payment company-র কথা ভাবো। তাদের অনেকগুলো service আছে — login service, transaction service, notification service। প্রতিটি service আলাদা container হিসেবে চলে।

ডেভেলপার তার laptop-এ container চালিয়ে কাজ করে। কাজ শেষে code push করলে CI pipeline সেই code থেকে নতুন image build করে এবং registry-তে push করে। তারপর production server সেই একই image pull করে চালায়।

এর সুবিধা: ডেভেলপারের মেশিনে যা চলেছে, production-এও হুবহু তাই চলবে — কারণ image-এর ভেতরে environment fixed। নতুন server যোগ করতে হলে শুধু image pull করে docker run দিলেই হয়, ঘণ্টাব্যাপী setup লাগে না। এই portability আর consistency-ই container-এর সবচেয়ে বড় শক্তি।

টিপস

Interview-তে যদি জিজ্ঞেস করে "container কেন VM-এর চেয়ে ভালো?" — শুধু "হালকা" বলো না। বলো: container host kernel শেয়ার করে বলে startup দ্রুত ও resource খরচ কম, তবে isolation VM-এর চেয়ে দুর্বল। আর image immutable হওয়ায় deployment reproducible — এই দুটো শব্দ (immutable, reproducible) বললে তোমার গভীরতা বোঝা যায়।

মূল শব্দ (Key Terms)

মিনি কুইজ

1. Container আর Virtual Machine-এর মূল পার্থক্য কী?

2. Image আর Container-এর সম্পর্ক কেমন?

3. Docker image-এর layer ক্যাশিং কেন গুরুত্বপূর্ণ?