مقدمة عن Docker

Docker هو منصة مفتوحة المصدر تسمح بإنشاء وتشغيل التطبيقات في بيئات معزولة تسمى "الحاويات" (Containers). تتيح هذه التقنية للمطورين تعبئة التطبيق مع جميع أجزائه، مثل المكتبات والتبعيات الأخرى، وشحنه كحزمة واحدة.

ما هي فوائد استخدام Docker؟

  • بيئات متطابقة: "يعمل على جهازي" لم تعد مشكلة؛ حيث تضمن Docker أن التطبيق سيعمل بنفس الطريقة في بيئات مختلفة، من التطوير إلى الإنتاج.
  • العزل: الحاويات توفر عزلًا على مستوى العمليات، مما يعني أن كل تطبيق وتبعياته تعمل في بيئة معزولة.
  • كفاءة الموارد: الحاويات تستخدم نفس نواة نظام التشغيل المضيف وتشارك موارد النظام، مما يجعلها أكثر كفاءة من الآلات الافتراضية (VMs).
  • سهولة النشر: يمكن نشر الحاويات بسرعة وتشغيل العديد منها على نفس الجهاز.
  • قابلية التوسع: يمكن بسهولة توسيع وإدارة التطبيقات المتعددة الحاويات باستخدام أدوات مثل Docker Compose و Kubernetes.

في الأساس، يحل Docker المشكلات التي تنشأ عند نقل البرامج من بيئة إلى أخرى من خلال إنشاء حاويات تتضمن كل ما يحتاجه التطبيق للعمل: الكود، وقت التشغيل، أدوات النظام، مكتبات النظام، والإعدادات.

المفاهيم الأساسية في Docker

الحاويات (Containers)

الحاوية هي نسخة قابلة للتشغيل من صورة Docker. يمكنك إنشاء الحاويات وتشغيلها وإيقافها وحذفها باستخدام واجهة Docker. الحاوية هي بيئة معزولة تعمل على نظام التشغيل المضيف، وتحتوي على كل ما يحتاجه التطبيق للعمل.

الصور (Images)

الصورة (Image) هي قالب للقراءة فقط يحتوي على تعليمات لإنشاء حاوية Docker. غالبًا ما تكون الصورة مبنية على صورة أخرى، مع بعض التخصيصات الإضافية. على سبيل المثال، قد تبني صورة تعتمد على صورة ubuntu، ولكنها تثبت خادم الويب Apache وتطبيقك، بالإضافة إلى تفاصيل التكوين اللازمة لتشغيل تطبيقك.


# سحب صورة من Docker Hub
docker pull nginx

# عرض الصور المتوفرة محليًا
docker images
                            

Dockerfile

Dockerfile هو ملف نصي يحتوي على جميع الأوامر التي يمكن للمستخدم استدعاؤها من سطر الأوامر لتجميع صورة. باستخدام docker build، يمكن للمستخدمين إنشاء عملية مؤتمتة تنفذ عدة أوامر متتالية في سطر الأوامر.


# استخدام صورة Node.js الأساسية
FROM node:14

# تعيين دليل العمل
WORKDIR /app

# نسخ ملفات التبعيات
COPY package*.json ./

# تثبيت التبعيات
RUN npm install

# نسخ كود المصدر
COPY . .

# تعريض المنفذ 3000
EXPOSE 3000

# أمر بدء التشغيل
CMD ["npm", "start"]
                            

Docker Hub

Docker Hub هو خدمة سحابية مقدمة من Docker تتيح للمستخدمين نشر صورهم المخصصة ومشاركتها مع الآخرين. يحتوي على آلاف الصور العامة من مصادر مجتمعية يمكن استخدامها كأساس لبناء تطبيقات وخدمات مخصصة.

Docker Compose

Docker Compose هي أداة لتعريف وتشغيل تطبيقات Docker متعددة الحاويات. باستخدام Compose، يمكنك استخدام ملف YAML لتكوين خدمات التطبيق المختلفة وتشغيلها جميعًا بأمر واحد.

