Docker: 'আমার laptop-এ চলে, server-এ চলে না কেন?' — এই সমস্যার শেষ

flagship dockerized (Series 09, Episode 05)

🟡 INTERMEDIATE Series 09 — Notebook থেকে Production AI Episode 05 / 09

📑 এই পর্বে যা যা আছে

🎬 ১. গল্প: "আমার laptop-এ তো চলছিল!"

Rahim তার FastAPI service দিল Arif-কে চালাতে। Arif-এর machine-এ crash — ModuleNotFoundError, তারপর Python version mismatch, তারপর একটা C library missing। Rahim অবাক: "কিন্তু আমার laptop-এ তো নিখুঁত চলছিল!" Maya হেসে বলল —

"এটাই পৃথিবীর সবচেয়ে বিখ্যাত bug: 'works on my machine'। তোমার laptop-এ যে Python version, যে সব library-এর যে exact version, যে system dependency আছে — Arif-এর machine-এ বা production server-এ তা এক নয়। সমাধান হলো Docker: তোমার পুরো environment-সহ code-টাকে একটা বাক্সে (container) প্যাক করে দেওয়া, যাতে যেখানেই চালাও — হুবহু একইভাবে চলে।"
এই blog-এ ইতিমধ্যে একটা বিস্তারিত Docker & Kubernetes বাংলা সিরিজ আছে — গভীরে যেতে চাইলে ওটা পড়ো। এখানে আমরা শুধু AI service deploy করার দৃষ্টিকোণ থেকে যতটুকু দরকার ততটুকু দেখব।

২. আসল সমস্যা: environment mismatch

Rahim-এর laptop Arif-এর laptop Production server Python 3.11 Python 3.9 Python 3.10 numpy 1.26 numpy 1.24 numpy 2.0 scikit-learn 1.5 scikit-learn 1.2 (missing!) Ubuntu libs macOS libs Alpine libs | | | v v v ✅ চলে ❌ crash ❌ crash

সমস্যা কোড নয় — সমস্যা environment। Docker এই environment-টাকেই code-এর সাথে বেঁধে দেয়, তাই তিন জায়গাতেই এক পরিবেশ, এক ফল।

🧠 ৩. তিন স্তরে: container আসলে কী

Level 1 — intuition: Container হলো একটা "রেডি টু গো" লাঞ্চবক্স। শুধু খাবার (তোমার কোড) নয়, সাথে প্লেট, চামচ, লবণ — সব (Python, library, system dependency) একসাথে প্যাক করা। যেখানেই নিয়ে যাও, খুলেই খাওয়া যায় — রান্নাঘর লাগে না।
Level 2 — technical: Docker তোমার app + সব dependency + একটা minimal OS layer-কে একটা image-এ প্যাক করে। এই image যেকোনো Docker-চালিত machine-এ একই আচরণ করে, কারণ ভেতরের environment সব জায়গায় অভিন্ন। এটা VM নয় — অনেক হালকা, কারণ host OS-এর kernel share করে।
Level 3 — engineer perspective: engineer একটা Dockerfile লেখে (image বানানোর রেসিপি), image build করে, একটা registry-তে push করে, তারপর যেকোনো server/cloud সেই image টেনে (pull) run করে। ফলে "deploy" মানে দাঁড়ায় "নতুন image run করা" — সহজ, পুনরাবৃত্তিযোগ্য, দ্রুত rollback করা যায়।

📦 ৪. Image, Container, Registry — তিনটা শব্দ

শব্দমানেAnalogy
Imageapp + environment-এর একটা স্থির snapshot (blueprint)রান্নার রেসিপি + সব উপকরণ প্যাক করা
Containerimage থেকে চালু হওয়া একটা চলন্ত instanceরেসিপি থেকে রান্না হওয়া আসল খাবার
Registryimage রাখার/শেয়ার করার জায়গা (Docker Hub)recipe-এর লাইব্রেরি/গুদাম

এক image থেকে অনেক container চালানো যায় (scale করার মূল ভিত্তি)।

🗺️ ৫. Visual: কোড কীভাবে container হয়

তোমার কোড + requirements.txt + Dockerfile | docker build (রেসিপি -> image) v [ Docker Image ] | docker push -----> [ Registry (Docker Hub) ] | | docker run docker pull v v [ Container (local) ] [ Container (server) ] একই আচরণ, সব জায়গায়

