Docker Basic
🆚 2. What is the difference between a Docker Image and a Docker Container?
এই দুটি concept Docker-এর সবচেয়ে মৌলিক বিষয়। অনেকেই শুরুতে এই দুটো গুলিয়ে ফেলেন, তাই এটি ভালোভাবে বোঝা জরুরি।
| বাস্তব জীবন | Docker |
|---|---|
| রেসিপি / blueprint | Image |
| রান্না করা খাবার | Container |
একটি রেসিপি থেকে যেমন অনেকবার রান্না করা যায়, একটি Image থেকে তেমনি অনেকগুলো Container তৈরি করা যায়। রেসিপি নিজে পরিবর্তন হয় না, কিন্তু রান্না করা খাবার খাওয়া যায়, নষ্ট হয়, পরিবর্তন হয়।
আরেকটি analogy — Image হলো class, Container হলো object। Object-oriented programming-এ যেমন একটি class থেকে অনেক object instantiate করা যায়, একটি Image থেকে তেমনি অনেক Container চালু করা যায়।
Docker Image কী?
Docker Image হলো একটি read-only template বা blueprint যা থেকে Container তৈরি হয়। এটি একটি static artifact — একবার build হলে নিজে আর পরিবর্তন হয় না।
Image-এ যা থাকে:
- Application code
- Runtime environment (যেমন Python, Node.js, JVM)
- System libraries এবং dependencies
- Environment variables এবং configuration
- Container start হলে কোন command চালাবে সেই instruction
Image তৈরি হয় Dockerfile থেকে এবং এটি multiple read-only layers-এ ভাগ করা থাকে।
# এই Dockerfile থেকে একটি Image build হয়
FROM python:3.11-slim # Base layer
WORKDIR /app # Working directory set
COPY requirements.txt . # File copy layer
RUN pip install -r requirements.txt # Dependency layer
COPY . . # App code layer
CMD ["python", "app.py"] # Startup command
# Image build করার command
docker build -t my-python-app:1.0 .
# সব Image দেখার command
docker images
Docker Container কী?
Docker Container হলো একটি Image-এর running instance। যখন তুমি একটি Image "চালু" করো, তখন সেটি Container হয়ে যায়। Container হলো একটি isolated, live process যা actual কাজ করে।
Container চালু হওয়ার সময় Image-এর উপরে একটি writable layer যোগ হয়। Container চলাকালীন যত পরিবর্তন হয় (নতুন file তৈরি, data write) সব এই writable layer-এ জমা হয়। Container বন্ধ বা delete হলে এই layer মুছে যায় — মূল Image অপরিবর্তিত থাকে।
# Image থেকে Container চালু করা
docker run -d -p 8080:8080 --name my-app my-python-app:1.0
# একই Image থেকে একাধিক Container চালু করা
docker run -d -p 8081:8080 --name my-app-2 my-python-app:1.0
docker run -d -p 8082:8080 --name my-app-3 my-python-app:1.0
# চলমান Container দেখা
docker ps
# সব Container দেখা (বন্ধ সহ)
docker ps -a
Layer Architecture — Image থেকে Container তৈরির প্রক্রিয়া
Image Layers (Read-Only)
┌─────────────────────────────┐
│ CMD ["python","app.py"]│ ← Layer 4 (Image)
├─────────────────────────────┤
│ COPY . . │ ← Layer 3 (Image)
├─────────────────────────────┤
│ pip install ... │ ← Layer 2 (Image)
├─────────────────────────────┤
│ python:3.11-slim │ ← Layer 1 (Base Image)
└─────────────────────────────┘
↓ docker run
┌─────────────────────────────┐
│ Writable Container Layer │ ← শুধু Container-এ থাকে
├────────────────────────── ───┤
│ CMD ["python","app.py"]│ ← Layer 4 (shared, read-only)
├─────────────────────────────┤
│ COPY . . │ ← Layer 3 (shared, read-only)
├─────────────────────────────┤
│ pip install ... │ ← Layer 2 (shared, read-only)
├─────────────────────────────┤
│ python:3.11-slim │ ← Layer 1 (shared, read-only)
└─────────────────────────────┘
একটি গুরুত্বপূর্ণ বিষয় — যদি ১০টি Container একই Image থেকে চালু হয়, তারা সবাই Image-এর read-only layer share করে। শুধু প্রতিটির নিজস্ব writable layer আলাদা। এই কারণে Docker এত disk-efficient।
| বিষয় | Docker Image | Docker Container |
|---|---|---|
| সংজ্ঞা | Read-only blueprint/template | Image-এর running instance |
| অবস্থা | Static (পরিবর্তন হয় না) | Dynamic (চলে, থামে, পরিবর্তন হয়) |
| Storage | Disk-এ সংরক্ষিত থাকে | Memory-তে চলে |
| Writable | না | হ্যাঁ (নিজস্ব writable layer আছে) |
| তৈরি হয় | docker build দিয়ে | docker run দিয়ে |
| lifecycle | Build → Push → Pull | Create → Start → Stop → Delete |
| সংখ্যা | একটি Image থাকে | একটি Image থেকে অনেক Container হয় |
| Share করা যায় | হ্যাঁ, Docker Hub-এ push করা যায় | না, directly share হয় না |
Container-এর Lifecycle
একটি Container-এর বিভিন্ন অবস্থা থাকে:
Image
↓ docker run / docker create
Created
↓ docker start
Running ←──── docker restart ────┐
↓ docker pause │
Paused │
↓ docker unpause │
Running │
↓ docker stop │
Stopped ────────────────────────→─┘
↓ docker rm
Deleted
Image হলো নির্জীব blueprint — এটি describe করে container কেমন হবে। Container হলো সেই blueprint-এর জীবন্ত, চলমান রূপ — এটি actual কাজ করে। Image ছাড়া Container হয় না, কিন্তু একটি Image থেকে যতখুশি Container চালানো যায়।
How is a Docker image structured in layers?
Docker Image একটি single monolithic file নয় — এটি multiple read-only layers-এর একটি stack। প্রতিটি layer হলো Dockerfile-এর একটি instruction-এর ফলাফল।
FROM ubuntu:22.04 # Layer 1: Base OS layer
RUN apt-get update && \
apt-get install -y python3 # Layer 2: Python install
WORKDIR /app # Layer 3: Directory set
COPY requirements.txt . # Layer 4: File copy
RUN pip install -r requirements.txt # Layer 5: Dependencies
COPY . . # Layer 6: App code
CMD ["python3", "app.py"] # Layer 7: Startup command
প্রতিটি instruction একটি নতুন layer তৈরি করে এবং আগের layer-এর উপর stack হয়:
┌─────────────────────────────────────┐
│ Layer 7: CMD ["python3","app.py"] │ ← সবচেয়ে উপরে
├─────────────────────────────────────┤
│ Layer 6: App source code │
├─────────────────────────────────────┤
│ Layer 5: pip dependencies │
├─────────────────────────────────────┤
│ Layer 4: requirements.txt │
├─────────────────────────────────────┤
│ Layer 3: /app directory │
├─────────────────────────────────────┤
│ Layer 2: python3 installed │
├─────────────────────────────────────┤
│ Layer 1: ubuntu:22.04 base │ ← সবচেয়ে নিচে
└─────────────────────────────────────┘