INFRASTRUCTURE

Containerization (Docker)

Definition: Docker is a platform designed to help developers build, share, and run modern applications. It packages software into standardized units called containers that have everything the software needs to run.

ডেভেলপারের লোকাল মেশিন থেকে শুরু করে ক্লাউড সার্ভার পর্যন্ত— অ্যাপ্লিকেশন যেন সব জায়গায় হুবহু একই পরিবেশে (Environment) চলতে পারে, তা নিশ্চিত করাই হলো ডকারের কাজ।

1. The "It works on my machine" Problem

OS & Dependency Conflict

ধরি, আপনি লোকাল মেশিনে (Windows) Node.js v20 এবং MongoDB v6 দিয়ে একটি প্রজেক্ট বানালেন। আপনার পিসিতে সব পারফেক্ট কাজ করছে। এরপর আপনি কোডটি আপনার ক্লায়েন্টের উবুন্টু (Ubuntu) প্রোডাকশন সার্ভারে পাঠালেন। কিন্তু সেখানে Node.js v14 ইন্সটল করা আছে। ফলে কোড রান করার সাথে সাথেই সার্ভার ক্র্যাশ!

Docker এর সলিউশন: ডকার আপনার সোর্স কোড, Node.js-এর নির্দিষ্ট ভার্সন, এবং অন্যান্য লাইব্রেরিগুলোকে একটি বাক্সে (Image) বন্দি করে ফেলে। এই বাক্সটিকে যখন চালানো হয়, তখন এটি একটি Container এ পরিণত হয়। এই কন্টেইনার লোকাল পিসি হোক বা ক্লাউড সার্ভার— সব জায়গায় হুবহু একই পরিবেশে চলবে। অপারেটিং সিস্টেম কী আছে, তা নিয়ে আর কোনো মাথাব্যথা নেই!

Virtual Machines (Heavy)

  • পুরো একটি গেস্ট অপারেটিং সিস্টেম (OS) রান করতে হয়।
  • বুট হতে কয়েক মিনিট সময় লাগে।
  • অপ্রয়োজনীয়ভাবে গিগাবাইট (GBs) সাইজের RAM দখল করে রাখে।

Docker Containers (Lightweight)

  • হোস্ট পিসির (Host OS) কার্নেল শেয়ার করে, কোনো আলাদা OS লাগে না।
  • মিলিসেকেন্ডের মধ্যে স্টার্ট হয়ে যায়।
  • মাত্র কয়েক মেগাবাইট (MBs) RAM ব্যবহার করে।

2. Infrastructure as Code (IaC)

নিচে একটি অ্যাডভান্সড Multi-stage Dockerfile এবং একটি docker-compose.yml ফাইলের উদাহরণ দেওয়া হলো, যা একটি ফুল-স্ট্যাক অ্যাপ এবং Redis সার্ভারকে একসাথে রান করাতে ব্যবহৃত হয়।

Dockerfile (Node.js)
# Stage 1: Build
FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build

# Stage 2: Production (Lighter Image)
FROM node:18-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY package*.json ./
RUN npm install --only=production
EXPOSE 3000
CMD ["npm", "start"]
docker-compose.yml
version: '3.8'
services:
  web-api:
    build: .
    ports:
      - "3000:3000"
    environment:
      - NODE_ENV=production
      - REDIS_URL=redis://cache:6379
    depends_on:
      - cache

  cache:
    image: redis:alpine
    ports:
      - "6379:6379"

3. Docker Engine Simulator

প্রথমে docker build এ ক্লিক করে সোর্স কোড থেকে ইমেজ (Image) তৈরি করুন। এরপর docker run এ ক্লিক করে সেই ইমেজ থেকে লাইভ কন্টেইনার (Container) স্টার্ট করুন এবং পোর্ট ম্যাপিং দেখুন!

[ No Image Available ]
Host: 3000 ➔ Container: 3000
Waiting for Docker daemon commands...