تثبيت Docker

تثبيت Docker على نظام Windows

  1. قم بزيارة موقع Docker Desktop
  2. انقر على زر "Download for Windows" لتنزيل المثبت
  3. قم بتشغيل الملف الذي تم تنزيله (.exe) واتبع تعليمات المعالج
  4. بعد التثبيت، أعد تشغيل نظامك إذا طُلب منك ذلك
  5. قم بتشغيل Docker Desktop من قائمة البرامج

# للتحقق من التثبيت، افتح موجه الأوامر واكتب:
docker --version

# يجب أن ترى شيئًا مثل:
# Docker version 20.10.14, build a224086
                            

تثبيت Docker على نظام macOS

  1. قم بزيارة موقع Docker Desktop
  2. انقر على زر "Download for Mac" لتنزيل المثبت
  3. قم بتثبيت التطبيق بسحبه إلى مجلد التطبيقات
  4. قم بتشغيل Docker Desktop من مجلد التطبيقات

تثبيت Docker على نظام Linux (Ubuntu)

يمكنك تثبيت Docker على Ubuntu باستخدام مدير الحزم apt:


# تحديث قائمة الحزم
sudo apt-get update

# تثبيت الحزم المطلوبة
sudo apt-get install apt-transport-https ca-certificates curl gnupg lsb-release

# إضافة مفتاح GPG الرسمي لـ Docker
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

# إضافة مستودع Docker
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# تحديث قائمة الحزم مرة أخرى
sudo apt-get update

# تثبيت Docker Engine
sudo apt-get install docker-ce docker-ce-cli containerd.io

# التحقق من التثبيت
sudo docker run hello-world
                            

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

الأمر الوصف
docker --version عرض إصدار Docker المثبت
docker info عرض معلومات النظام لـ Docker
docker pull [اسم_الصورة] سحب صورة من Docker Hub
docker images عرض قائمة بجميع الصور المتوفرة محليًا
docker run [اسم_الصورة] إنشاء وتشغيل حاوية من صورة
docker ps عرض قائمة بالحاويات النشطة
docker ps -a عرض قائمة بجميع الحاويات (النشطة وغير النشطة)
docker stop [معرف_الحاوية] إيقاف حاوية نشطة
docker start [معرف_الحاوية] تشغيل حاوية متوقفة
docker rm [معرف_الحاوية] حذف حاوية
docker rmi [اسم_الصورة] حذف صورة
docker build -t [اسم_الصورة] . بناء صورة من Dockerfile في الدليل الحالي
docker exec -it [معرف_الحاوية] bash الدخول إلى حاوية نشطة بواسطة الطرفية
docker logs [معرف_الحاوية] عرض سجلات حاوية

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


# سحب صورة nginx من Docker Hub
docker pull nginx

# تشغيل حاوية nginx على المنفذ 8080
docker run --name my-nginx -p 8080:80 -d nginx

# عرض الحاويات النشطة
docker ps

# الدخول إلى حاوية
docker exec -it my-nginx bash

# إيقاف حاوية
docker stop my-nginx

# حذف حاوية
docker rm my-nginx

# حذف صورة
docker rmi nginx
                        

ملاحظة: في المثال أعلاه، -p 8080:80 تربط المنفذ 8080 على الجهاز المضيف بالمنفذ 80 داخل الحاوية، و -d تعني تشغيل الحاوية في الخلفية (وضع منفصل).

إنشاء وإدارة الصور

صور Docker هي قوالب للقراءة فقط تستخدم لإنشاء حاويات. يمكنك إنشاء صورك الخاصة أو استخدام صور موجودة من Docker Hub.

سحب الصور من Docker Hub

Docker Hub هو مستودع عام لصور Docker. يمكنك استخدام الأمر docker pull لسحب صور من Docker Hub:


# صيغة الأمر الأساسية
docker pull [اسم_الصورة]:[الإصدار]

