النسخ الاحتياطي للحاويات: استراتيجيات حماية البيانات في Docker و Kubernetes
النسخ الاحتياطي لـ Docker volume، حالة الحاوية، Kubernetes persistent volume، النسخ الاحتياطي لـ K8s مع Velero، سكريبتات النسخ الاحتياطي التلقائي وتخطيط التعافي من الكوارث.
جدول المحتويات
النسخ الاحتياطي للحاويات: استراتيجيات حماية البيانات
يتطلب النسخ الاحتياطي لبيئات الحاويات نهجاً مختلفاً عن النسخ الاحتياطي التقليدي للخوادم. نظراً لأن الحاويات مؤقتة، فإن ما يحتاج إلى نسخ احتياطي ليس الحاوية نفسها بل البيانات الموجودة فيها. يتناول هذا الدليل استراتيجيات نسخ احتياطي شاملة لبيئات Docker و Kubernetes.
اختيار استراتيجية النسخ الاحتياطي
| الاستراتيجية | مناسبة لـ | الأداة |
|---|---|---|
| نسخ احتياطي للـ volume | قاعدة البيانات، تخزين الملفات | tar, rsync |
| نسخ احتياطي للصورة | حالة التطبيق | docker save |
| لقطة | استرداد سريع | LVM, ZFS |
| نسخ احتياطي K8s | الكلاستر بأكمله | Velero |
| نسخ احتياطي بعيد | التعافي من الكوارث | Restic, Rclone |
1. النسخ الاحتياطي لـ Docker Volume
النسخ الاحتياطي اليدوي للـ Volume
# نسخ احتياطي للـ 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
النسخ الاحتياطي مع الحاوية قيد التشغيل
# 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. سكريبت النسخ الاحتياطي التلقائي
#!/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"
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
# تثبيت 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
# تثبيت 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
النسخ الاحتياطي المجدول
# نسخ احتياطي يومي (الساعة 2 صباحاً)
velero schedule create daily-backup \
--schedule="0 2 * * *" \
--ttl 168h
# نسخ احتياطي أسبوعي كامل
velero schedule create weekly-backup \
--schedule="0 1 * * 0" \
--ttl 720h
5. سكريبت التحقق من النسخ الاحتياطية
#!/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 يمكنك الحفاظ على أمان بياناتك.
مقالات ذات صلة
تثبيت Kubernetes مع K3s: تنسيق الحاويات الخفيف
إعداد كلاستر Kubernetes أحادي ومتعدد العقد مع K3s، استخدام kubectl، إنشاء deployments وservices، إدارة التطبيقات مع Helm. دليل Kubernetes لبيئات VPS.
إدارة Docker Volume والشبكات: التخزين الدائم وتكوين الشبكة
أنواع Docker volume (named, bind mount, tmpfs)، إدارة الـ volumes، أوضاع شبكات Docker (bridge, host, overlay)، إنشاء شبكات مخصصة والتواصل بين الحاويات. دليل شامل.
تسجيل الحاويات: إدارة سجلات Docker و Kubernetes
مشغلات سجلات Docker، أمر docker logs، سجلات pods في Kubernetes، جمع السجلات المركزي (Loki, ELK Stack)، تدوير السجلات وأفضل ممارسات إدارة السجلات في بيئة الإنتاج.