Перейти к основному содержимому
Вернуться в категорию

Резервное копирование контейнеров: Стратегии защиты данных Docker и Kubernetes

Резервное копирование Docker volume, состояния контейнеров, persistent volumes Kubernetes, резервное копирование K8s с Velero, автоматизированные скрипты и планирование disaster recovery.

Время чтения: 16 dk Контейнеры и оркестрация
dockerkubernetesрезервное копированиеvelerovolumedisaster recoveryзащита данных

Содержание

Резервное копирование контейнеров: Стратегии защиты данных

Резервное копирование контейнерных сред требует иного подхода, чем традиционное серверное резервное копирование. Поскольку контейнеры эфемерны, резервировать нужно не сами контейнеры, а данные внутри них. В этом руководстве рассматриваются комплексные стратегии резервного копирования для Docker и Kubernetes.

Выбор стратегии резервного копирования

СтратегияПодходит дляИнструмент
Резервное копирование volumeБаза данных, файловое хранилищеtar, rsync
Резервное копирование образаСостояние приложенияdocker save
СнимокБыстрое восстановлениеLVM, ZFS
Резервное копирование K8sВесь кластерVelero
Удалённое резервное копированиеDisaster recoveryRestic, 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 может быть достаточным для небольших сред, тогда как для production-кластеров Kubernetes требуются специализированные инструменты, такие как Velero. С регулярным тестированием резервного копирования и восстановления на серверах REXE вы можете обеспечить сохранность данных.