شرح Docker للمبتدئين: من الصفر إلى أول حاوية
DevOps والأدوات

شرح Docker للمبتدئين: من الصفر إلى أول حاوية

Docker يحلّ مشكلة "الكود يعمل عندي" نهائياً. تعلّم ما هو، كيف يعمل، وكيف تُشغّل أول container في 5 دقائق.

م
مؤسس LahbabiGuide
4 دقائق قراءة
شارك:

المشكلة التي يحلّها Docker

سيناريو مألوف: تطبيقك يعمل على جهازك، لا يعمل على جهاز زميلك، ولا يعمل في الإنتاج. الأسباب:

  • إصدارات مختلفة من Node.js
  • قواعد بيانات غير مثبّتة
  • متغيّرات بيئة ناقصة
  • اختلافات بين Windows و Mac و Linux

Docker يحزم تطبيقك مع كل احتياجاته (نظام تشغيل مصغّر، أدوات، مكتبات) في صورة (image) تعمل بنفس الشكل على أيّ جهاز.

Image vs Container

هذان مفهومان مهمّان:

  • Image — "قالب" جاهز (مثل ملف .iso أو صورة برنامج)
  • Container — instance يعمل من صورة (مثل تطبيق مفتوح)

تصنع container من image، ويمكن أن يعمل عدّة containers من نفس الـ image.

التثبيت

Windows / Mac

حمّل Docker Desktop. يتضمّن كل ما تحتاج.

Linux

bash
curl -fsSL https://get.docker.com | sh
sudo usermod -aG docker $USER
# أعد تسجيل الدخول

اختبر:

bash
docker --version
docker run hello-world
إعلان

أول تجربة: nginx

شغّل خادم ويب كامل في سطر واحد:

bash
docker run -d -p 8080:80 --name my-nginx nginx

افتح http://localhost:8080 — ستجد nginx يعمل!

تحليل الأمر

  • docker run — شغّل container
  • -d — في الخلفية (detached)
  • -p 8080:80 — اربط منفذ 8080 على جهازك بـ 80 داخل الـ container
  • --name my-nginx — اسم مفيد
  • nginx — اسم الـ image

الأوامر الأساسية

bash
# قائمة الـ containers العاملة
docker ps

# الكل (حتى المتوقّفة)
docker ps -a

# إيقاف
docker stop my-nginx

# تشغيل مرّة أخرى
docker start my-nginx

# حذف (يجب إيقافه أولاً)
docker rm my-nginx

# الـ images المحمّلة
docker images

# حذف image
docker rmi nginx

# عرض logs
docker logs my-nginx

# دخول داخل container
docker exec -it my-nginx bash

Dockerfile: بناء image خاصّ بك

افرض أن لديك تطبيق Node.js بسيط:

app.js:

js
const http = require("http");
const server = http.createServer((req, res) => {
  res.writeHead(200, { "Content-Type": "text/plain" });
  res.end("مرحبا من Docker!");
});
server.listen(3000, () => console.log("listening on 3000"));

package.json:

json
{
  "name": "my-app",
  "version": "1.0.0",
  "scripts": { "start": "node app.js" }
}

Dockerfile (بدون امتداد):

dockerfile
# الـ base image
FROM node:20-alpine

# مجلد العمل داخل الـ container
WORKDIR /app

# انسخ package.json أولاً لاستغلال cache
COPY package*.json ./
RUN npm ci --omit=dev

# انسخ باقي الكود
COPY . .

# أخبر Docker أن التطبيق يستمع على 3000
EXPOSE 3000

# الأمر الذي يُنفَّذ عند تشغيل container
CMD ["npm", "start"]

بناء الـ image

bash
docker build -t my-node-app .

-t يعطي الـ image اسماً، و . يشير لمجلد الحالي.

تشغيل

bash
docker run -p 3000:3000 my-node-app

.dockerignore

كـ .gitignore لـ Docker — استبعد ملفات لا تحتاجها في الـ image:

node_modules
.env
.git
*.md
Dockerfile
.dockerignore

النتيجة: image أصغر وبناء أسرع.

Volumes: حفظ البيانات

مشكلة الـ containers: البيانات تُحذف عند حذف الـ container. الحلّ: volumes.

bash
# ربط مجلد جهازك بمجلد داخل container
docker run -v $(pwd)/data:/app/data my-app

# أو volume مُدار بواسطة Docker
docker run -v mydata:/app/data my-app

مثالي لقواعد البيانات:

bash
docker run -d \
  --name my-postgres \
  -e POSTGRES_PASSWORD=secret \
  -v pg_data:/var/lib/postgresql/data \
  -p 5432:5432 \
  postgres:16

متغيّرات البيئة

bash
# مع الأمر
docker run -e DATABASE_URL="postgres://..." -e API_KEY="xxx" my-app

# من ملف
docker run --env-file .env my-app

Docker Compose: عدّة containers بسهولة

لتطبيق يحتاج خادم + قاعدة بيانات + cache، نستخدم docker-compose.yml:

yaml
services:
  web:
    build: .
    ports:
      - "3000:3000"
    environment:
      DATABASE_URL: postgres://app:secret@db:5432/mydb
    depends_on:
      - db

  db:
    image: postgres:16
    environment:
      POSTGRES_USER: app
      POSTGRES_PASSWORD: secret
      POSTGRES_DB: mydb
    volumes:
      - pg_data:/var/lib/postgresql/data

  cache:
    image: redis:7-alpine

volumes:
  pg_data:

ثم:

bash
docker compose up -d      # شغّل الكل
docker compose down       # أوقف الكل
docker compose logs -f    # عرض logs مباشر

أفضل الممارسات

1. استخدم multi-stage builds

تصغّر الـ image بشكل كبير:

dockerfile
# مرحلة البناء
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

# مرحلة الإنتاج (أصغر)
FROM node:20-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
CMD ["node", "dist/server.js"]

2. لا تحفظ أسراراً في الـ Dockerfile

ENV API_KEY=sk-secret... ✅ استخدم -e وقت التشغيل أو secrets manager.

3. لا تعمل كـ root داخل container

dockerfile
RUN addgroup -S app && adduser -S app -G app
USER app

تنظيف

bash
# حذف كل ما هو متوقّف ومهمل
docker system prune

# حذف كل شيء (احذر!)
docker system prune -a --volumes

الأسئلة الشائعة

Docker vs VM؟

الآلة الافتراضية (VM) تحاكي عتاداً كاملاً — ثقيلة وبطيئة. Docker يشارك نواة نظام التشغيل — خفيف وسريع جداً.

هل أحتاج Docker على Windows العادي؟

Docker Desktop يستخدم WSL2 تحت الغطاء على Windows. تحتاج Windows 10 pro+ أو WSL2 مفعّلاً.

ما هو Kubernetes؟

Docker يشغّل containers على جهاز واحد. Kubernetes يدير آلاف الـ containers على عشرات الخوادم. ابدأ بـ Docker أولاً — معظم المشاريع لا تحتاج Kubernetes.

شارك:
المزيد من DevOps والأدوات
اقرأ أيضاً

مقالات ذات صلة