Резервная копия volume и проверка восстановления
Автор: Казачкин Даниил Михайлович · Обновлено
Том защищает данные от пересоздания контейнера, но не от удаления самого тома, ошибки приложения или потери диска. Резервная копия полезна только тогда, когда из неё можно восстановить нужное состояние. Сделаем архив неподвижных файлов и прочитаем его в отдельном томе, не перезаписывая исходник.
Сначала определить границу согласованности
У папки с готовыми изображениями и у запущенного PostgreSQL разные требования. Пока приложение меняет несколько связанных файлов, последовательное чтение tar может получить смесь состояний. Поэтому обычный файловый архив создавайте после остановки писателей либо через поддерживаемый snapshot/backup-протокол системы хранения. Read-only mount запрещает запись лишь вашему копировщику, а не другим контейнерам.
Для PostgreSQL логическую согласованную копию делают штатными pg_dump/pg_dumpall, а физическую — средствами и правилами PostgreSQL. Нельзя обещать, что tar живого /var/lib/postgresql/data станет корректной базой. Ограничения физической копии. Отдельный практикум дампа продолжает [урок PostgreSQL в Compose](/lessons/without-university/docker-containerization/docker-developer-23).
Независимый файловый пример
Следующие тома содержат только данные опыта. Создайте новую папку backups в текущем Bash-каталоге. После записи первого файла никакой процесс не должен продолжать менять исходный том.
mkdir -p backups
docker volume create yk-backup-source
docker volume create yk-backup-restored
docker run --rm --mount type=volume,src=yk-backup-source,dst=/data alpine:3.22 sh -c 'printf "photo-001\n" > /data/catalog.txt'
docker run --rm --mount type=volume,src=yk-backup-source,dst=/source,readonly --mount "type=bind,src=$(pwd)/backups,dst=/backup" alpine:3.22 tar -czf /backup/files.tgz -C /source .
docker run --rm --mount type=volume,src=yk-backup-restored,dst=/target --mount "type=bind,src=$(pwd)/backups,dst=/backup,readonly" alpine:3.22 tar -xzf /backup/files.tgz -C /target
docker run --rm --mount type=volume,src=yk-backup-restored,dst=/data,readonly alpine:3.22 cat /data/catalog.txtОжидаемый результат последней команды — photo-001. Исходный и восстановленный тома имеют разные имена: ошибку пути можно исправить без уничтожения оригинала. Посмотрите состав архива через tar -tzf backups/files.tgz, а контрольную сумму сохраните рядом командой sha256sum backups/files.tgz > backups/files.tgz.sha256.
Что именно доказал опыт
Вы проверили наличие файла и его содержимое после восстановления. Пока не проверены владельцы, ACL, расширенные атрибуты, символьные ссылки, совместимость приложения и необходимые внешние объекты. Для своего сервиса составьте проверку не только «файл существует», но и «приложение открывает данные и отвечает на контрольный запрос». Формат архива и инструмент выбирайте под метаданные, которые действительно нужны.
Файл с контрольной суммой помогает заметить случайное повреждение, но не доказывает происхождение архива. Если злоумышленник заменил архив и соседнюю сумму, сравнение пройдёт. Для важных копий нужны отдельный доверенный канал хранения метаданных, доступы и политика хранения поколений. Эти свойства проверяются отдельно от самого tar.
Как превратить опыт в регламент
Запишите владельца данных, способ остановки записи, имена томов, версию приложения и команду восстановления. Храните копию вне того же диска: каталог backups на одном сервере не спасает от его потери. В процедуре восстановления используйте новое окружение, проверьте результат и только затем переключайте потребителей. Время такого опыта даёт измерение длительности восстановления, а не обещание нулевого простоя.
Самостоятельная проверка
Добавьте второй файл, сделайте новую копию и восстановите её ещё раз в пустой том. Затем намеренно удалите один файл только в восстановленном томе и убедитесь, что проверка обнаруживает отличие. Составьте список того, что понадобится новому разработчику для повторения процедуры без доступа к вашему терминалу. После эксперимента удалите два учебных тома по точным именам, сохранив архив столько, сколько требуется для проверки.