# سحب صورة nginx بإصدار محدد
docker pull nginx:1.21

# سحب أحدث إصدار من صورة (latest)
docker pull ubuntu
                            

إدارة الصور المحلية

يمكنك عرض وإدارة الصور المخزنة محليًا على جهازك:


# عرض قائمة الصور المحلية
docker images

# البحث عن صورة محلية
docker images | grep nginx

# حذف صورة
docker rmi [اسم_الصورة]:[الإصدار]

# حذف جميع الصور
docker rmi $(docker images -q)
                            

إنشاء صور مخصصة

يمكنك إنشاء صور Docker مخصصة بطريقتين رئيسيتين:

  1. باستخدام الأمر docker commit: عن طريق إنشاء حاوية، إجراء تغييرات عليها، ثم حفظها كصورة جديدة.
  2. باستخدام Dockerfile: وهي الطريقة الموصى بها لأنها قابلة للتكرار ويمكن نسخها إلى مستودعات التحكم بالإصدار.

مثال على إنشاء صورة باستخدام docker commit:


# إنشاء حاوية وتشغيلها
docker run -it ubuntu bash

# [داخل الحاوية] تثبيت حزم
apt-get update
apt-get install -y nginx
exit

# حفظ التغييرات في صورة جديدة
docker commit [معرف_الحاوية] my-nginx-image:v1
                            

إنشاء صورة باستخدام Dockerfile (الطريقة المفضلة):


# إنشاء ملف Dockerfile
touch Dockerfile

# بناء الصورة
docker build -t my-app:v1 .
                            

دفع الصور إلى Docker Hub

يمكنك مشاركة صورك مع الآخرين عن طريق دفعها إلى Docker Hub:


# تسجيل الدخول إلى Docker Hub
docker login

# تسمية الصورة بالتنسيق المناسب
docker tag my-app:v1 username/my-app:v1

# دفع الصورة إلى Docker Hub
docker push username/my-app:v1
                            

إدارة الحاويات

إنشاء وتشغيل الحاويات

يمكنك استخدام الأمر docker run لإنشاء وتشغيل حاوية من صورة:


# الصيغة الأساسية
docker run [خيارات] [اسم_الصورة] [أمر]

# تشغيل حاوية في الخلفية
docker run -d nginx

# تسمية الحاوية
docker run --name my-container nginx

# ربط المنافذ (port mapping)
docker run -p 8080:80 nginx

# تحديد متغيرات البيئة
docker run -e MYSQL_ROOT_PASSWORD=password mysql

# ربط مجلد من المضيف إلى الحاوية (volume)
docker run -v /host/path:/container/path nginx

# مثال كامل
docker run -d --name my-web -p 8080:80 -v $(pwd):/usr/share/nginx/html nginx
                            

إدارة دورة حياة الحاوية

يمكنك التحكم في حالة الحاويات بعد إنشائها:


# عرض الحاويات النشطة
docker ps

# عرض جميع الحاويات (النشطة وغير النشطة)
docker ps -a

# إيقاف حاوية
docker stop my-container

# تشغيل حاوية متوقفة
docker start my-container

# إعادة تشغيل حاوية
docker restart my-container

# حذف حاوية
docker rm my-container

# حذف جميع الحاويات المتوقفة
docker container prune
                            

التفاعل مع الحاويات

يمكنك التفاعل مع الحاويات النشطة بعدة طرق:


# الدخول إلى حاوية نشطة
docker exec -it my-container bash

# عرض سجلات الحاوية
docker logs my-container

# عرض السجلات بشكل مستمر
docker logs -f my-container

# عرض معلومات مفصلة عن الحاوية
docker inspect my-container

# نسخ ملفات من وإلى الحاوية
docker cp my-file.txt my-container:/path/in/container/
docker cp my-container:/path/in/container/file.txt ./my-file.txt
                            

تشغيل الحاويات بخيارات متقدمة

بعض الخيارات المتقدمة لتشغيل الحاويات:


