Docker backup — резервное копирование контейнеров и данных

Три уровня резервного копирования Docker: данные (volumes), образы (docker save), конфигурация (docker-compose.yml). Разберём каждый — от простого бэкапа volume до полного переноса сервера.

Вся рубрика Docker: уроки, команды и практические сценарии

Что нужно бэкапить

ЧтоИнструментВажность
Данные (volumes)tar + временный контейнерКритично
Образыdocker saveДля оффлайн переноса
Конфигурацияgit (docker-compose.yml)Храни в репозитории
Состояние контейнераdocker commitРедко нужно

Самое важное — данные в volumes. Образы можно пересобрать из Dockerfile. docker-compose.yml должен быть в git. А вот volume с базой данных — единственное место, где живут реальные данные пользователей.

Backup volume с данными

Нельзя просто скопировать папку volume — Docker хранит их в /var/lib/docker/volumes/ и прямой доступ может дать повреждённые данные. Правильный метод — временный контейнер, который монтирует volume и создаёт архив:

# Бэкап volume в текущую папку
docker run --rm \
  -v mydata:/data \
  -v $(pwd):/backup \
  ubuntu \
  tar czf /backup/mydata-$(date +%Y%m%d).tar.gz -C /data .

# Проверить что архив создался
ls -lh mydata-*.tar.gz
# -rw-r--r-- 1 user user 2.3M mydata-20260421.tar.gz

Как это работает: запускается контейнер ubuntu, монтируется volume mydata как /data и текущая папка как /backup, внутри выполняется tar. После завершения контейнер удаляется (--rm), архив остаётся в текущей папке.

Восстановление volume из backup

# Создать чистый volume
docker volume create mydata-restored

# Восстановить из архива
docker run --rm \
  -v mydata-restored:/data \
  -v $(pwd):/backup \
  ubuntu \
  tar xzf /backup/mydata-20260421.tar.gz -C /data

# Проверить что данные восстановились
docker run --rm -v mydata-restored:/data ubuntu ls /data

