Docker — Backup (Резервное копирование данных)
Эта страница описывает способы резервного копирования данных Docker-проектов. Здесь разобраны методы backup контейнерных данных, volumes и баз данных, а также способы восстановления данных. Материал рассчитан на начинающих и помогает понять, как защитить данные Docker-приложений от потери при сбоях, обновлениях или ошибках администрирования.
Почему резервное копирование важно
Docker-контейнеры можно легко пересоздать, но данные приложения могут быть потеряны, если они не вынесены в volumes или не сохраняются отдельно.
Резервное копирование особенно важно для:
- баз данных
- пользовательских файлов
- загрузок
- конфигураций приложения
- логов
Даже небольшая ошибка (например, удаление volume) может привести к потере данных.
Что нужно резервировать
В Docker-проектах обычно нужно делать backup:
| Тип данных | Пример |
|---|---|
| Базы данных | MySQL, PostgreSQL |
| Docker volumes | данные контейнеров |
| Файлы приложения | uploads, storage |
| Конфигурации | .env, config |
Backup базы данных из контейнера
Самый распространённый способ — использовать встроенные утилиты базы данных.
Backup MySQL
docker compose exec mysql mysqldump -u root -p database_name > backup.sql
Эта команда:
- подключается к контейнеру MySQL
- делает дамп базы
- сохраняет файл
backup.sql
Backup PostgreSQL
docker compose exec postgres pg_dump -U postgres database_name > backup.sql
Backup Docker Volume
Если данные хранятся в volume, можно сделать архив.
Создание backup volume
docker run --rm \
-v volume_name:/data \
-v $(pwd):/backup \
alpine tar czf /backup/volume_backup.tar.gz /data
Что делает команда
| Параметр | Назначение |
|---|---|
| -v volume_name:/data | подключает volume |
| -v $(pwd):/backup | папка для сохранения |
| tar czf | создаёт архив |
В результате появится файл:
volume_backup.tar.gz
Восстановление volume
Чтобы восстановить данные из backup:
docker run --rm \
-v volume_name:/data \
-v $(pwd):/backup \
alpine tar xzf /backup/volume_backup.tar.gz -C /
Данные будут восстановлены в volume.
Backup директории проекта
Иногда нужно сохранить весь Docker-проект.
Архив проекта
tar -czf project_backup_$(date +%Y%m%d).tar.gz /opt/flamy_projects/site1
Архив будет содержать:
- docker-compose.yml
- Dockerfile
- исходный код
- конфигурации
Backup пользовательских файлов
Если приложение хранит файлы в директории:
/var/www/storage
Можно сделать backup так:
tar -czf storage_backup.tar.gz storage/
Backup через rsync
rsync часто используется для копирования backup на другой сервер.
rsync -avz /opt/flamy_projects user@backup-server:/backup/docker_projects
Это позволяет хранить резервные копии на отдельном сервере.
Автоматизация backup (cron)
Backup можно запускать автоматически.
Пример cron-задачи:
crontab -e
Добавить строку:
0 3 * * * /usr/local/bin/docker_backup.sh
Это будет запускать backup каждый день в 03:00.
Пример простого backup-скрипта
#!/bin/bash
DATE=$(date +%Y%m%d)
docker compose exec mysql mysqldump -u root -psecret db > backup_$DATE.sql
tar -czf docker_backup_$DATE.tar.gz /opt/flamy_projects/site1
Скрипт делает:
- дамп базы
- архив проекта
Проверка backup
Очень важно проверять резервные копии.
Проверить архив:
tar -tzf backup.tar.gz
Проверить SQL-дамп:
head backup.sql
Типичные ошибки при backup
Backup только контейнеров
Контейнеры легко пересоздаются, поэтому важно сохранять данные, а не контейнеры.
Отсутствие автоматического backup
Ручной backup часто забывают делать.
Лучше использовать cron.
Хранение backup на том же сервере
Если сервер выйдет из строя, backup тоже может быть потерян.
Лучше хранить копии:
- на другом сервере
- в облаке
- в S3-хранилище
Рекомендуемая стратегия backup
Минимальная стратегия:
- ежедневный backup базы данных
- ежедневный backup volumes
- хранение копий минимум 7 дней
Краткая памятка
docker compose exec mysql mysqldump > backup.sql # backup MySQL
docker compose exec postgres pg_dump > backup.sql # backup PostgreSQL
docker run -v volume:/data alpine tar czf backup.tar.gz /data # backup volume
tar -czf project_backup.tar.gz project/ # архив проекта
rsync -avz project backup-server:/backup # копирование backup
No comments to display
No comments to display