spinny:~/writing $ less docker-containers-complete-guide.md
12Docker نے ہمارے سافٹ ویئر بنانے، بھیجنے اور چلانے کے طریقے کو بدل دیا۔ "میری مشین پر کام کرتا ہے" کی بجائے، Docker اس بات کی ضمانت دیتا ہے کہ آپ کی ایپلیکیشن ہر جگہ ایک ہی طرح سے چلے - آپ کے لیپ ٹاپ پر، ساتھی کی مشین پر، CI/CD میں اور پروڈکشن میں۔ اس گائیڈ میں، ہم صفر سے شروع کر کے ایک حقیقی ایپلیکیشن ڈیپلائ کرنے تک پہنچیں گے۔34## Docker کیا ہے؟56Docker ایک پلیٹ فارم ہے جو آپ کی ایپلیکیشن اور اس کی تمام انحصاریوں کو ایک معیاری یونٹ میں پیکج کرتا ہے جسے **کنٹینر** کہا جاتا ہے۔ کنٹینر ایک الگ، ہلکا پروسیس ہے جو ہوسٹ OS کرنل شیئر کرتا ہے لیکن اس کا اپنا فائل سسٹم، نیٹ ورک اور پروسیس اسپیس ہوتا ہے۔78```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 end1718 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```2627### کنٹینرز بمقابلہ ورچوئل مشینز2829| پہلو | کنٹینرز | ورچوئل مشینز |30|------|---------|-------------|31| **سٹارٹ اپ** | سیکنڈز | منٹ |32| **سائز** | MBs | GBs |33| **OS** | ہوسٹ کرنل شیئر کرتا ہے | مکمل گیسٹ OS |34| **آئسولیشن** | پروسیس سطح | ہارڈویئر سطح |35| **کارکردگی** | تقریباً نیٹو | ہائپروائزر سے اوور ہیڈ |36| **کثافت** | فی ہوسٹ سینکڑوں | فی ہوسٹ درجنوں |3738## Docker انسٹال کرنا3940```bash41# macOS42brew install --cask docker4344# Ubuntu/Debian45curl -fsSL https://get.docker.com | sh46sudo usermod -aG docker $USER4748# Verify installation49docker --version50docker run hello-world51```5253## بنیادی تصورات5455### امیجز5657ایک امیج ایک صرف پڑھنے والا ٹیمپلیٹ ہے جس میں کنٹینر بنانے کی ہدایات ہوتی ہیں۔ اسے اپنی ایپلیکیشن اور اس کے ماحول کا اسنیپ شاٹ سمجھیں۔5859```bash60# Pull an image from Docker Hub61docker pull node:20-alpine6263# List local images64docker images6566# Remove an image67docker rmi node:20-alpine68```6970### کنٹینرز7172کنٹینر ایک امیج کا چلتا ہوا نمونہ ہے۔ آپ کنٹینرز بنا سکتے ہیں، شروع کر سکتے ہیں، روک سکتے ہیں اور حذف کر سکتے ہیں۔7374```bash75# Run a container76docker run -d --name my-app -p 3000:3000 node:20-alpine7778# List running containers79docker ps8081# List all containers (including stopped)82docker ps -a8384# Stop a container85docker stop my-app8687# Remove a container88docker rm my-app8990# View logs91docker logs my-app9293# Execute a command inside a running container94docker exec -it my-app sh95```9697## Dockerfile لکھنا9899Dockerfile ایک ٹیکسٹ فائل ہے جس میں امیج بنانے کی ہدایات ہوتی ہیں۔ ہر ہدایت ایک لیئر بناتی ہے۔100101### Node.js ایپ کے لیے بنیادی Dockerfile102103```dockerfile104# Use an official Node.js runtime as base image105FROM node:20-alpine106107# Set working directory108WORKDIR /app109110# Copy package files first (better caching)111COPY package.json package-lock.json ./112113# Install dependencies114RUN npm ci --only=production115116# Copy application code117COPY . .118119# Expose the port the app runs on120EXPOSE 3000121122# Command to run the application123CMD ["node", "server.js"]124```125126### بلڈ اور رن کرنا127128```bash129# Build the image130docker build -t my-node-app .131132# Run the container133docker run -d -p 3000:3000 my-node-app134135# Visit http://localhost:3000136```137138## ملٹی اسٹیج بلڈز139140ملٹی اسٹیج بلڈز بلڈ ماحول کو رن ٹائم سے الگ کر کے آپ کی پروڈکشن امیجز کو چھوٹا رکھتے ہیں۔141142```dockerfile143# Stage 1: Build144FROM node:20-alpine AS builder145WORKDIR /app146COPY package.json package-lock.json ./147RUN npm ci148COPY . .149RUN npm run build150151# 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```160161یہ صرف کمپائل شدہ آؤٹ پٹ اور پروڈکشن انحصاریوں والی امیج بناتا ہے - کوئی سورس کوڈ نہیں، کوئی ڈیو انحصاریاں نہیں، کوئی بلڈ ٹولز نہیں۔162163### Next.js ملٹی اسٹیج مثال164165```dockerfile166FROM node:20-alpine AS deps167WORKDIR /app168COPY package.json package-lock.json ./169RUN npm ci170171FROM node:20-alpine AS builder172WORKDIR /app173COPY --from=deps /app/node_modules ./node_modules174COPY . .175RUN npm run build176177FROM 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```186187## والیومز: مستقل ڈیٹا188189بطور ڈیفالٹ، کنٹینر کے اندر کا ڈیٹا کنٹینر ہٹانے پر ضائع ہو جاتا ہے۔ والیومز یہ مسئلہ حل کرتے ہیں۔190191```bash192# Create a named volume193docker volume create my-data194195# Run with a volume196docker run -d -v my-data:/app/data my-app197198# Bind mount (map host directory to container)199docker run -d -v $(pwd)/data:/app/data my-app200201# List volumes202docker volume ls203```204205## نیٹ ورکنگ206207Docker کنٹینرز کی باہمی رابطے کے لیے الگ نیٹ ورکس بناتا ہے۔208209```bash210# Create a custom network211docker network create my-network212213# Run containers on the same network214docker run -d --name api --network my-network my-api215docker run -d --name db --network my-network postgres:16216217# Containers can reach each other by name218# From "api" container: postgres://db:5432219```220221```mermaid222graph LR223 subgraph "my-network"224 API[api container\nport 3000] -- "db:5432" --> DB[db container\nport 5432]225 end226 User -- "localhost:3000" --> API227```228229## Docker Compose230231Docker Compose آپ کو ایک YAML فائل سے ملٹی کنٹینر ایپلیکیشنز کی تعریف اور چلانے دیتا ہے۔232233### docker-compose.yml234235```yaml236services:237 api:238 build: ./api239 ports:240 - "3000:3000"241 environment:242 - DATABASE_URL=postgres://user:pass@db:5432/mydb243 depends_on:244 - db245246 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"256257 redis:258 image: redis:7-alpine259 ports:260 - "6379:6379"261262volumes:263 pgdata:264```265266### کمانڈز267268```bash269# Start all services270docker compose up -d271272# View logs273docker compose logs -f274275# Stop all services276docker compose down277278# Rebuild and restart279docker compose up -d --build280281# Scale a service282docker compose up -d --scale api=3283```284285## .dockerignore286287`.gitignore` کی طرح، یہ فائل غیر ضروری فائلوں کو امیج میں کاپی ہونے سے روکتی ہے۔288289```plaintext290node_modules291.git292.env293*.md294.next295dist296coverage297```298299## پروڈکشن کے بہترین طریقے300301### 1. چھوٹی بنیادی امیجز استعمال کریں302303```dockerfile304# Bad: 1GB+305FROM node:20306307# Good: ~180MB308FROM node:20-alpine309```310311### 2. Root کے طور پر نہ چلائیں312313```dockerfile314FROM node:20-alpine315RUN addgroup -S app && adduser -S app -G app316USER app317WORKDIR /home/app318COPY --chown=app:app . .319```320321### 3. مخصوص امیج ٹیگز استعمال کریں322323```dockerfile324# Bad: can change unexpectedly325FROM node:latest326327# Good: pinned version328FROM node:20.11-alpine3.19329```330331### 4. بلڈ کیش سے فائدہ اٹھائیں332333اپنی Dockerfile ہدایات کو سب سے کم سے سب سے زیادہ تبدیل ہونے والی ترتیب میں لگائیں:334335```dockerfile336FROM node:20-alpine337WORKDIR /app338339# These change rarely - cached340COPY package.json package-lock.json ./341RUN npm ci --only=production342343# This changes often - not cached344COPY . .345```346347### 5. ہیلتھ چیکس348349```dockerfile350HEALTHCHECK --interval=30s --timeout=3s --retries=3 \351 CMD wget -qO- http://localhost:3000/health || exit 1352```353354### 6. ماحولیاتی متغیرات استعمال کریں355356```dockerfile357ENV NODE_ENV=production358ENV PORT=3000359```360361## عام Docker کمانڈز چیٹ شیٹ362363```bash364# Images365docker build -t name:tag . # Build image366docker images # List images367docker rmi image_name # Remove image368docker image prune # Remove unused images369370# 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 container377378# Compose379docker compose up -d # Start services380docker compose down # Stop services381docker compose logs -f # Follow all logs382docker compose ps # List services383384# Cleanup385docker system prune -a # Remove everything unused386```387388## Docker سے Kubernetes تک389390Docker انفرادی کنٹینرز کو سنبھالتا ہے۔ جب آپ کو متعدد سرورز پر سینکڑوں کنٹینرز کو آرکیسٹریٹ کرنے کی ضرورت ہو، تو آپ کو Kubernetes کی ضرورت ہے۔ Docker اور Kubernetes ایک دوسرے کے تکمیلی ہیں:3913921. **Docker**: کنٹینرز بناتا اور چلاتا ہے3932. **Kubernetes**: بڑے پیمانے پر کنٹینرز کو آرکیسٹریٹ کرتا ہے (شیڈولنگ، اسکیلنگ، ہیلنگ)394395اگر آپ اگلے قدم میں دلچسپی رکھتے ہیں، تو Kubernetes کے تعارف پر میرا مضمون دیکھیں۔396397## نتیجہ398399Docker جدید ڈویلپرز کے لیے ایک بنیادی مہارت ہے۔ یہ ماحول کی عدم مطابقت کو ختم کرتا ہے، ڈیپلائمنٹ کو آسان بناتا ہے، اور Kubernetes کے ساتھ کنٹینر آرکیسٹریشن کی بنیاد ہے۔ ایک سادہ Dockerfile سے شروع کریں، ملٹی سروس ایپس کے لیے Docker Compose پر جائیں، اور جیسے جیسے آپ بڑھیں ملٹی اسٹیج بلڈز اور سیکورٹی کے بہترین طریقے اپنائیں۔400401Docker سیکھنے کا بہترین طریقہ اس پروجیکٹ کو کنٹینرائز کرنا ہے جس پر آپ پہلے سے کام کر رہے ہیں۔ آج ہی شروع کریں۔402
:Docker شروع کرنے والوں کے لیے: پہلی Image سے Production Deploy تکlines 1-402 (END) — press q to close