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