المشكلة التي يحلّها Docker
سيناريو مألوف: تطبيقك يعمل على جهازك، لا يعمل على جهاز زميلك، ولا يعمل في الإنتاج. الأسباب:
- إصدارات مختلفة من Node.js
- قواعد بيانات غير مثبّتة
- متغيّرات بيئة ناقصة
- اختلافات بين Windows و Mac و Linux
Docker يحزم تطبيقك مع كل احتياجاته (نظام تشغيل مصغّر، أدوات، مكتبات) في صورة (image) تعمل بنفس الشكل على أيّ جهاز.
Image vs Container
هذان مفهومان مهمّان:
- Image — "قالب" جاهز (مثل ملف
.isoأو صورة برنامج) - Container — instance يعمل من صورة (مثل تطبيق مفتوح)
تصنع container من image، ويمكن أن يعمل عدّة containers من نفس الـ image.
التثبيت
Windows / Mac
حمّل Docker Desktop. يتضمّن كل ما تحتاج.
Linux
curl -fsSL https://get.docker.com | sh
sudo usermod -aG docker $USER
# أعد تسجيل الدخولاختبر:
docker --version
docker run hello-worldأول تجربة: nginx
شغّل خادم ويب كامل في سطر واحد:
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
الأوامر الأساسية
# قائمة الـ 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 bashDockerfile: بناء image خاصّ بك
افرض أن لديك تطبيق Node.js بسيط:
app.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:
{
"name": "my-app",
"version": "1.0.0",
"scripts": { "start": "node app.js" }
}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
docker build -t my-node-app .-t يعطي الـ image اسماً، و . يشير لمجلد الحالي.
تشغيل
docker run -p 3000:3000 my-node-app.dockerignore
كـ .gitignore لـ Docker — استبعد ملفات لا تحتاجها في الـ image:
node_modules
.env
.git
*.md
Dockerfile
.dockerignoreالنتيجة: image أصغر وبناء أسرع.
Volumes: حفظ البيانات
مشكلة الـ containers: البيانات تُحذف عند حذف الـ container. الحلّ: volumes.
# ربط مجلد جهازك بمجلد داخل container
docker run -v $(pwd)/data:/app/data my-app
# أو volume مُدار بواسطة Docker
docker run -v mydata:/app/data my-appمثالي لقواعد البيانات:
docker run -d \
--name my-postgres \
-e POSTGRES_PASSWORD=secret \
-v pg_data:/var/lib/postgresql/data \
-p 5432:5432 \
postgres:16متغيّرات البيئة
# مع الأمر
docker run -e DATABASE_URL="postgres://..." -e API_KEY="xxx" my-app
# من ملف
docker run --env-file .env my-appDocker Compose: عدّة containers بسهولة
لتطبيق يحتاج خادم + قاعدة بيانات + cache، نستخدم docker-compose.yml:
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:ثم:
docker compose up -d # شغّل الكل
docker compose down # أوقف الكل
docker compose logs -f # عرض logs مباشرأفضل الممارسات
1. استخدم multi-stage builds
تصغّر الـ image بشكل كبير:
# مرحلة البناء
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
RUN addgroup -S app && adduser -S app -G app
USER appتنظيف
# حذف كل ما هو متوقّف ومهمل
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.