# تحديد موارد الحاوية (CPU و RAM)
docker run --memory=512m --cpus=0.5 nginx

# تشغيل الحاوية مع إعادة التشغيل التلقائي في حالة الفشل
docker run --restart=always nginx

# إضافة الحاوية إلى شبكة محددة
docker run --network=my-network nginx

# تشغيل الحاوية في وضع معزول (privileged mode)
docker run --privileged nginx
                            

ملفات Dockerfile

Dockerfile هو ملف نصي يحتوي على مجموعة من التعليمات التي تخبر Docker كيفية إنشاء صورة. يتم إنشاؤه عادة في جذر مشروعك.

هيكل ملف Dockerfile الأساسي


# التعليقات تبدأ بعلامة #

# تحديد الصورة الأساسية
FROM base_image:tag

# تحديد إنشاء الملف
MAINTAINER Author Name 

# تنفيذ أوامر لتثبيت البرامج
RUN command

# نسخ الملفات من جهاز المضيف إلى الصورة
COPY source destination
ADD source destination

# تحديد دليل العمل داخل الحاوية
WORKDIR /path/to/directory

# تعريف متغيرات البيئة
ENV key=value

# كشف المنافذ
EXPOSE port

# تحديد الأمر الافتراضي عند تشغيل الحاوية
CMD ["executable", "param1", "param2"]
ENTRYPOINT ["executable", "param1", "param2"]

# تحديد حجم للبيانات المستمرة
VOLUME /path/in/container
                            

التعليمات الأساسية في Dockerfile

التعليمة الوصف
FROM تحديد الصورة الأساسية التي سيتم بناء الصورة الجديدة عليها
RUN تنفيذ أوامر في طبقة جديدة فوق الصورة الحالية
COPY نسخ ملفات أو دلائل من جهاز المضيف إلى نظام ملفات الحاوية
ADD مثل COPY لكن مع ميزات إضافية مثل دعم URL وفك ضغط الملفات تلقائيًا
WORKDIR تعيين دليل العمل لتعليمات RUN و CMD و ENTRYPOINT و COPY و ADD اللاحقة
ENV تعيين متغيرات البيئة
EXPOSE إعلام Docker أن الحاوية تستمع على المنافذ المحددة عند التشغيل
CMD تحديد الأمر الافتراضي الذي سيتم تنفيذه عند تشغيل الحاوية (يمكن تجاوزه)
ENTRYPOINT تحديد البرنامج القابل للتنفيذ الذي سيتم تشغيله عند بدء الحاوية (لا يمكن تجاوزه بسهولة)
VOLUME إنشاء نقطة تركيب للمجلدات المستمرة

أمثلة على ملفات Dockerfile

مثال لـ Dockerfile لتطبيق Node.js:


# استخدام الصورة الرسمية لـ Node.js
FROM node:14

# تعيين دليل العمل
WORKDIR /app

# نسخ ملفات package.json وpackage-lock.json
COPY package*.json ./

# تثبيت التبعيات
RUN npm install

# نسخ باقي ملفات المشروع
COPY . .

# تعريض المنفذ 3000
EXPOSE 3000

# تعيين أمر بدء التشغيل
CMD ["npm", "start"]
                            

مثال لـ Dockerfile لتطبيق Python Flask:


# استخدام صورة Python الأساسية
FROM python:3.9-slim

# تعيين دليل العمل
WORKDIR /app

# نسخ ملف المتطلبات وتثبيتها
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# نسخ باقي الملفات
COPY . .

# تعيين متغيرات البيئة
ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0

# تعريض المنفذ 5000
EXPOSE 5000

# تشغيل التطبيق
CMD ["flask", "run"]
                            

