انتقل إلى المحتوى الرئيسي
العودة إلى الفئة

النسخ الاحتياطي للحاويات: استراتيجيات حماية البيانات في Docker و Kubernetes

النسخ الاحتياطي لـ Docker volume، حالة الحاوية، Kubernetes persistent volume، النسخ الاحتياطي لـ K8s مع Velero، سكريبتات النسخ الاحتياطي التلقائي وتخطيط التعافي من الكوارث.

وقت القراءة: 16 dk الحاويات والتنسيق
dockerkubernetesنسخ احتياطيvelerovolumeتعافي من الكوارثحماية البيانات

جدول المحتويات

النسخ الاحتياطي للحاويات: استراتيجيات حماية البيانات

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

اختيار استراتيجية النسخ الاحتياطي

الاستراتيجيةمناسبة لـالأداة
نسخ احتياطي للـ volumeقاعدة البيانات، تخزين الملفاتtar, rsync
نسخ احتياطي للصورةحالة التطبيقdocker save
لقطةاسترداد سريعLVM, ZFS
نسخ احتياطي K8sالكلاستر بأكملهVelero
نسخ احتياطي بعيدالتعافي من الكوارثRestic, Rclone

1. النسخ الاحتياطي لـ Docker Volume

النسخ الاحتياطي اليدوي للـ Volume

hljs bash
# نسخ احتياطي للـ volume في أرشيف tar
docker run --rm \
  -v VOLUME_NAME:/data \
  -v $(pwd):/backup \
  alpine tar czf /backup/volume-backup-$(date +%Y%m%d).tar.gz -C /data .

# مثال: نسخ احتياطي لـ MySQL volume
docker run --rm \
  -v mysql-data:/data \
  -v /backups:/backup \
  alpine tar czf /backup/mysql-$(date +%Y%m%d-%H%M%S).tar.gz -C /data .

# استعادة الـ volume
docker run --rm \
  -v mysql-data:/data \
  -v /backups:/backup \
  alpine tar xzf /backup/mysql-20240101-120000.tar.gz -C /data

النسخ الاحتياطي مع الحاوية قيد التشغيل

hljs bash
# MySQL dump (أثناء تشغيل الحاوية)
docker exec mysql-db mysqldump \
  -u root -pStrongPass123! \
  --all-databases \
  --single-transaction \
  > /backups/mysql-dump-$(date +%Y%m%d).sql

# PostgreSQL dump
docker exec postgres-db pg_dumpall \
  -U postgres \
  > /backups/postgres-dump-$(date +%Y%m%d).sql

2. سكريبت النسخ الاحتياطي التلقائي

hljs bash
#!/bin/bash
# /usr/local/bin/docker-backup.sh

BACKUP_DIR="/backups/docker"
DATE=$(date +%Y%m%d-%H%M%S)
RETENTION_DAYS=7

mkdir -p "$BACKUP_DIR"

# نسخ احتياطي لجميع الـ volumes
for volume in $(docker volume ls -q); do
  echo "نسخ احتياطي: $volume"
  docker run --rm \
    -v "$volume":/data \
    -v "$BACKUP_DIR":/backup \
    alpine tar czf "/backup/${volume}-${DATE}.tar.gz" -C /data . 2>/dev/null
done

# نسخ احتياطي لـ MySQL
if docker ps --format '{{.Names}}' | grep -q mysql; then
  docker exec mysql-db mysqldump \
    -u root -pStrongPass123! \
    --all-databases \
    --single-transaction \
    > "$BACKUP_DIR/mysql-${DATE}.sql"
fi

# حذف النسخ الاحتياطية القديمة
find "$BACKUP_DIR" -name "*.tar.gz" -mtime +$RETENTION_DAYS -delete
find "$BACKUP_DIR" -name "*.sql" -mtime +$RETENTION_DAYS -delete

echo "اكتمل النسخ الاحتياطي: $DATE"
hljs bash
chmod +x /usr/local/bin/docker-backup.sh
# نسخ احتياطي يومي عبر cron
# 0 2 * * * /usr/local/bin/docker-backup.sh >> /var/log/docker-backup.log 2>&1

3. النسخ الاحتياطي البعيد مع Restic

hljs bash
# تثبيت Restic
apt install -y restic

# تهيئة المستودع
restic init --repo /backups/restic-repo

# نسخ احتياطي للـ volume
restic backup /tmp/mysql-backup \
  --repo /backups/restic-repo \
  --password-file /etc/restic/password \
  --tag mysql,docker

# عرض قائمة النسخ الاحتياطية
restic snapshots --repo /backups/restic-repo

# الاستعادة
restic restore SNAPSHOT_ID \
  --repo /backups/restic-repo \
  --target /tmp/restore

# تنظيف النسخ الاحتياطية القديمة
restic forget \
  --repo /backups/restic-repo \
  --keep-daily 7 \
  --keep-weekly 4 \
  --keep-monthly 3 \
  --prune

4. النسخ الاحتياطي لـ Kubernetes: Velero

hljs bash
# تثبيت Velero CLI
wget https://github.com/vmware-tanzu/velero/releases/download/v1.12.0/velero-v1.12.0-linux-amd64.tar.gz
tar xzf velero-v1.12.0-linux-amd64.tar.gz
mv velero-v1.12.0-linux-amd64/velero /usr/local/bin/

# نسخ احتياطي للكلاستر بأكمله
velero backup create full-backup --wait

# نسخ احتياطي لـ namespace محدد
velero backup create production-backup \
  --include-namespaces production \
  --wait

# عرض قائمة النسخ الاحتياطية
velero backup get

# الاستعادة من نسخة احتياطية
velero restore create --from-backup full-backup

النسخ الاحتياطي المجدول

hljs bash
# نسخ احتياطي يومي (الساعة 2 صباحاً)
velero schedule create daily-backup \
  --schedule="0 2 * * *" \
  --ttl 168h

# نسخ احتياطي أسبوعي كامل
velero schedule create weekly-backup \
  --schedule="0 1 * * 0" \
  --ttl 720h

5. سكريبت التحقق من النسخ الاحتياطية

hljs bash
#!/bin/bash
BACKUP_FILE="$1"

if tar tzf "$BACKUP_FILE" > /dev/null 2>&1; then
  echo "ملف النسخ الاحتياطي صالح: $BACKUP_FILE"
else
  echo "خطأ: ملف النسخ الاحتياطي تالف: $BACKUP_FILE"
  exit 1
fi

docker volume create test-restore
docker run --rm \
  -v test-restore:/data \
  -v $(dirname $BACKUP_FILE):/backup \
  alpine tar xzf "/backup/$(basename $BACKUP_FILE)" -C /data

echo "اختبار الاستعادة ناجح"
docker volume rm test-restore

الخلاصة

يجب تشكيل استراتيجية النسخ الاحتياطي للحاويات وفقاً لمتطلبات عملك. قد يكفي النسخ الاحتياطي للـ volume مع cron للبيئات الصغيرة، بينما تتطلب كلاسترات Kubernetes الإنتاجية أدوات متخصصة مثل Velero. مع اختبارات النسخ الاحتياطي والاستعادة المنتظمة على خوادم REXE يمكنك الحفاظ على أمان بياناتك.