Skip to main content

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

Эта команда:

  1. подключается к контейнеру MySQL
  2. делает дамп базы
  3. сохраняет файл 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