Home »
Blog »
AI/ML Engineer সিরিজ » Series 09 » Episode 05
Docker: 'আমার laptop-এ চলে, server-এ চলে না কেন?' — এই সমস্যার শেষ
flagship dockerized (Series 09, Episode 05)
🟡 INTERMEDIATE
Series 09 — Notebook থেকে Production AI
Episode 05 / 09
📑 এই পর্বে যা যা আছে
- ১. গল্প: "আমার laptop-এ তো চলছিল!"
- ২. আসল সমস্যা: environment mismatch
- ৩. তিন স্তরে: container আসলে কী
- ৪. Image, Container, Registry — তিনটা শব্দ
- ৫. Visual: কোড কীভাবে container হয়
- ৬. আমাদের AI service-এর Dockerfile
- ৭. লাইন বাই লাইন Dockerfile বোঝা
- ৮. Build, run, ও test
- ৯. AI service-এর বিশেষ বিষয় (model, size, .dockerignore)
- ১০. docker compose: API + Redis একসাথে
- ১১. Experiment: dependency ভেঙে দেখো
- ১২. বাংলাদেশের বাস্তব প্রসঙ্গ
- ১৩. Boss Question
- ১৪. Job Requirement Decoder: "Docker / Containerization"
- ১৫. সাধারণ ভুল
- ১৬. Interview Prep
- ১৭. হাতে-কলমে
- ১৮. Project Connection ও পরের পর্ব
🎬 ১. গল্প: "আমার 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 |
| Image | app + environment-এর একটা স্থির snapshot (blueprint) | রান্নার রেসিপি + সব উপকরণ প্যাক করা |
| Container | image থেকে চালু হওয়া একটা চলন্ত instance | রেসিপি থেকে রান্না হওয়া আসল খাবার |
| Registry | image রাখার/শেয়ার করার জায়গা (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 বোঝা
FROM python:3.11-slim — ভিত্তি image; slim মানে হালকা (ছোট size, দ্রুত)।
WORKDIR /app — container-এর ভেতরে কাজের ফোল্ডার।
- প্রথমে
requirements.txt copy করে install — কেন? কারণ Docker layer cache
করে; কোড বদলালেও dependency layer পুনরায় build হয় না → দ্রুত build।
--no-cache-dir — pip cache রাখে না, image ছোট থাকে।
EXPOSE 8000 — কোন port-এ service চলে (documentation-এর মতো)।
CMD [...] — container চালু হলে কোন command চলবে। --host 0.0.0.0 জরুরি,
নাহলে container-এর বাইরে থেকে reach করা যায় না।
মনে রাখো: 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-এর বিশেষ বিষয়
- Model file: ছোট model (
.pkl, কয়েক MB) image-এ COPY করা ঠিক
আছে। বড় model (কয়েকশো MB / GB — যেমন deep learning weights) image-এ না রেখে বরং run-time-এ download
বা mounted volume থেকে load করাই ভালো, নাহলে image বিশাল হয়ে যায়।
- Image size:
slim base ব্যবহার করো; শুধু দরকারি dependency install করো।
ছোট image = দ্রুত deploy ও কম খরচ।
- .dockerignore: অপ্রয়োজনীয় জিনিস image-এ ঢুকতে দিও না।
# .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 ভেঙে দেখো
requirements.txt-এ version pin করে build করো; তারপর host থেকে একটা library uninstall
করো — container তবু চলবে (container-এর নিজের copy আছে)। এটাই isolation।
- Base image
python:3.11-slim থেকে python:3.9-slim বদলে দেখো কিছু ভাঙে কিনা।
--host 0.0.0.0 সরিয়ে 127.0.0.1 দাও — বাইরে থেকে curl fail করবে; কারণ বুঝে নাও।
🇧🇩 ১২. বাংলাদেশের বাস্তব প্রসঙ্গ
বাংলাদেশের প্রায় সব 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."
- কী বোঝায়? app + environment-কে container-এ প্যাক করে যেকোনো জায়গায় একইভাবে চালানো।
- কেন চায়? consistent, portable, reproducible deployment — industry standard।
- কোন সমস্যা সমাধান করে? "works on my machine", dependency conflict, কঠিন deploy।
- Junior-এর কী জানা লাগে?
Dockerfile লেখা, build/run, port map, env pass,
.dockerignore, compose-এর ধারণা।
- এখনই কী master লাগে না? Kubernetes autoscaling, multi-stage GPU builds, service mesh — পরে।
- GitHub-এ কীভাবে দেখাবে? repo-তে
Dockerfile + docker-compose.yml
+ README-তে "docker build/run" নির্দেশ।
- 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-এর
হিসাব।