Как создать и восстановить резервные копии контейнеров Docker: Подробная инструкция

Резервное копирование и восстановление контейнеров Docker — важный процесс, который позволяет быстро восстанавливать сервисы и их состояние при сбоях, миграции на новый сервер или необходимости переустановки окружения. В данной статье мы разберём два скрипта для резервного копирования контейнеров и восстановления из них.


📜 Задача

  1. Создание резервной копии контейнера и его томов.
    Скрипт backup.sh позволяет создать резервную копию контейнера, образа и томов данных.
  2. Восстановление контейнера из резервной копии.
    Скрипт restore.sh позволяет развернуть ранее сохранённый контейнер и восстановить данные из бэкапа.

🛠️ Скрипт 1: backup.sh

Скрипт backup.sh создаёт резервную копию указанного контейнера, включая его образ и привязанные тома.


🔧 Код скрипта

#!/bin/bash

# Проверка наличия аргумента
if [ -z "$1" ]; then
  echo "Использование: $0 <имя_контейнера>"
  exit 1
fi

CONTAINER_NAME=$1
BACKUP_DIR="./backup_${CONTAINER_NAME}_$(date +%Y%m%d_%H%M%S)"
IMAGE_NAME="${CONTAINER_NAME}_backup_image"
IMAGE_FILE="${BACKUP_DIR}/${CONTAINER_NAME}_image.tar"
DATA_ARCHIVE="${BACKUP_DIR}/${CONTAINER_NAME}_data.tar.gz"

# Создание папки для бэкапа
mkdir -p "$BACKUP_DIR"

echo "🔄 Создание образа контейнера $CONTAINER_NAME..."
docker commit "$CONTAINER_NAME" "$IMAGE_NAME"

echo "💾 Сохранение образа контейнера в $IMAGE_FILE..."
docker save "$IMAGE_NAME" > "$IMAGE_FILE"

echo "📂 Резервное копирование томов..."
# Находим точки монтирования томов
VOLUMES=$(docker inspect "$CONTAINER_NAME" | jq -r '.[0].Mounts[].Source')
if [ -n "$VOLUMES" ]; then
  tar -czvf "$DATA_ARCHIVE" $VOLUMES
  echo "✅ Том(ы) сохранены в $DATA_ARCHIVE"
else
  echo "⚠️ Томов не найдено. Пропуск."
fi

echo "✅ Бэкап контейнера $CONTAINER_NAME завершён. Резервные копии находятся в $BACKUP_DIR."

📌 Как работает скрипт?

  1. Проверяем аргументы запуска.
    Если не передано имя контейнера, скрипт завершает выполнение.

  2. Создаём папку для бэкапа.
    Папка с бэкапом получает уникальное имя на основе имени контейнера и текущего времени.

  3. Создаём образ контейнера.
    С помощью команды docker commit сохраняем текущий контейнер как образ.

  4. Сохраняем образ в файл.
    Используем docker save, чтобы экспортировать образ в файл.

  5. Резервное копирование томов.
    Скрипт находит пути к привязанным томам и архивирует их с помощью tar.


🚀 Скрипт 2: restore.sh

Скрипт restore.sh позволяет восстановить контейнер и его данные из ранее сохраненного бэкапа.


🔧 Код скрипта

#!/bin/bash

# Проверка наличия аргумента
if [ -z "$1" ]; then
  echo "Использование: $0 <путь_к_папке_бэкапа>"
  exit 1
fi

BACKUP_DIR=$1
IMAGE_FILE="${BACKUP_DIR}/*_image.tar"
DATA_ARCHIVE="${BACKUP_DIR}/*_data.tar.gz"

echo "💾 Загрузка образа контейнера из $IMAGE_FILE..."
docker load < $(ls $IMAGE_FILE)

IMAGE_NAME=$(docker images | grep '_backup_image' | awk '{print $1}')
NEW_CONTAINER_NAME="${IMAGE_NAME}_restored"

echo "🚀 Запуск контейнера $NEW_CONTAINER_NAME..."
docker run -d --name "$NEW_CONTAINER_NAME" "$IMAGE_NAME"

if [ -f "$DATA_ARCHIVE" ]; then
  echo "📂 Восстановление данных из $DATA_ARCHIVE..."
  VOLUME_PATH=$(docker inspect "$NEW_CONTAINER_NAME" | jq -r '.[0].Mounts[0].Source')
  tar -xzvf "$DATA_ARCHIVE" -C "$VOLUME_PATH"
  echo "✅ Данные успешно восстановлены."
else
  echo "⚠️ Файл данных не найден. Пропуск восстановления томов."
fi

echo "✅ Восстановление контейнера завершено. Новый контейнер: $NEW_CONTAINER_NAME"

📌 Как работает скрипт?

  1. Загружаем образ из резервной копии.
    Используем docker load, чтобы импортировать образ контейнера.

  2. Запускаем новый контейнер.
    С помощью команды docker run запускаем контейнер с новым именем.

  3. Восстанавливаем данные из архива.
    Если найдён архив данных, скрипт распаковывает их в путь, связанный с томами контейнера.


🛠️ Как использовать?


🔹 Шаг 1: Создаём бэкап контейнера

  1. Сохраните скрипт backup.sh.
  2. Сделайте его исполняемым:
    chmod +x backup.sh
  3. Запустите:
    ./backup.sh httpd

    Это создаст резервную копию контейнера httpd и его данных.


🔹 Шаг 2: Восстановите контейнер

  1. Сохраните скрипт restore.sh.
  2. Сделайте его исполняемым:
    chmod +x restore.sh
  3. Запустите с указанием пути к бэкапу:
    ./restore.sh ./backup_httpd_20241213_103000

🗂️ Требования

🔹 jq

Утилита jq необходима для анализа JSON данных контейнеров. Установите с помощью менеджера пакетов:

Для CentOS/RHEL:

yum install jq -y

Для Debian/Ubuntu:

apt install jq -y

🔹 Права доступа

Пользователь, запускающий скрипты, должен иметь права на выполнение команд Docker.


Результат

  1. Скрипт backup.sh создаст резервную копию образа и томов данных контейнера.
  2. Скрипт restore.sh развернёт контейнер из резервной копии, включая данные и настройки.

Теперь вы можете оперативно восстанавливать сервисы и их данные после сбоя или миграции.


Если у вас возникли вопросы по работе с Docker, резервному копированию или скриптам — не стесняйтесь задавать их! 🚀