ডেভেলপারদের জন্য Docker: ইমেজ, কন্টেইনার এবং Compose
আপনি Docker এবং কন্টেইনার সম্পর্কে শুনেছেন, কিন্তু যখন এটি ব্যবহার করতে যান, তখন ইমেজ, কন্টেইনার, ভলিউম এবং Compose-এর মতো শব্দে আপনি বিভ্রান্ত হয়ে পড়েন। অথবা হয়তো আপনি ইতিমধ্যে Docker ব্যবহার করছেন কিন্তু আপনার ইমেজগুলি বিশাল, বিল্ড ধীর, এবং একাধিক পরিষেবা পরিচালনা করা কষ্টকর মনে হয়। এই গাইডটি এই বিভ্রান্তি দূর করবে। আমরা ডেভেলপারদের জন্য Docker-এর প্রয়োজনীয় বিষয়গুলি কভার করব, বিশেষত আপনার অ্যাপ্লিকেশনগুলি দক্ষতার সাথে বিল্ড, চালানো এবং পরিচালনা করার জন্য আপনার যা জানা দরকার তা নিয়ে আলোচনা করব।
কেন Docker? এটি যে সমস্যার সমাধান করে
Docker-এর আগে, একটি অ্যাপ ডিপ্লয় করার অর্থ ছিল সঠিক পরিবেশ মেলানো: নির্দিষ্ট OS সংস্করণ, লাইব্রেরি এবং কনফিগারেশন। "এটা আমার মেশিনে কাজ করে" একটি ক্লিশে হয়ে গিয়েছিল কারণ এটি সত্য ছিল। Docker এটি সমাধান করে আপনার অ্যাপ্লিকেশনকে তার নির্ভরতা সহ একটি একক, পোর্টেবল ইউনিটে প্যাকেজ করে যাকে কন্টেইনার বলা হয়। কন্টেইনারগুলি হালকা, বিচ্ছিন্ন এবং Docker ইনস্টল করা যেকোনো জায়গায় সামঞ্জস্যপূর্ণভাবে চলে।
ইমেজ বনাম কন্টেইনার: মূল পার্থক্য
একটি ইমেজ হল একটি রিড-অনলি টেমপ্লেট যা আপনার অ্যাপ্লিকেশন কোড, রানটাইম, লাইব্রেরি এবং সেটিংস ধারণ করে। একটি কন্টেইনার হল একটি ইমেজের চলমান উদাহরণ। একটি ইমেজকে ক্লাস এবং একটি কন্টেইনারকে অবজেক্ট হিসেবে ভাবুন। আপনি একই ইমেজ থেকে একাধিক কন্টেইনার চালাতে পারেন, প্রতিটি অন্যদের থেকে বিচ্ছিন্ন।
ইমেজ কীভাবে তৈরি হয়
ইমেজগুলি একটি Dockerfile থেকে তৈরি হয়, যা নির্দেশাবলী সহ একটি টেক্সট ফাইল। এখানে একটি Node.js অ্যাপের জন্য একটি ন্যূনতম উদাহরণ:
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]
প্রতিটি নির্দেশ একটি স্তর তৈরি করে। স্তরগুলি ক্যাশে করা হয়, তাই যদি আপনি শুধুমাত্র আপনার সোর্স কোড পরিবর্তন করেন, Docker নির্ভরতার জন্য ক্যাশে করা স্তরগুলি পুনরায় ব্যবহার করে, যা পুনর্নির্মাণ দ্রুত করে।
বিল্ড এবং রান
ইমেজ বিল্ড করুন এবং একটি কন্টেইনার চালান:
docker build -t my-app .
docker run -p 3000:3000 my-app
-p ফ্ল্যাগ আপনার হোস্টের পোর্ট 3000 কে কন্টেইনারের পোর্ট 3000-এ ম্যাপ করে।
দক্ষ Docker ইমেজের জন্য সেরা অনুশীলন
বড় ইমেজ বিল্ড, পুশ এবং ডিপ্লয়মেন্ট ধীর করে। ইমেজ হালকা রাখতে এই অনুশীলনগুলি অনুসরণ করুন:
- যখন সম্ভব অফিসিয়াল স্লিম বা অ্যালপাইন বেস ইমেজ ব্যবহার করুন। উদাহরণস্বরূপ,
node:18-alpinenode:18-এর চেয়ে অনেক ছোট। - মাল্টি-স্টেজ বিল্ড ব্যবহার করুন বিল্ড-টাইম নির্ভরতাগুলিকে রানটাইম থেকে আলাদা করতে। এটি চূড়ান্ত ইমেজকে ন্যূনতম রাখে।
- RUN কমান্ডগুলি একত্রিত করুন স্তরগুলি কমাতে এবং একই স্তরে প্যাকেজ ম্যানেজার ক্যাশে পরিষ্কার করতে।
- একটি .dockerignore ফাইল ব্যবহার করুন অপ্রয়োজনীয় ফাইলগুলি (যেমন, node_modules, .git) বিল্ড কনটেক্সট থেকে বাদ দিতে।
এখানে একটি Go অ্যাপ্লিকেশনের জন্য একটি মাল্টি-স্টেজ Dockerfile:
# Build stage
FROM golang:1.21-alpine AS builder
WORKDIR /src
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 go build -o /app/main .
# Final stage
FROM alpine:latest
COPY --from=builder /app/main /main
CMD ["/main"]
চূড়ান্ত ইমেজে শুধুমাত্র কম্পাইল করা বাইনারি এবং অ্যালপাইন থাকে, Go টুলচেইন নয়।
ভলিউম দিয়ে ডেটা পরিচালনা
কন্টেইনারগুলি ক্ষণস্থায়ী; যখন সেগুলি সরানো হয়, তাদের ডেটা হারিয়ে যায়। ভলিউম কন্টেইনার লাইফসাইকেলের বাইরে ডেটা সংরক্ষণ করে। ডেটাবেস, আপলোড বা রিস্টার্টের পরেও টিকে থাকতে হবে এমন যেকোনো স্টেটের জন্য এগুলি ব্যবহার করুন।
docker run -v my-data:/var/lib/postgresql/data postgres
এটি একটি নামযুক্ত ভলিউম my-data তৈরি করে যা Docker পরিচালনা করে। ডেভেলপমেন্টের জন্য, আপনি লাইভ রিলোডিংয়ের জন্য আপনার সোর্স কোড কন্টেইনারে বাইন্ড-মাউন্ট করতে পারেন:
docker run -v $(pwd):/app -p 3000:3000 my-app
Docker Compose: একাধিক কন্টেইনার অর্কেস্ট্রেশন
বাস্তব অ্যাপ্লিকেশনগুলির প্রায়ই একাধিক পরিষেবার প্রয়োজন হয়: একটি ওয়েব সার্ভার, একটি ডেটাবেস, একটি ক্যাশে। প্রতিটি docker run দিয়ে শুরু করা ক্লান্তিকর এবং ত্রুটিপূর্ণ। Docker Compose আপনাকে একটি একক YAML ফাইল দিয়ে মাল্টি-কন্টেইনার অ্যাপ সংজ্ঞায়িত এবং চালানোর অনুমতি দেয়।
একটি ব্যবহারিক docker-compose.yml
এখানে PostgreSQL এবং Redis সহ একটি Node.js অ্যাপের জন্য একটি Compose ফাইল:
version: '3.8'
services:
web:
build: .
ports:
- "3000:3000"
environment:
- DATABASE_URL=postgres://user:pass@db:5432/mydb
- REDIS_URL=redis://cache:6379
depends_on:
- db
- cache
db:
image: postgres:15-alpine
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: pass
POSTGRES_DB: mydb
volumes:
- postgres_data:/var/lib/postgresql/data
cache:
image: redis:7-alpine
volumes:
postgres_data:
সমস্ত পরিষেবা শুরু করতে docker compose up চালান। Compose একটি ডিফল্ট নেটওয়ার্ক তৈরি করে যাতে কন্টেইনারগুলি পরিষেবা নাম (যেমন, db, cache) দ্বারা একে অপরের কাছে পৌঁছাতে পারে।
সাধারণ Compose কমান্ড
docker compose up -d– ডিটাচড মোডে (ব্যাকগ্রাউন্ডে) শুরু করুন।docker compose logs -f web– একটি পরিষেবার লগ অনুসরণ করুন।docker compose exec web sh– একটি চলমান কন্টেইনারে একটি শেল খুলুন।docker compose down– কন্টেইনার, নেটওয়ার্ক এবং ভলিউম বন্ধ এবং সরান (যদি না ভলিউমগুলি বাহ্যিক হয়)।
কখন Docker Compose বনাম Kubernetes ব্যবহার করবেন
Docker Compose স্থানীয় ডেভেলপমেন্ট, পরীক্ষা এবং ছোট ডিপ্লয়মেন্টের জন্য আদর্শ। Kubernetes বড় আকারে উৎপাদনের জন্য ক্লাস্টার জুড়ে কন্টেইনার অর্কেস্ট্রেশনে দক্ষ। অনেক ডেভেলপারদের জন্য, দৈনন্দিন কাজের জন্য Compose যথেষ্ট, এবং আপনি যখন অটো-স্কেলিং, স্ব-নিরাময় এবং উন্নত নেটওয়ার্কিং প্রয়োজন তখন Kubernetes-এ উন্নীত হতে পারেন।
| বৈশিষ্ট্য | Docker Compose | Kubernetes |
|---|---|---|
| ব্যবহারের ক্ষেত্র | স্থানীয় ডেভ, ছোট ডিপ্লয়মেন্ট | উৎপাদন ক্লাস্টার |
| জটিলতা | কম | উচ্চ |
| স্কেলিং | ম্যানুয়াল | স্বয়ংক্রিয় |
| শেখার বক্ররেখা | মৃদু | খাড়া |
সাধারণ জিজ্ঞাসা
একটি ইমেজ এবং একটি কন্টেইনারের মধ্যে পার্থক্য কী?
একটি ইমেজ হল একটি রিড-অনলি টেমপ্লেট যা আপনার অ্যাপ এবং নির্ভরতা ধারণ করে। একটি কন্টেইনার হল একটি ইমেজের চলমান উদাহরণ। আপনি একটি ইমেজ থেকে অনেক কন্টেইনার চালাতে পারেন।
আমি কীভাবে Docker ইমেজের আকার কমাতে পারি?
ছোট বেস ইমেজ (যেমন Alpine), মাল্টি-স্টেজ বিল্ড, RUN কমান্ড একত্রিত করুন এবং অপ্রয়োজনীয় ফাইল বাদ দিতে একটি .dockerignore ফাইল ব্যবহার করুন।
আমি কি উৎপাদনে Docker Compose ব্যবহার করতে পারি?
হ্যাঁ, ছোট আকারের ডিপ্লয়মেন্টের জন্য। বড়, গতিশীল পরিবেশের জন্য, Kubernetes বা Docker Swarm আরও উপযুক্ত।
আপনার Docker ওয়ার্কফ্লো অপ্টিমাইজ করতে প্রস্তুত? আপনার কন্টেইনারাইজড ওয়েব সার্ভার ডিবাগ এবং মনিটর করতে আমাদের Nginx Log Analyzer দেখুন।