أفضل الممارسات لكتابة Dockerfile

  • استخدم صور أساسية رسمية: الصور الرسمية يتم صيانتها وتحديثها بشكل منتظم وتكون أكثر أمانًا.
  • استخدم .dockerignore: لاستبعاد الملفات والمجلدات غير الضرورية من سياق البناء.
  • ادمج أوامر RUN: استخدم && لدمج عدة أوامر في تعليمة RUN واحدة لتقليل عدد الطبقات.
  • استخدم COPY بدلاً من ADD: الأمر COPY أكثر وضوحًا وبساطة في معظم الحالات.
  • استخدم تعليمات متعددة لـ COPY: ضع الملفات التي تتغير بشكل أقل تكرارًا في البداية.
  • حدد إصدارات محددة: استخدم إصدارات محددة للصور الأساسية بدلاً من استخدام العلامة latest.

Docker Compose

Docker Compose هي أداة لتعريف وتشغيل تطبيقات Docker متعددة الحاويات. باستخدام ملف YAML واحد، يمكنك تكوين خدمات التطبيق المختلفة وتشغيلها جميعًا بأمر واحد.

ملف docker-compose.yml

يحدد ملف docker-compose.yml خدمات التطبيق والشبكات والمجلدات المشتركة:


# إصدار Docker Compose
version: '3'

# تعريف الخدمات
services:
  # اسم الخدمة الأولى
  web:
    # بناء من Dockerfile في الدليل الحالي
    build: .
    # ربط المنافذ
    ports:
      - "5000:5000"
    # ربط المجلدات
    volumes:
      - ./app:/app
    # الاعتماد على خدمات أخرى
    depends_on:
      - redis
  
  # اسم الخدمة الثانية
  redis:
    # استخدام صورة جاهزة
    image: redis:alpine

# تعريف الشبكات
networks:
  default:
    driver: bridge

# تعريف المجلدات المستمرة
volumes:
  data:
                            

الأوامر الأساسية لـ Docker Compose


# تشغيل الخدمات المحددة في docker-compose.yml
docker-compose up

# تشغيل الخدمات في الخلفية
docker-compose up -d

# عرض حالة الخدمات
docker-compose ps

# عرض سجلات جميع الخدمات
docker-compose logs

# عرض سجلات خدمة محددة
docker-compose logs web

# إيقاف الخدمات
docker-compose stop

# إيقاف وإزالة الحاويات والشبكات
docker-compose down

# تشغيل أمر داخل حاوية
docker-compose exec web bash

# بناء أو إعادة بناء الخدمات
docker-compose build
                            

مثال عملي لـ Docker Compose

مثال لـ docker-compose.yml لتطبيق ويب مع قاعدة بيانات:


version: '3'

services:
  # تطبيق واجهة المستخدم
  frontend:
    build: ./frontend
    ports:
      - "3000:3000"
    volumes:
      - ./frontend:/app
      - /app/node_modules
    environment:
      - REACT_APP_API_URL=http://backend:5000
    depends_on:
      - backend

  # خدمة واجهة برمجة التطبيقات
  backend:
    build: ./backend
    ports:
      - "5000:5000"
    volumes:
      - ./backend:/app
    environment:
      - DATABASE_URL=mongodb://db:27017/myapp
    depends_on:
      - db

  # قاعدة البيانات
  db:
    image: mongo:latest
    ports:
      - "27017:27017"
    volumes:
      - mongodb_data:/data/db

volumes:
  mongodb_data:
                            

ميزات متقدمة في Docker Compose


version: '3.8'

services:
  web:
    build: 
      context: ./app
      dockerfile: Dockerfile.dev
    ports:
      - "8000:8000"
    environment:
      - NODE_ENV=development
    # إعادة تشغيل تلقائية
    restart: always
    # تحديد موارد الحاوية
    deploy:
      resources:
        limits:
          cpus: '0.5'
          memory: 512M
    # صحة الحاوية
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8000/health"]
      interval: 30s
      timeout: 10s
      retries: 3
                            

يمكنك أيضًا استخدام متغيرات البيئة في ملفات Docker Compose:


version: '3'