📄 ৬. আমাদের AI service-এর Dockerfile

Project root-এ একটা Dockerfile (extension ছাড়া):

# Dockerfile FROM python:3.11-slim # system dependency (কিছু ML lib-এর দরকার হতে পারে) RUN apt-get update && apt-get install -y --no-install-recommends \ build-essential && rm -rf /var/lib/apt/lists/* WORKDIR /app # আগে শুধু requirements copy -> Docker layer cache কাজে লাগে COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt # তারপর বাকি কোড ও model COPY ./app ./app COPY ./models ./models EXPOSE 8000 # production-এ --reload নয়; একাধিক worker CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]

🔍 ৭. লাইন বাই লাইন Dockerfile বোঝা

মনে রাখো: 0.0.0.0 মানে "container-এর সব network interface-এ শোনো" — 127.0.0.1 দিলে শুধু container-এর ভেতরে থেকে reach করা যেত, বাইরে থেকে নয়। এটা junior-দের খুব common আটকে যাওয়া জায়গা।

▶️ ৮. Build, run, ও test

# 1) image build (. মানে current directory-তে Dockerfile) docker build -t career-assistant:v1 . # 2) container run (host-এর 8000 -> container-এর 8000, .env সহ) docker run -p 8000:8000 --env-file .env career-assistant:v1 # 3) test — আগের মতোই! curl http://localhost:8000/health # {"status": "ok"}

এখন এই image Arif-কে দাও বা registry-তে push করো — তার machine-এ, production server-এ, সব জায়গায় হুবহু একইভাবে চলবে। "works on my machine" সমস্যা শেষ।

🤖 ৯. AI service-এর বিশেষ বিষয়

# .dockerignore .venv/ __pycache__/ *.pyc .env .git/ tests/ notebooks/
খেয়াল করো .env এখানে ignore করা — secret কখনো image-এ bake করবে না! Secret আসবে --env-file বা cloud-এর env var থেকে run-time-এ।

🧩 ১০. docker compose: API + Redis একসাথে

আগের episode-এ আমরা Redis দিয়ে caching-এর কথা বলেছিলাম। docker compose দিয়ে একাধিক container (আমাদের API + Redis) একসাথে চালানো যায় এক command-এ:

# docker-compose.yml services: api: build: . ports: - "8000:8000" env_file: .env depends_on: - redis redis: image: "redis:7-alpine" ports: - "6379:6379"

চালাও: docker compose up। এখন API আর Redis একসাথে উঠবে, আর API ভেতরে redis hostname দিয়ে cache-এ পৌঁছাবে।

🧪 ১১. Experiment: dependency ভেঙে দেখো

🇧🇩 ১২. বাংলাদেশের বাস্তব প্রসঙ্গ

বাংলাদেশের প্রায় সব software company (Enosis, BJIT, Brain Station 23, Kaz Software, ও অসংখ্য startup) Docker ব্যবহার করে — এটা এখন একরকম বাধ্যতামূলক skill। একটা AI candidate যদি তার model শুধু notebook-এ দেখায়, সে সাধারণ। কিন্তু যে candidate তার model-কে Docker-এ প্যাক করে "যেকোনো জায়গায় চলবে" দেখাতে পারে, সে interview-তে অনেক এগিয়ে। Docker জানা মানে তুমি deployment-এর ভাষা বোঝো।

💼 ১৩. Boss Question

💼 Boss: "তোমার laptop-এ চলে, কিন্তু production server-এ চলে না কেন? আর এই Docker দিয়ে আমার কী সময়/টাকা বাঁচবে?"

উত্তর: চলে না কারণ server-এর Python/library/OS আমার laptop-এর থেকে আলাদা। Docker পুরো environment code-এর সাথে বেঁধে দেয়, তাই সব জায়গায় এক ফল — deployment-এ ঘণ্টার পর ঘণ্টা "কেন চলছে না" debug করা বন্ধ। নতুন engineer এলে এক command-এ পুরো system চালাতে পারবে। আর deploy/rollback হয়ে যায় মিনিটের কাজ। মানে কম downtime, কম debugging খরচ, দ্রুত release।

🔎 ১৪. Job Requirement Decoder: "Docker / Containerization"