Если нужно восстановить поверх существующего volume (например, откат к предыдущей версии) — сначала очисти его: docker run --rm -v mydata:/data ubuntu rm -rf /data/*, затем восстанови из архива.

Backup базы данных PostgreSQL

Для PostgreSQL лучший инструмент — pg_dump. Он создаёт консистентный снимок базы даже при работающем приложении, в отличие от бэкапа volume на лету:

# Дамп в SQL файл
docker exec my-postgres \
  pg_dump -U myuser -d mydb \
  > backup-$(date +%Y%m%d).sql

# Сжатый формат (меньше размер, быстрее восстановление)
docker exec my-postgres \
  pg_dump -U myuser -Fc mydb \
  > backup-$(date +%Y%m%d).dump

# Восстановить из SQL
docker exec -i my-postgres \
  psql -U myuser -d mydb \
  < backup-20260421.sql

# Восстановить из сжатого формата
docker exec -i my-postgres \
  pg_restore -U myuser -d mydb \
  < backup-20260421.dump

Флаг -Fc (custom format) — рекомендуемый для pg_dump. Он позволяет параллельное восстановление и выборочное восстановление таблиц. SQL формат — удобен если нужно просмотреть или отредактировать дамп вручную.

Сохранить образ в файл (docker save)

Если образ не опубликован в Docker Hub (или реестр недоступен), его можно экспортировать в файл и перенести на другой сервер:

# Сохранить образ в файл
docker save -o myapp-backup.tar myapp:1.0

# Сжатый вариант (значительно меньше)
docker save myapp:1.0 | gzip > myapp-backup.tar.gz

# Несколько образов в один файл
docker save myapp:1.0 nginx:alpine | gzip > images.tar.gz

# Восстановить на другой машине
docker load -i myapp-backup.tar.gz

# Проверить
docker images | grep myapp

docker save сохраняет образ целиком — все слои, теги, метаданные. После docker load образ доступен как будто был скачан с Docker Hub.

Перенести Docker на другой сервер

Полная пошаговая инструкция переноса приложения с данными:

# === НА ИСХОДНОМ СЕРВЕРЕ ===

# 1. Остановить приложение (для консистентного бэкапа)
docker compose stop

# 2. Бэкап volume с данными PostgreSQL
docker run --rm \
  -v pgdata:/data \
  -v /tmp:/backup \
  ubuntu tar czf /backup/pgdata.tar.gz -C /data .

# 3. Бэкап образа приложения (если нет Docker Hub)
docker save myapp:1.0 | gzip > /tmp/myapp.tar.gz

# 4. Скопировать файлы на новый сервер
scp /tmp/pgdata.tar.gz user@newserver:/tmp/
scp /tmp/myapp.tar.gz user@newserver:/tmp/
scp docker-compose.yml user@newserver:/app/
scp .env user@newserver:/app/   # если есть

# === НА НОВОМ СЕРВЕРЕ ===

# 5. Восстановить образ
docker load -i /tmp/myapp.tar.gz

# 6. Создать volume и восстановить данные
docker volume create pgdata
docker run --rm \
  -v pgdata:/data \
  -v /tmp:/backup \
  ubuntu tar xzf /backup/pgdata.tar.gz -C /data

# 7. Запустить приложение
cd /app && docker compose up -d

# 8. Проверить
docker compose ps
docker compose logs --tail=20

Если образ опубликован в Docker Hub или приватном реестре — шаги 3 и 5 можно пропустить. Compose сам скачает нужный образ при запуске.

Автоматический backup через cron

Ручной бэкап — плохая практика. Автоматизируй через cron:

# Создать скрипт /opt/scripts/docker-backup.sh
#!/bin/bash
BACKUP_DIR=/backups
DATE=$(date +%Y%m%d)

# Бэкап PostgreSQL
docker exec postgres pg_dump -U myuser -Fc mydb \
  > "$BACKUP_DIR/postgres-$DATE.dump"

# Бэкап volume приложения
docker run --rm \
  -v appdata:/data \
  -v "$BACKUP_DIR":/backup \
  ubuntu tar czf "/backup/appdata-$DATE.tar.gz" -C /data .

# Удалить бэкапы старше 7 дней
find "$BACKUP_DIR" -name "*.dump" -mtime +7 -delete
find "$BACKUP_DIR" -name "*.tar.gz" -mtime +7 -delete

echo "Backup completed: $DATE"
# Сделать исполняемым
chmod +x /opt/scripts/docker-backup.sh

# Добавить в cron — запуск каждый день в 2:00
# crontab -e
0 2 * * * /opt/scripts/docker-backup.sh >> /var/log/docker-backup.log 2>&1

# Создать папку для бэкапов
mkdir -p /backups

Дополнительно — копируй бэкапы на внешнее хранилище (S3, Backblaze B2, другой сервер). Локальные бэкапы не защитят если сервер выйдет из строя полностью.

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

Как перенести Docker контейнер на другой сервер?

Перенос состоит из трёх частей: 1) Данные — бэкап volumes через временный контейнер с tar. 2) Образ — docker save | gzip и docker load на новом сервере (или публикация в Docker Hub). 3) Конфигурация — скопировать docker-compose.yml и .env файлы. На новом сервере: восстановить volume, загрузить образ, запустить docker compose up -d. Предварительно остановите приложение для консистентного бэкапа данных.

Как сделать автоматический backup Docker?

Создай bash-скрипт с командами pg_dump (для баз данных) и tar через временный контейнер (для volumes). Добавь скрипт в crontab: crontab -e, строка 0 2 * * * /opt/backup.sh — запуск в 2:00 каждую ночь. Добавь удаление старых бэкапов через find ... -mtime +7 -delete. Для надёжности — копируй бэкапы на внешнее хранилище (S3, rsync на другой сервер).

docker commit vs volume backup — что лучше?

docker commit сохраняет состояние файловой системы контейнера в новый образ — включая данные внутри контейнера. Но это плохая практика: образ получается большой, данные и код смешаны, нет истории изменений. Volume backup через tar — правильный подход: данные отделены от кода, архив легко перенести, размер меньше. Для баз данных — ещё лучше использовать нативные инструменты (pg_dump, mysqldump), они дают консистентный снимок даже без остановки контейнера.

Оцените статью
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x