services:
  web:
    image: nginx
    ports:
      - "${NGINX_PORT:-80}:80"
    environment:
      - DEBUG=${DEBUG:-false}
                            

الشبكات في Docker

توفر Docker عدة أنواع من الشبكات لربط الحاويات ببعضها البعض وبالعالم الخارجي. فهم الشبكات يساعد في بناء تطبيقات متعددة الحاويات تتواصل بكفاءة.

أنواع الشبكات

نوع الشبكة الوصف
bridge الشبكة الافتراضية. تنشئ شبكة خاصة داخلية تستطيع الحاويات من خلالها التواصل مع بعضها البعض.
host تستخدم شبكة المضيف مباشرة، مما يلغي العزل بين شبكة الحاوية وشبكة المضيف.
none تعطيل جميع الشبكات. الحاوية لا تستطيع التواصل مع أي شيء خارجها.
overlay تربط عدة خوادم Docker معًا، مفيدة لخدمات Docker Swarm.
macvlan تمنح الحاويات عناوين MAC خاصة بها، لتظهر كأجهزة فعلية على الشبكة.

إدارة الشبكات

يمكنك إنشاء وإدارة شبكات Docker باستخدام الأوامر التالية:


# عرض قائمة الشبكات
docker network ls

# إنشاء شبكة جديدة
docker network create my_network

# إنشاء شبكة مع إعدادات مخصصة
docker network create --driver bridge --subnet=192.168.0.0/24 --gateway=192.168.0.1 my_custom_network

# التفاصيل المتعلقة بشبكة
docker network inspect my_network

# توصيل حاوية بشبكة
docker network connect my_network my_container

# فصل حاوية من شبكة
docker network disconnect my_network my_container

# حذف شبكة
docker network rm my_network
                            

الاتصال بين الحاويات

في Docker، يمكن للحاويات التواصل بعدة طرق:

  1. باستخدام اسم الحاوية: الحاويات على نفس الشبكة يمكنها التواصل عبر أسماء الحاويات.
  2. عبر ربط المنافذ: يمكن ربط منافذ الحاوية بمنافذ المضيف لجعلها متاحة للتطبيقات الخارجية.
  3. باستخدام شبكات مخصصة: تنظيم الحاويات في شبكات مختلفة لتحسين الأمان والأداء.

مثال على التواصل بين الحاويات في Docker Compose:


version: '3'

services:
  web:
    image: nginx
    ports:
      - "80:80"
    networks:
      - frontend
    depends_on:
      - api

  api:
    image: my-api
    networks:
      - frontend
      - backend
    environment:
      - DB_HOST=database
    depends_on:
      - database

  database:
    image: postgres
    networks:
      - backend
    volumes:
      - db-data:/var/lib/postgresql/data

networks:
  frontend:
  backend:

volumes:
  db-data:
                            

في هذا المثال، يمكن للخدمة web الوصول إلى api عبر اسمها، ويمكن للخدمة api الوصول إلى database عبر اسمها، ولكن web لا يمكنها الوصول مباشرة إلى database.

المجلدات وإدارة البيانات

تعتبر الحاويات مؤقتة بطبيعتها - يتم حذف أي تغييرات على نظام الملفات عند إزالة الحاوية. تقدم Docker آليات لتخزين البيانات خارج الحاويات.

أنواع التخزين في Docker

النوع الوصف الاستخدام
Volumes مساحات تخزين تديرها Docker في منطقة محجوزة على نظام المضيف. أفضل خيار للبيانات المستمرة، يمكن مشاركتها بين الحاويات.
Bind Mounts ربط مباشر بين مسار على المضيف ومسار في الحاوية. مفيد للتطوير وعندما تحتاج الحاوية للوصول إلى ملفات المضيف.
tmpfs تخزين مؤقت في ذاكرة المضيف فقط. للبيانات المؤقتة والحساسة التي لا تحتاج للاستمرارية.

إدارة المجلدات (Volumes)

المجلدات هي الطريقة المفضلة لإدارة البيانات المستمرة في Docker:


# إنشاء مجلد
docker volume create my_data

# عرض قائمة المجلدات
docker volume ls

# عرض تفاصيل مجلد
docker volume inspect my_data

# حذف مجلد
docker volume rm my_data

# حذف المجلدات غير المستخدمة
docker volume prune
                            

استخدام المجلدات مع الحاويات:


# استخدام مجلد عند تشغيل حاوية
docker run -v my_data:/path/in/container nginx

# استخدام bind mount لربط دليل محلي
docker run -v /host/path:/container/path nginx

# أمثلة شائعة لاستخدام المجلدات
docker run -v mysql_data:/var/lib/mysql mysql
docker run -v postgres_data:/var/lib/postgresql/data postgres
docker run -v mongodb_data:/data/db mongo
                            

استراتيجيات النسخ الاحتياطي واستعادة البيانات

حماية بيانات المجلدات والتعامل معها:


# نسخ احتياطي لمجلد Docker إلى ملف مضغوط
docker run --rm -v my_data:/source -v $(pwd):/backup alpine tar czf /backup/my_data_backup.tar.gz -C /source .

# استعادة مجلد من نسخة احتياطية
docker run --rm -v my_data:/target -v $(pwd):/backup alpine tar xzf /backup/my_data_backup.tar.gz -C /target

# نقل البيانات بين مجلدين
docker run --rm -v source_vol:/from -v destination_vol:/to alpine cp -av /from/. /to/
                            

أفضل الممارسات لإدارة البيانات:

  1. استخدم المجلدات للبيانات المستمرة: المجلدات أكثر كفاءة وسهلة الإدارة من ربط المجلدات (bind mounts).
  2. ضع خطة للنسخ الاحتياطي: اعمل نسخ احتياطية منتظمة للبيانات المهمة.
  3. استخدم تصريح وصول مناسب: تأكد من تعيين صلاحيات صحيحة للملفات والمجلدات.
  4. استخدم التسميات المناسبة: اختر أسماء وصفية للمجلدات تشير إلى محتواها.
  5. افصل البيانات عن التطبيق: يجعل تحديث التطبيق أو نقله أسهل دون فقدان البيانات.

أمن Docker

يقدم Docker مزايا أمنية كثيرة، لكنه يتطلب أيضًا اهتمامًا خاصًا لتجنب المخاطر الأمنية المحتملة.

أفضل الممارسات الأمنية

  • استخدم صور موثوقة: استخدم صور رسمية من مصادر موثوقة مثل Docker Hub الرسمي.
  • تشغيل كمستخدم غير root: تشغيل التطبيقات داخل الحاوية كمستخدم غير المستخدم الجذر.
  • تحديث الصور بانتظام: للحصول على آخر تصحيحات الأمان والإصلاحات.
  • مسح الثغرات الأمنية: استخدم أدوات مثل Docker Bench Security أو Clair لفحص الثغرات.
  • تقييد الوصول: تحديد الوصول إلى عفريت (daemon) Docker فقط للمستخدمين المعتمدين.
  • تقييد الموارد: تحديد موارد (CPU، الذاكرة) للحاويات لمنع هجمات حجب الخدمة.

إعدادات أمنية متقدمة


# تشغيل الحاوية كمستخدم غير المستخدم الجذر
docker run --user 1000:1000 nginx

# تشغيل الحاوية في وضع القراءة فقط
docker run --read-only nginx

# تعطيل امتيازات إضافية
docker run --security-opt=no-new-privileges nginx

# تقييد القدرات (capabilities)
docker run --cap-drop=ALL --cap-add=NET_BIND_SERVICE nginx

# استخدام ملفات AppArmor أو SELinux
docker run --security-opt apparmor=docker-default nginx
                            

استكشاف الأخطاء وإصلاحها

عند العمل مع Docker، قد تواجه بعض المشاكل الشائعة. إليك بعض الاستراتيجيات والحلول للمشاكل الأكثر شيوعًا.

