spinny:~/writing $ vim docker-containers-complete-guide.md
1~2Docker আমাদের সফটওয়্যার তৈরি, শিপ এবং চালানোর পদ্ধতি বদলে দিয়েছে। "আমার মেশিনে কাজ করে"-এর বদলে, Docker নিশ্চিত করে যে আপনার অ্যাপ্লিকেশন সব জায়গায় একইভাবে চলবে - আপনার ল্যাপটপে, সহকর্মীর মেশিনে, CI/CD-তে এবং প্রোডাকশনে। এই গাইডে, আমরা শূন্য থেকে শুরু করে একটি বাস্তব অ্যাপ্লিকেশন ডিপ্লয় করা পর্যন্ত যাব।3~4## Docker কী?5~6Docker হলো একটি প্ল্যাটফর্ম যা আপনার অ্যাপ্লিকেশন এবং এর সমস্ত নির্ভরতা একটি মানসম্মত ইউনিটে প্যাকেজ করে যাকে **কন্টেইনার** বলা হয়। কন্টেইনার হলো একটি বিচ্ছিন্ন, হালকা প্রক্রিয়া যা হোস্ট OS কার্নেল শেয়ার করে কিন্তু এর নিজস্ব ফাইলসিস্টেম, নেটওয়ার্ক এবং প্রক্রিয়া স্থান আছে।7~8```mermaid9graph TD10 subgraph "Traditional Deployment"11 A1[App 1] --> OS1[Guest OS]12 A2[App 2] --> OS2[Guest OS]13 OS1 --> HV[Hypervisor]14 OS2 --> HV15 HV --> HW1[Hardware]16 end17~18 subgraph "Docker Deployment"19 B1[App 1] --> D1[Container]20 B2[App 2] --> D2[Container]21 D1 --> DE[Docker Engine]22 D2 --> DE23 DE --> HW2[Hardware]24 end25```26~27### কন্টেইনার বনাম ভার্চুয়াল মেশিন28~29| দিক | কন্টেইনার | ভার্চুয়াল মেশিন |30|-----|-----------|-----------------|31| **স্টার্টআপ** | সেকেন্ড | মিনিট |32| **আকার** | MBs | GBs |33| **OS** | হোস্ট কার্নেল শেয়ার করে | সম্পূর্ণ গেস্ট OS |34| **আইসোলেশন** | প্রক্রিয়া-স্তর | হার্ডওয়্যার-স্তর |35| **পারফরম্যান্স** | প্রায় নেটিভ | হাইপারভাইজরের ওভারহেড |36| **ঘনত্ব** | প্রতি হোস্টে শত শত | প্রতি হোস্টে কয়েক ডজন |37~38## Docker ইনস্টল করা39~40```bash41# macOS42brew install --cask docker43~44# Ubuntu/Debian45curl -fsSL https://get.docker.com | sh46sudo usermod -aG docker $USER47~48# Verify installation49docker --version50docker run hello-world51```52~53## মূল ধারণা54~55### ইমেজ56~57একটি ইমেজ হলো একটি রিড-অনলি টেমপ্লেট যাতে কন্টেইনার তৈরির নির্দেশনা থাকে। এটিকে আপনার অ্যাপ্লিকেশন এবং এর পরিবেশের একটি স্ন্যাপশট হিসেবে ভাবুন।58~59```bash60# Pull an image from Docker Hub61docker pull node:20-alpine62~63# List local images64docker images65~66# Remove an image67docker rmi node:20-alpine68```69~70### কন্টেইনার71~72কন্টেইনার হলো একটি ইমেজের চলমান ইনস্ট্যান্স। আপনি কন্টেইনার তৈরি, শুরু, বন্ধ এবং মুছে ফেলতে পারেন।73~74```bash75# Run a container76docker run -d --name my-app -p 3000:3000 node:20-alpine77~78# List running containers79docker ps80~81# List all containers (including stopped)82docker ps -a83~84# Stop a container85docker stop my-app86~87# Remove a container88docker rm my-app89~90# View logs91docker logs my-app92~93# Execute a command inside a running container94docker exec -it my-app sh95```96~97## Dockerfile লেখা98~99Dockerfile হলো একটি টেক্সট ফাইল যাতে ইমেজ তৈরির নির্দেশনা থাকে। প্রতিটি নির্দেশনা একটি লেয়ার তৈরি করে।100~101### Node.js অ্যাপের জন্য বেসিক Dockerfile102~103```dockerfile104# Use an official Node.js runtime as base image105FROM node:20-alpine106~107# Set working directory108WORKDIR /app109~110# Copy package files first (better caching)111COPY package.json package-lock.json ./112~113# Install dependencies114RUN npm ci --only=production115~116# Copy application code117COPY . .118~119# Expose the port the app runs on120EXPOSE 3000121~122# Command to run the application123CMD ["node", "server.js"]124```125~126### বিল্ড এবং রান127~128```bash129# Build the image130docker build -t my-node-app .131~132# Run the container133docker run -d -p 3000:3000 my-node-app134~135# Visit http://localhost:3000136```137~138## মাল্টি-স্টেজ বিল্ড139~140মাল্টি-স্টেজ বিল্ড বিল্ড পরিবেশকে রানটাইম থেকে আলাদা করে আপনার প্রোডাকশন ইমেজ ছোট রাখে।141~142```dockerfile143# Stage 1: Build144FROM node:20-alpine AS builder145WORKDIR /app146COPY package.json package-lock.json ./147RUN npm ci148COPY . .149RUN npm run build150~151# Stage 2: Production152FROM node:20-alpine AS runner153WORKDIR /app154COPY --from=builder /app/dist ./dist155COPY --from=builder /app/node_modules ./node_modules156COPY --from=builder /app/package.json ./157EXPOSE 3000158CMD ["node", "dist/server.js"]159```160~161এটি শুধুমাত্র কম্পাইল করা আউটপুট এবং প্রোডাকশন নির্ভরতা সহ একটি ইমেজ তৈরি করে - কোনো সোর্স কোড নেই, কোনো ডেভ নির্ভরতা নেই, কোনো বিল্ড টুল নেই।162~163### Next.js মাল্টি-স্টেজ উদাহরণ164~165```dockerfile166FROM node:20-alpine AS deps167WORKDIR /app168COPY package.json package-lock.json ./169RUN npm ci170~171FROM node:20-alpine AS builder172WORKDIR /app173COPY --from=deps /app/node_modules ./node_modules174COPY . .175RUN npm run build176~177FROM node:20-alpine AS runner178WORKDIR /app179ENV NODE_ENV=production180COPY --from=builder /app/public ./public181COPY --from=builder /app/.next/standalone ./182COPY --from=builder /app/.next/static ./.next/static183EXPOSE 3000184CMD ["node", "server.js"]185```186~187## ভলিউম: স্থায়ী ডেটা188~189ডিফল্টভাবে, কন্টেইনারের ভিতরের ডেটা কন্টেইনার মুছে ফেলার সময় হারিয়ে যায়। ভলিউম এই সমস্যার সমাধান করে।190~191```bash192# Create a named volume193docker volume create my-data194~195# Run with a volume196docker run -d -v my-data:/app/data my-app197~198# Bind mount (map host directory to container)199docker run -d -v $(pwd)/data:/app/data my-app200~201# List volumes202docker volume ls203```204~205## নেটওয়ার্কিং206~207Docker কন্টেইনারদের যোগাযোগের জন্য বিচ্ছিন্ন নেটওয়ার্ক তৈরি করে।208~209```bash210# Create a custom network211docker network create my-network212~213# Run containers on the same network214docker run -d --name api --network my-network my-api215docker run -d --name db --network my-network postgres:16216~217# Containers can reach each other by name218# From "api" container: postgres://db:5432219```220~221```mermaid222graph LR223 subgraph "my-network"224 API[api container\nport 3000] -- "db:5432" --> DB[db container\nport 5432]225 end226 User -- "localhost:3000" --> API227```228~229## Docker Compose230~231Docker Compose আপনাকে একটি YAML ফাইল দিয়ে মাল্টি-কন্টেইনার অ্যাপ্লিকেশন সংজ্ঞায়িত এবং চালাতে দেয়।232~233### docker-compose.yml234~235```yaml236services:237 api:238 build: ./api239 ports:240 - "3000:3000"241 environment:242 - DATABASE_URL=postgres://user:pass@db:5432/mydb243 depends_on:244 - db245~246 db:247 image: postgres:16-alpine248 environment:249 - POSTGRES_USER=user250 - POSTGRES_PASSWORD=pass251 - POSTGRES_DB=mydb252 volumes:253 - pgdata:/var/lib/postgresql/data254 ports:255 - "5432:5432"256~257 redis:258 image: redis:7-alpine259 ports:260 - "6379:6379"261~262volumes:263 pgdata:264```265~266### কমান্ড267~268```bash269# Start all services270docker compose up -d271~272# View logs273docker compose logs -f274~275# Stop all services276docker compose down277~278# Rebuild and restart279docker compose up -d --build280~281# Scale a service282docker compose up -d --scale api=3283```284~285## .dockerignore286~287`.gitignore`-এর মতো, এই ফাইলটি অপ্রয়োজনীয় ফাইলগুলোকে ইমেজে কপি হওয়া থেকে আটকায়।288~289```plaintext290node_modules291.git292.env293*.md294.next295dist296coverage297```298~299## প্রোডাকশনের সেরা অনুশীলন300~301### 1. ছোট বেস ইমেজ ব্যবহার করুন302~303```dockerfile304# Bad: 1GB+305FROM node:20306~307# Good: ~180MB308FROM node:20-alpine309```310~311### 2. Root হিসেবে চালাবেন না312~313```dockerfile314FROM node:20-alpine315RUN addgroup -S app && adduser -S app -G app316USER app317WORKDIR /home/app318COPY --chown=app:app . .319```320~321### 3. নির্দিষ্ট ইমেজ ট্যাগ ব্যবহার করুন322~323```dockerfile324# Bad: can change unexpectedly325FROM node:latest326~327# Good: pinned version328FROM node:20.11-alpine3.19329```330~331### 4. বিল্ড ক্যাশের সুবিধা নিন332~333আপনার Dockerfile নির্দেশনাগুলো সবচেয়ে কম থেকে সবচেয়ে বেশি পরিবর্তিত হওয়ার ক্রমে সাজান:334~335```dockerfile336FROM node:20-alpine337WORKDIR /app338~339# These change rarely - cached340COPY package.json package-lock.json ./341RUN npm ci --only=production342~343# This changes often - not cached344COPY . .345```346~347### 5. হেলথ চেক348~349```dockerfile350HEALTHCHECK --interval=30s --timeout=3s --retries=3 \351 CMD wget -qO- http://localhost:3000/health || exit 1352```353~354### 6. এনভায়রনমেন্ট ভেরিয়েবল ব্যবহার করুন355~356```dockerfile357ENV NODE_ENV=production358ENV PORT=3000359```360~361## সাধারণ Docker কমান্ড চিট শিট362~363```bash364# Images365docker build -t name:tag . # Build image366docker images # List images367docker rmi image_name # Remove image368docker image prune # Remove unused images369~370# Containers371docker run -d -p 3000:3000 image # Run detached372docker ps # List running373docker stop container_name # Stop374docker rm container_name # Remove375docker logs -f container_name # Follow logs376docker exec -it container sh # Shell into container377~378# Compose379docker compose up -d # Start services380docker compose down # Stop services381docker compose logs -f # Follow all logs382docker compose ps # List services383~384# Cleanup385docker system prune -a # Remove everything unused386```387~388## Docker থেকে Kubernetes389~390Docker পৃথক কন্টেইনার পরিচালনা করে। যখন আপনাকে একাধিক সার্ভারে শত শত কন্টেইনার অর্কেস্ট্রেট করতে হয়, তখন আপনার Kubernetes দরকার। Docker এবং Kubernetes পরিপূরক:391~3921. **Docker**: কন্টেইনার তৈরি এবং চালায়3932. **Kubernetes**: বড় পরিসরে কন্টেইনার অর্কেস্ট্রেট করে (শিডিউলিং, স্কেলিং, হিলিং)394~395আপনি যদি পরবর্তী ধাপে আগ্রহী হন, Kubernetes পরিচিতি সম্পর্কে আমার লেখাটি দেখুন।396~397## উপসংহার398~399Docker আধুনিক ডেভেলপারদের জন্য একটি মৌলিক দক্ষতা। এটি পরিবেশের অসামঞ্জস্যতা দূর করে, ডিপ্লয়মেন্ট সহজ করে, এবং Kubernetes দিয়ে কন্টেইনার অর্কেস্ট্রেশনের ভিত্তি। একটি সহজ Dockerfile দিয়ে শুরু করুন, মাল্টি-সার্ভিস অ্যাপের জন্য Docker Compose-এ যান, এবং আপনি বাড়ার সাথে সাথে মাল্টি-স্টেজ বিল্ড এবং নিরাপত্তার সেরা অনুশীলন গ্রহণ করুন।400~401Docker শেখার সেরা উপায় হলো আপনি ইতিমধ্যে যে প্রজেক্টে কাজ করছেন সেটি কন্টেইনারাইজ করা। আজই শুরু করুন।402~
NORMAL · docker-containers-complete-guide.md [readonly]402 lines · :q to close