Резервное копирование Docker Volumes: создание tar-снапшотов и восстановление
- Необходимость миграции персистентных данных Docker Volume на другой сервер.
- Риск потери файлов при случайном удалении контейнера или пересоздании стека.
- Сложность прямого доступа к директории
/var/lib/docker/volumes/из-за прав доступа и блокировок файловой системы.
1. Создание бэкапа Docker Volume в архив TAR на лету
Запуск временного контейнера, который монтирует исходный volume в режиме Read-Only и архивирует его содержимое в текущую папку хоста:
docker run --rm \
-v my_database_volume:/volume_data:ro \
-v $(pwd):/backup \
alpine:latest \
tar -czvf /backup/db_volume_backup_$(date +%F).tar.gz -C /volume_data .2. Восстановление данных из TAR-архива в новый Docker Volume
Создайте целевой том и распакуйте архив с сохранением владельцев файлов (UID/GID):
# 1. Создание нового тома
docker volume create my_restored_volume
# 2. Распаковка архива внутрь тома
docker run --rm \
-v my_restored_volume:/volume_data \
-v $(pwd):/backup \
alpine:latest \
sh -c "tar -xzvf /backup/db_volume_backup_2024-05-01.tar.gz -C /volume_data"3. Автоматизированный скрипт бэкапа всех томов с ротацией
Создайте /usr/local/bin/docker-volume-backup.sh:
#!/usr/bin/env bash
set -euo pipefail
BACKUP_DIR="/opt/docker_backups"
mkdir -p "$BACKUP_DIR"
for VOL in $(docker volume ls -q); do
echo "Backing up volume: $VOL"
docker run --rm \
-v "${VOL}":/data:ro \
-v "${BACKUP_DIR}":/backup \
alpine tar -czf "/backup/${VOL}_$(date +%Y%m%d_%H%M%S).tar.gz" -C /data .
done
# Удаление архивов старше 14 дней
find "$BACKUP_DIR" -type f -name "*.tar.gz" -mtime +14 -deletechmod +x /usr/local/bin/docker-volume-backup.sh Частые вопросы (FAQ)
Нужно ли останавливать контейнер перед созданием бэкапа тома?
Для статических файлов остановка не требуется. Для транзакционных систем (PostgreSQL, Redis, MySQL) контейнер необходимо временно остановить (docker stop) либо использовать нативные утилиты создания дампов (pg_dump, mysqldump).
Почему монтирование тома в бэкап-контейнер делается с ключом :ro?
Флаг :ro (Read-Only) гарантирует, что процесс резервного копирования случайно не модифицирует и не повредит исходные рабочие файлы приложения.