أدوات التشخيص


# عرض سجلات الحاوية
docker logs container_name

# متابعة السجلات بشكل مباشر
docker logs -f container_name

# عرض معلومات وإحصائيات مفصلة عن الحاوية
docker stats container_name

# عرض عمليات التشغيل داخل الحاوية
docker top container_name

# الدخول إلى الحاوية لتنفيذ أوامر تشخيصية
docker exec -it container_name bash

# عرض معلومات النظام
docker system info

# عرض استخدام الموارد
docker system df
                            

المشاكل الشائعة وحلولها

المشكلة الحل المحتمل
لا يمكن بدء/إيقاف الحاويات - إعادة تشغيل عفريت Docker: sudo systemctl restart docker
- التحقق من وجود مساحة كافية على القرص: df -h
- التحقق من سجلات Docker: docker logs container_name
مشاكل الشبكة - فحص إعدادات الشبكة: docker network inspect network_name
- إعادة إنشاء الشبكة: docker network rm network_name && docker network create network_name
- التأكد من تكوين المنافذ بشكل صحيح: docker port container_name
مشاكل مساحة القرص - تنظيف الصور والحاويات غير المستخدمة: docker system prune -a
- إزالة المجلدات غير المستخدمة: docker volume prune
- مراقبة استخدام المساحة: docker system df
بطء في الأداء - مراقبة استخدام الموارد: docker stats
- تقييد موارد الحاويات: docker update --cpus=0.5 --memory=512m container_name
- تحديث إصدار Docker
فشل بناء الصور - التحقق من وجود Dockerfile صحيح
- التأكد من وجود ملفات المصدر
- محاولة بناء الصورة مع تعطيل ذاكرة التخزين المؤقت: docker build --no-cache .

أفضل ممارسات استكشاف الأخطاء

  1. راجع السجلات أولاً: غالبًا ما تكون سجلات الحاوية هي أفضل مصدر لمعرفة سبب المشكلة.
  2. تحقق من حالة الحاوية: استخدم docker ps -a لمعرفة حالة الحاوية والتحقق مما إذا كانت تعمل.
  3. تحقق من متطلبات النظام: تأكد من وجود موارد كافية (ذاكرة، مساحة تخزين) للحاويات.
  4. جرب الحاوية البسيطة: إذا كانت هناك مشكلة في الاتصال أو التكوين، جرب تشغيل حاوية بسيطة للتحقق من عمل Docker بشكل صحيح.
  5. استخدم وضع التصحيح: قم بتشغيل عفريت Docker في وضع التصحيح للحصول على معلومات أكثر تفصيلاً.

الخاتمة

في هذا الدليل، تعرفنا على أساسيات استخدام Docker لتطوير وتشغيل التطبيقات في حاويات. من المفاهيم الأساسية إلى التقنيات المتقدمة، أصبحت الآن على دراية بالجوانب المختلفة لتقنية الحاويات.

تقنية Docker تستمر في التطور، وهي جزء أساسي من مشهد التطوير الحديث وبنية DevOps. مع مواصلة استكشاف Docker، يمكنك تعزيز مهاراتك من خلال:

الخطوات التالية

  • استكشاف Docker Swarm و Kubernetes لإدارة وتنسيق مجموعات الحاويات.
  • تعلم ممارسات CI/CD لأتمتة نشر الحاويات.
  • تحسين Dockerfile للحصول على صور أصغر وأكثر أمانًا.
  • استكشاف خدمات الحاويات المدارة من مزودي الخدمة السحابية.
  • المساهمة في مشاريع Docker مفتوحة المصدر أو بناء أدوات خاصة بك.

موارد إضافية

شكرًا لاستخدامك دليل Docker الخاص بنا. نتمنى أن يكون هذا المورد قد ساعدك في فهم وتطبيق تقنية الحاويات في مشاريعك. لا تتردد في العودة إلى هذا الدليل كلما احتجت إلى تذكير أو مرجع سريع.