JD-তে প্রায় নিশ্চিতভাবে থাকবে: "Experience with Docker / containerization."
  1. কী বোঝায়? app + environment-কে container-এ প্যাক করে যেকোনো জায়গায় একইভাবে চালানো।
  2. কেন চায়? consistent, portable, reproducible deployment — industry standard।
  3. কোন সমস্যা সমাধান করে? "works on my machine", dependency conflict, কঠিন deploy।
  4. Junior-এর কী জানা লাগে? Dockerfile লেখা, build/run, port map, env pass, .dockerignore, compose-এর ধারণা।
  5. এখনই কী master লাগে না? Kubernetes autoscaling, multi-stage GPU builds, service mesh — পরে।
  6. GitHub-এ কীভাবে দেখাবে? repo-তে Dockerfile + docker-compose.yml + README-তে "docker build/run" নির্দেশ।
  7. Interview-তে কী জিজ্ঞেস করতে পারে? "image vs container?", "কেন requirements আগে copy করো?", "0.0.0.0 কেন?", "secret কি image-এ রাখবে?" (না)।

⚠️ ১৫. সাধারণ ভুল

ভুল ১: .env/secret image-এ COPY করা। → run-time env var ব্যবহার করো; .dockerignore-এ রাখো।

ভুল ২: --host 127.0.0.1 দিয়ে run। → বাইরে থেকে reach করা যায় না; 0.0.0.0 দাও।

ভুল ৩: সব কোড আগে COPY করে তারপর pip install। → layer cache নষ্ট, প্রতিবার ধীর build।

ভুল ৪: বিশাল base image (full python) ব্যবহার। → slim নাও।

ভুল ৫: container-এ --reload দিয়ে production চালানো। → dev-only; production-এ worker দাও।

🎤 ১৬. Interview Prep

প্রশ্ন ১: "Docker আমাদের কোন সমস্যা সমাধান করে?"
উত্তর: environment consistency — 'works on my machine' bug দূর করে; portable, reproducible deploy দেয়।

প্রশ্ন ২: "image আর container-এর পার্থক্য?"
উত্তর: image = স্থির blueprint; container = image থেকে চলন্ত instance। এক image → বহু container।

প্রশ্ন ৩: "AI model কি সবসময় image-এ রাখবে?"
উত্তর: ছোট হলে হ্যাঁ; বড় weights হলে না — run-time download/volume mount, নাহলে image বিশাল।

প্রশ্ন ৪: "Dockerfile-এ requirements আগে copy করো কেন?"
উত্তর: layer caching — কোড বদলালেও dependency পুনরায় install হয় না, build দ্রুত।

✍️ ১৭. হাতে-কলমে

Mini exercise:
১. তোমার E03/E04-এর FastAPI service-এর জন্য একটা Dockerfile + .dockerignore লেখো।
২. docker build -t myapi:v1 . করো; image size দেখো (docker images)।
৩. docker run -p 8000:8000 --env-file .env myapi:v1 চালিয়ে /health curl করো।
৪. একটা docker-compose.yml বানাও যাতে API + Redis একসাথে ওঠে।
৫. চেষ্টা করো image ছোট করতে (slim base, --no-cache-dir) — আগের ও পরের size তুলনা করো।

🚀 ১৮. Project Connection ও পরের পর্ব

আমাদের flagship "Bangladesh Tech Career Assistant" এখন V9 (Dockerized)। পুরো service — FastAPI + model + Redis cache — এক command-এ যেকোনো জায়গায় চলে।

✓ Dockerfile, ✓ build/run, ✓ .dockerignore ও secret নিরাপত্তা, ✓ docker compose (API+Redis) — service এখন সত্যিই portable।
কিন্তু এটা এখনো তোমার laptop-এ। পরের episode-এ আমরা এই container-কে cloud-এ deploy করব — যাতে পৃথিবীর যে কেউ URL দিয়ে ব্যবহার করতে পারে। সাথে বুঝব CPU বনাম GPU, latency আর cost-এর হিসাব।
© 2025 Sheikh Thanbir Alam. All Rights Reserved. thanbirtamim.github.io
এই লেখা মূল লেখকের সম্পত্তি — লিখিত অনুমতি ছাড়া কপি করে অন্য কোনো ওয়েবসাইট, ব্লগ, বই বা প্ল্যাটফর্মে প্রকাশ/বিতরণ করা কঠোরভাবে নিষিদ্ধ। Content may not be copied or republished without permission.