Skip to Content
Go Realm v1 is released 🎉
DevOpsDockerমডিউল ১: Foundation

মডিউল ১: Docker Foundation — কেন, কী, কীভাবে

এই মডিউলের লক্ষ্য: কমান্ড মুখস্থ করা নয়। Docker আসলে কোন সমস্যা সমাধান করে এবং ভেতরে কী ঘটে — সেই mental model তৈরি করা।

সময়: ~৩০ মিনিট


এই মডিউল শেষে তুমি পারবে

Skillমানে কী
সমস্যা ব্যাখ্যাDocker ছাড়া VPS deploy-এ কী কী ভাঙে, বলতে পারা
VM vs Containerকার্নেল শেয়ারিং দিয়ে পার্থক্য ব্যাখ্যা করা
Image vs Containerকোনটা template, কোনটা process — গুলিয়ে না ফেলা
Architecturedocker run লিখলে কে কার সাথে কথা বলে, বলতে পারা
LifecycleBuild → Ship → Run → Manage → Destroy চেনা

১. আসল সমস্যাটা কী?

তুমি লোকাল মেশিনে Go অ্যাপ লিখলে, চলল। VPS-এ তুলে দিলে — ভাঙল।

Laptop VPS ────── ─── Go 1.24 Go 1.19 libc 2.39 libc 2.31 Postgres 16 Postgres 13 ENV: .env file ENV: নেই "কিন্তু আমার মেশিনে তো চলে!"
সমস্যাDocker ছাড়াDocker দিয়ে
Dependency versionসার্ভারে ম্যানুয়ালি install/upgradeইমেজের ভেতরেই lock করা
”আমার মেশিনে চলে”নিয়মিত ঘটেইমেজ একই → behavior একই
নতুন সার্ভারে moveআবার পুরো setupdocker run — শেষ
Rollbackকঠিন, ম্যানুয়ালআগের image tag চালাও
দুই অ্যাপ, দুই versionconflictআলাদা container, conflict নেই

Docker কী সমাধান করে না (সৎ কথা)

  • Docker তোমার খারাপ কোড ঠিক করবে না। ধীর query Docker-এও ধীর।
  • Docker auto-scaling বা self-healing cluster দেয় না — সেটা Kubernetes-এর কাজ।
  • Database-এর ডেটা সেফটি Docker দেয় না — সেটা তোমার volume + backup strategy (মডিউল ৫)।
  • Container VM-এর মতো পূর্ণ isolation দেয় না — কার্নেল শেয়ার করা হয়।

📌 এই কোর্সের স্কোপ: এক VPS-এ Go + PostgreSQL অ্যাপ confident ভাবে deploy, restart, debug, update করা। ❌ Kubernetes নয়, ❌ cloud complexity নয়।


২. VM vs Container (কার্নেল স্পেসসহ)

VIRTUAL MACHINE CONTAINER ┌──────────┬──────────┐ ┌──────────┬──────────┐ │ App A │ App B │ │ App A │ App B │ ├──────────┼──────────┤ ├──────────┼──────────┤ │ Guest OS │ Guest OS │ ← ভারী │ user │ user │ │ + Kernel │ + Kernel │ │ space │ space │ ├──────────┴──────────┤ ├──────────┴──────────┤ │ Hypervisor │ │ Docker Engine │ ├─────────────────────┤ ├─────────────────────┤ │ Host OS + Kernel│ │ Host OS + Kernel │ ← শেয়ার্ড └─────────────────────┘ └─────────────────────┘ GB, মিনিট MB, সেকেন্ড
টপিকVirtual Machine (VM)Container
এটা কীকম্পিউটারের ভেতরে আরেকটা পূর্ণ কম্পিউটার। নিজের OS ও কার্নেল চালায়।ছোট, দ্রুত একটি বক্স — হোস্টের কার্নেল শেয়ার করে অ্যাপ চালায়।
কার্নেল স্পেসপ্রতিটি VM-এর নিজের আলাদা কার্নেল স্পেসসব কনটেইনার হোস্টের একই কার্নেল স্পেস শেয়ার করে
কীভাবে কাজ করেনিজস্ব OS কপি + ভার্চুয়াল হার্ডওয়্যার (hypervisor)একই কার্নেল, কিন্তু আলাদা user space
স্পিডধীর — পুরো OS বুট হয়খুব দ্রুত — বুট লাগে না
রিসোর্সঅনেক RAM/CPUঅনেক কম
OS রিকোয়ারমেন্টভিন্ন OS চালাতে পারে (Windows on Linux)হোস্টের মতো একই কার্নেল লাগে (সব Linux-based)
সাইজGBMB
সিকিউরিটিবেশি — কার্নেলসহ পুরো আলাদাকম — শেয়ার্ড কার্নেল ভাঙলে সবাই ঝুঁকিতে
স্কেলেবিলিটিঅনেক VM দ্রুত তৈরি করা কঠিনসেকেন্ডে অনেক container তৈরি/ধ্বংস
টুলসVirtualBox, VMware, Hyper-VDocker, Podman, Kubernetes
কিসের জন্য ভালোফুল OS, ভিন্ন OS টাইপ, লিগেসি সিস্টেমলাইটওয়েট অ্যাপ ও মাইক্রোসার্ভিস

🧠 এক লাইনে: VM = আলাদা বাড়ি (নিজের ভিত্তি সহ)। Container = একই বিল্ডিংয়ের আলাদা ফ্ল্যাট (ভিত্তি শেয়ার করা)।


৩. Image vs Container (সবচেয়ে বেশি গুলিয়ে ফেলা জিনিস)

