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

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

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

Время чтения: 16 dk Контейнеры и оркестрация
dockerkubernetesрезервное копированиеvelerovolumedisaster recoveryзащита данных
Автор
REXE Teknoloji Network & Security Team
Редактор
REXE Teknoloji Technical Editorial
Первая публикация
Последнее обновление

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

Резервное копирование контейнерных сред требует иного подхода, чем традиционное серверное резервное копирование. Поскольку контейнеры эфемерны, резервировать нужно не сами контейнеры, а данные внутри них. В этом руководстве рассматриваются комплексные стратегии резервного копирования для 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 вы можете обеспечить сохранность данных.

Часто задаваемые вопросы

Как часто нужно делать резервные копии Docker volumes?

Частота резервного копирования определяется целевым показателем RPO (Recovery Point Objective). Ежечасное или более частое резервное копирование для критических баз данных, ежедневное для данных приложений, еженедельное для статического контента. Увеличение частоты резервного копирования увеличивает использование диска и нагрузку I/O — учитывайте этот баланс.

Нужно ли останавливать контейнер при резервном копировании?

Для баз данных рекомендуется резервное копирование без остановки: mysqldump --single-transaction для MySQL, pg_dump для PostgreSQL. Для резервного копирования файловой системы может потребоваться кратковременная остановка для обеспечения согласованности. Для критических систем делайте резервные копии с read-реплики.

Как проверить резервную копию Kubernetes с Velero?

Проверьте статус резервной копии командой velero backup describe BACKUP_NAME. Регулярно тестируйте восстановление в тестовой среде с velero restore create --from-backup BACKUP_NAME. Velero также автоматически проверяет целостность резервных копий.

Где хранить резервные копии?

Применяйте правило 3-2-1: 3 копии, 2 разных носителя, 1 удалённое местоположение. Рекомендуется комбинация локального диска + удалённого S3-совместимого хранилища (MinIO, AWS S3, Backblaze B2). Шифруйте резервные копии (Restic шифрует по умолчанию). Избегайте хранения резервных копий на том же сервере.

Как сделать резервную копию Docker Compose стека?

Нужно сохранить две вещи: 1) файлы docker-compose.yml и .env (должны храниться в Git), 2) данные volumes (резервное копирование с tar). Для резервного копирования всего стека сохраняйте каждый volume отдельно. Для восстановления сначала запустите стек с docker-compose up, затем восстановите данные volumes.

Связанные статьи

Сетевой трафикВходящий GbpsИсходящий Gbps