Docker نے ہمارے سافٹ ویئر بنانے، بھیجنے اور چلانے کے طریقے کو بدل دیا۔ "میری مشین پر کام کرتا ہے" کی بجائے، Docker اس بات کی ضمانت دیتا ہے کہ آپ کی ایپلیکیشن ہر جگہ ایک ہی طرح سے چلے - آپ کے لیپ ٹاپ پر، ساتھی کی مشین پر، CI/CD میں اور پروڈکشن میں۔ اس گائیڈ میں، ہم صفر سے شروع کر کے ایک حقیقی ایپلیکیشن ڈیپلائ کرنے تک پہنچیں گے۔
Docker کیا ہے؟
Docker ایک پلیٹ فارم ہے جو آپ کی ایپلیکیشن اور اس کی تمام انحصاریوں کو ایک معیاری یونٹ میں پیکج کرتا ہے جسے کنٹینر کہا جاتا ہے۔ کنٹینر ایک الگ، ہلکا پروسیس ہے جو ہوسٹ OS کرنل شیئر کرتا ہے لیکن اس کا اپنا فائل سسٹم، نیٹ ورک اور پروسیس اسپیس ہوتا ہے۔
کنٹینرز بمقابلہ ورچوئل مشینز
| پہلو | کنٹینرز | ورچوئل مشینز |
|---|---|---|
| سٹارٹ اپ | سیکنڈز | منٹ |
| سائز | MBs | GBs |
| OS | ہوسٹ کرنل شیئر کرتا ہے | مکمل گیسٹ OS |
| آئسولیشن | پروسیس سطح | ہارڈویئر سطح |
| کارکردگی | تقریباً نیٹو | ہائپروائزر سے اوور ہیڈ |
| کثافت | فی ہوسٹ سینکڑوں | فی ہوسٹ درجنوں |
Docker انسٹال کرنا
# macOS brew install --cask docker # Ubuntu/Debian curl -fsSL https://get.docker.com | sh sudo usermod -aG docker $USER # Verify installation docker --version docker run hello-world
بنیادی تصورات
امیجز
ایک امیج ایک صرف پڑھنے والا ٹیمپلیٹ ہے جس میں کنٹینر بنانے کی ہدایات ہوتی ہیں۔ اسے اپنی ایپلیکیشن اور اس کے ماحول کا اسنیپ شاٹ سمجھیں۔
# Pull an image from Docker Hub docker pull node:20-alpine # List local images docker images # Remove an image docker rmi node:20-alpine
کنٹینرز
کنٹینر ایک امیج کا چلتا ہوا نمونہ ہے۔ آپ کنٹینرز بنا سکتے ہیں، شروع کر سکتے ہیں، روک سکتے ہیں اور حذف کر سکتے ہیں۔
# Run a container docker run -d --name my-app -p 3000:3000 node:20-alpine # List running containers docker ps # List all containers (including stopped) docker ps -a # Stop a container docker stop my-app # Remove a container docker rm my-app # View logs docker logs my-app # Execute a command inside a running container docker exec -it my-app sh
Dockerfile لکھنا
Dockerfile ایک ٹیکسٹ فائل ہے جس میں امیج بنانے کی ہدایات ہوتی ہیں۔ ہر ہدایت ایک لیئر بناتی ہے۔
Node.js ایپ کے لیے بنیادی Dockerfile
# Use an official Node.js runtime as base image FROM node:20-alpine # Set working directory WORKDIR /app # Copy package files first (better caching) COPY package.json package-lock.json ./ # Install dependencies RUN npm ci --only=production # Copy application code COPY . . # Expose the port the app runs on EXPOSE 3000 # Command to run the application CMD ["node", "server.js"]
بلڈ اور رن کرنا
# Build the image docker build -t my-node-app . # Run the container docker run -d -p 3000:3000 my-node-app # Visit http://localhost:3000
ملٹی اسٹیج بلڈز
ملٹی اسٹیج بلڈز بلڈ ماحول کو رن ٹائم سے الگ کر کے آپ کی پروڈکشن امیجز کو چھوٹا رکھتے ہیں۔
# Stage 1: Build FROM node:20-alpine AS builder WORKDIR /app COPY package.json package-lock.json ./ RUN npm ci COPY . . RUN npm run build # Stage 2: Production FROM node:20-alpine AS runner WORKDIR /app COPY /app/dist ./dist COPY /app/node_modules ./node_modules COPY /app/package.json ./ EXPOSE 3000 CMD ["node", "dist/server.js"]
یہ صرف کمپائل شدہ آؤٹ پٹ اور پروڈکشن انحصاریوں والی امیج بناتا ہے - کوئی سورس کوڈ نہیں، کوئی ڈیو انحصاریاں نہیں، کوئی بلڈ ٹولز نہیں۔
Next.js ملٹی اسٹیج مثال
FROM node:20-alpine AS deps WORKDIR /app COPY package.json package-lock.json ./ RUN npm ci FROM node:20-alpine AS builder WORKDIR /app COPY /app/node_modules ./node_modules COPY . . RUN npm run build FROM node:20-alpine AS runner WORKDIR /app ENV NODE_ENV=production COPY /app/public ./public COPY /app/.next/standalone ./ COPY /app/.next/static ./.next/static EXPOSE 3000 CMD ["node", "server.js"]
والیومز: مستقل ڈیٹا
بطور ڈیفالٹ، کنٹینر کے اندر کا ڈیٹا کنٹینر ہٹانے پر ضائع ہو جاتا ہے۔ والیومز یہ مسئلہ حل کرتے ہیں۔
# Create a named volume docker volume create my-data # Run with a volume docker run -d -v my-data:/app/data my-app # Bind mount (map host directory to container) docker run -d -v $(pwd)/data:/app/data my-app # List volumes docker volume ls
نیٹ ورکنگ
Docker کنٹینرز کی باہمی رابطے کے لیے الگ نیٹ ورکس بناتا ہے۔
# Create a custom network docker network create my-network # Run containers on the same network docker run -d --name api --network my-network my-api docker run -d --name db --network my-network postgres:16 # Containers can reach each other by name # From "api" container: postgres://db:5432
Docker Compose
Docker Compose آپ کو ایک YAML فائل سے ملٹی کنٹینر ایپلیکیشنز کی تعریف اور چلانے دیتا ہے۔
docker-compose.yml
services: api: build: ./api ports: - "3000:3000" environment: - DATABASE_URL=postgres://user:pass@db:5432/mydb depends_on: - db db: image: postgres:16-alpine environment: - POSTGRES_USER=user - POSTGRES_PASSWORD=pass - POSTGRES_DB=mydb volumes: - pgdata:/var/lib/postgresql/data ports: - "5432:5432" redis: image: redis:7-alpine ports: - "6379:6379" volumes: pgdata:
کمانڈز
# Start all services docker compose up -d # View logs docker compose logs -f # Stop all services docker compose down # Rebuild and restart docker compose up -d --build # Scale a service docker compose up -d --scale api=3
.dockerignore
.gitignore کی طرح، یہ فائل غیر ضروری فائلوں کو امیج میں کاپی ہونے سے روکتی ہے۔
node_modules .git .env *.md .next dist coverage
پروڈکشن کے بہترین طریقے
1. چھوٹی بنیادی امیجز استعمال کریں
# Bad: 1GB+ FROM node:20 # Good: ~180MB FROM node:20-alpine
2. Root کے طور پر نہ چلائیں
FROM node:20-alpine RUN addgroup -S app && adduser -S app -G app USER app WORKDIR /home/app COPY . .
3. مخصوص امیج ٹیگز استعمال کریں
# Bad: can change unexpectedly FROM node:latest # Good: pinned version FROM node:20.11-alpine3.19
4. بلڈ کیش سے فائدہ اٹھائیں
اپنی Dockerfile ہدایات کو سب سے کم سے سب سے زیادہ تبدیل ہونے والی ترتیب میں لگائیں:
FROM node:20-alpine WORKDIR /app # These change rarely - cached COPY package.json package-lock.json ./ RUN npm ci --only=production # This changes often - not cached COPY . .
5. ہیلتھ چیکس
HEALTHCHECK \ CMD wget -qO- http://localhost:3000/health || exit 1
6. ماحولیاتی متغیرات استعمال کریں
ENV NODE_ENV=production ENV PORT=3000
عام Docker کمانڈز چیٹ شیٹ
# Images docker build -t name:tag . # Build image docker images # List images docker rmi image_name # Remove image docker image prune # Remove unused images # Containers docker run -d -p 3000:3000 image # Run detached docker ps # List running docker stop container_name # Stop docker rm container_name # Remove docker logs -f container_name # Follow logs docker exec -it container sh # Shell into container # Compose docker compose up -d # Start services docker compose down # Stop services docker compose logs -f # Follow all logs docker compose ps # List services # Cleanup docker system prune -a # Remove everything unused
Docker سے Kubernetes تک
Docker انفرادی کنٹینرز کو سنبھالتا ہے۔ جب آپ کو متعدد سرورز پر سینکڑوں کنٹینرز کو آرکیسٹریٹ کرنے کی ضرورت ہو، تو آپ کو Kubernetes کی ضرورت ہے۔ Docker اور Kubernetes ایک دوسرے کے تکمیلی ہیں:
- Docker: کنٹینرز بناتا اور چلاتا ہے
- Kubernetes: بڑے پیمانے پر کنٹینرز کو آرکیسٹریٹ کرتا ہے (شیڈولنگ، اسکیلنگ، ہیلنگ)
اگر آپ اگلے قدم میں دلچسپی رکھتے ہیں، تو Kubernetes کے تعارف پر میرا مضمون دیکھیں۔
نتیجہ
Docker جدید ڈویلپرز کے لیے ایک بنیادی مہارت ہے۔ یہ ماحول کی عدم مطابقت کو ختم کرتا ہے، ڈیپلائمنٹ کو آسان بناتا ہے، اور Kubernetes کے ساتھ کنٹینر آرکیسٹریشن کی بنیاد ہے۔ ایک سادہ Dockerfile سے شروع کریں، ملٹی سروس ایپس کے لیے Docker Compose پر جائیں، اور جیسے جیسے آپ بڑھیں ملٹی اسٹیج بلڈز اور سیکورٹی کے بہترین طریقے اپنائیں۔
Docker سیکھنے کا بہترین طریقہ اس پروجیکٹ کو کنٹینرائز کرنا ہے جس پر آپ پہلے سے کام کر رہے ہیں۔ آج ہی شروع کریں۔