Dockerfile ──build──▶ Image ──run──▶ Container ──run──▶ Container (রেসিপি) (প্যাকেট) (চলন্ত প্রসেস) (আরেকটা প্রসেস) read-only এক ইমেজ থেকে অনেক container
FeatureDocker ImageDocker Container
NatureBlueprint / TemplateRunning instance (একটি Linux process)
MutabilityImmutable — বদলানো যায় না, নতুন version = নতুন imageMutable — ভেতরে লিখলে বদলায়
StorageRegistry (Docker Hub, private)হোস্টের RAM + writable layer
Lifecycleএকবার build, বারবার reuseStart → Stop → Remove
Examplemysql:8.0সেই ইমেজ থেকে চলা একটি MySQL instance
  • Image = রেসিপি 🍳 → OS layer, তোমার কোড, dependency, ENV — সব প্যাক করা।
  • Container = সেই রেসিপিতে রান্না করা খাবার 🍲 → একই রেসিপি থেকে ১০ প্লেট বানানো যায়।

⚠️ পরিণতি (মনে রাখো): container remove করলে তার writable layer মুছে যায়। মানে container-এর ভেতরে লেখা ডেটা হারিয়ে যাবে — যদি না তুমি volume ব্যবহার করো (মডিউল ৫)।


৪. Docker Architecture — docker run লিখলে কী ঘটে?

Docker একটি Client–Server Architecture। তিনটি অংশ:

┌──────────────────┐ REST API / UNIX socket ┌──────────────────────┐ │ Docker Client │ ─────────────────────────▶ │ Docker Daemon │ │ (docker CLI) │ ◀───────────────────────── │ (dockerd) │ └──────────────────┘ result / logs │ images, containers, │ │ networks, volumes │ └──────────┬───────────┘ │ pull / push ┌──────────────────────┐ │ Docker Registry │ │ (Hub / private) │ └──────────────────────┘
উপাদানকাজতোমার জন্য মানে
Client (docker CLI)তোমার কমান্ড daemon-এ পাঠায়তুমি যা টাইপ করো, সেটা শুধু একটা API call
Daemon (dockerd)ইমেজ, container, network, volume ম্যানেজ করেআসল কাজ এখানেই হয়; এটা বন্ধ = docker কাজ করবে না
Registryইমেজের লাইব্রেরি (Docker Hub / private)pull করলে এখান থেকে নামে, push করলে এখানে ওঠে

💡 প্রোডাকশন insight: daemon root হিসেবে চলে। তাই যাকে docker কমান্ডের access দিচ্ছ, তাকে কার্যত root access দিচ্ছ।


৫. Docker Lifecycle — “Build, Ship, Run”

Dockerfile ──▶ [ BUILD ] ──▶ Image ──▶ [ SHIP ] ──▶ Registry ▼ pull [ RUN ] ──▶ Container ┌──────────┴──────────┐ ▼ ▼ [ MANAGE ] [ DESTROY ] stop/start/logs/exec docker rm
ধাপকমান্ডকী হয়
Builddocker buildDockerfile → পোর্টেবল read-only image
Shipdocker push / docker pullRegistry-তে ওঠানো / সার্ভারে নামানো
Rundocker runImage থেকে isolated container process চালু
Managedocker stop/start/logs/exec/statsমনিটর, restart, ডিবাগ
Destroydocker rm / docker rmiContainer ও তার temporary ডেটা মুছে ফেলা

৬. হাতে-কলমে: প্রথম ১০ মিনিট

# ১. Docker ঠিকভাবে বসেছে কিনা docker version docker info # ২. প্রথম container (image না থাকলে নিজেই pull করবে) docker run hello-world # ৩. একটা আসল সার্ভার চালাও docker run -d -p 8080:80 --name web nginx:1.27-alpine curl http://localhost:8080 # ৪. কী চলছে দেখো docker ps # চলমান docker ps -a # সব (বন্ধসহ) docker logs web # লগ docker exec -it web sh # ভেতরে ঢোকো, তারপর: exit # ৫. পরিষ্কার করো docker stop web docker rm web

এখানেই “container = process” প্রমাণ করে দেখো

docker run -d --name web nginx:1.27-alpine # হোস্ট থেকেই container-এর প্রসেস দেখা যায় docker top web ps aux | grep nginx # হোস্টেও nginx প্রসেস দেখতে পাবে docker rm -f web

VM হলে হোস্ট থেকে ভেতরের প্রসেস এভাবে দেখা যেত না। এটাই শেয়ার্ড কার্নেলের প্রমাণ।


৭. Common Mistakes (শুরুতেই)

ভুলকী হয়ঠিক পথ
docker run বারবার চালানোপ্রতিবার নতুন container জমেdocker start <name> বা --rm ব্যবহার
Container-এর ভেতরে ফাইল লিখে রাখাrm করলেই ডেটা শেষVolume (মডিউল ৫)
latest tagকাল অন্য version নামবেnginx:1.27-alpine — নির্দিষ্ট version
Container-কে VM ভাবাভেতরে ssh/systemd বসানোর চেষ্টাএক container = এক process

✅ Self-check (পরের মডিউলে যাওয়ার আগে)

  • VPS-এ “production” বলতে আমি কী বুঝি?
  • Docker ছাড়া VPS-এ অ্যাপ চালালে কী কী সমস্যা হয়?
  • VM আর container-এর মূল পার্থক্য কার্নেল দিয়ে ব্যাখ্যা করতে পারি?
  • Container restart হলে কী reset হয়, কী হয় না?
  • docker run লিখলে client, daemon, registry-র মধ্যে কী ঘটে?

পরের মডিউল: মডিউল ২: Image ও Container হাতে-কলমে