spinny:~/writing $ vim docker-containers-complete-guide.md
1~2غيّر Docker طريقة بنائنا وشحننا وتشغيلنا للبرمجيات. بدلاً من "يعمل على جهازي"، يضمن Docker أن تطبيقك يعمل بنفس الطريقة في كل مكان - على حاسوبك المحمول، على جهاز زميلك، في CI/CD، وفي الإنتاج. في هذا الدليل، سننتقل من الصفر إلى نشر تطبيق حقيقي.3~4## ما هو Docker؟5~6Docker هو منصة تحزم تطبيقك وجميع تبعياته في وحدة موحدة تسمى **حاوية**. الحاوية هي عملية معزولة وخفيفة الوزن تشارك نواة نظام التشغيل المضيف ولكن لها نظام ملفات وشبكة ومساحة عمليات خاصة بها.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| **الحجم** | ميغابايت | غيغابايت |33| **نظام التشغيل** | يشارك نواة المضيف | نظام تشغيل ضيف كامل |34| **العزل** | على مستوى العملية | على مستوى العتاد |35| **الأداء** | شبه أصلي | عبء إضافي من المراقب |36| **الكثافة** | مئات لكل مضيف | عشرات لكل مضيف |37~38## تثبيت Docker39~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## كتابة Dockerfile98~99Dockerfile هو ملف نصي يحتوي على تعليمات لبناء صورة. كل تعليمة تنشئ طبقة.100~101### Dockerfile أساسي لتطبيق Node.js102~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.js164~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~207ينشئ Docker شبكات معزولة لتمكين الحاويات من التواصل.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~231يتيح لك Docker 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. لا تشغّل كـ Root312~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~390يدير Docker الحاويات الفردية. عندما تحتاج إلى تنسيق مئات الحاويات عبر خوادم متعددة، تحتاج إلى Kubernetes. Docker و Kubernetes متكاملان:391~3921. **Docker**: يبني ويشغل الحاويات3932. **Kubernetes**: ينسق الحاويات على نطاق واسع (الجدولة، التوسع، الإصلاح الذاتي)394~395إذا كنت مهتماً بالخطوة التالية، اطلع على مقالتي حول مقدمة في Kubernetes.396~397## الخلاصة398~399Docker مهارة أساسية للمطورين المعاصرين. إنه يزيل التناقضات في البيئات، يبسط النشر، وهو الأساس لتنسيق الحاويات مع Kubernetes. ابدأ بـ Dockerfile بسيط، انتقل إلى Docker Compose للتطبيقات متعددة الخدمات، واعتمد البناء متعدد المراحل وأفضل ممارسات الأمان مع تقدمك.400~401أفضل طريقة لتعلم Docker هي حاوية مشروع تعمل عليه بالفعل. ابدأ اليوم.402~
NORMAL · docker-containers-complete-guide.md [readonly]402 lines · :q to close