Резервное копирование и восстановление контейнеров Docker — важный процесс, который позволяет быстро восстанавливать сервисы и их состояние при сбоях, миграции на новый сервер или необходимости переустановки окружения. В данной статье мы разберём два скрипта для резервного копирования контейнеров и восстановления из них.
backup.sh
позволяет создать резервную копию контейнера, образа и томов данных. restore.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."
Проверяем аргументы запуска.
Если не передано имя контейнера, скрипт завершает выполнение.
Создаём папку для бэкапа.
Папка с бэкапом получает уникальное имя на основе имени контейнера и текущего времени.
Создаём образ контейнера.
С помощью команды docker commit
сохраняем текущий контейнер как образ.
Сохраняем образ в файл.
Используем docker save
, чтобы экспортировать образ в файл.
Резервное копирование томов.
Скрипт находит пути к привязанным томам и архивирует их с помощью tar
.
Скрипт 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"
Загружаем образ из резервной копии.
Используем docker load
, чтобы импортировать образ контейнера.
Запускаем новый контейнер.
С помощью команды docker run
запускаем контейнер с новым именем.
Восстанавливаем данные из архива.
Если найдён архив данных, скрипт распаковывает их в путь, связанный с томами контейнера.
backup.sh
. chmod +x backup.sh
./backup.sh httpd
Это создаст резервную копию контейнера httpd
и его данных.
restore.sh
. chmod +x restore.sh
./restore.sh ./backup_httpd_20241213_103000
Утилита jq
необходима для анализа JSON данных контейнеров.
Установите с помощью менеджера пакетов:
yum install jq -y
apt install jq -y
Пользователь, запускающий скрипты, должен иметь права на выполнение команд Docker.
backup.sh
создаст резервную копию образа и томов данных контейнера. restore.sh
развернёт контейнер из резервной копии, включая данные и настройки.Теперь вы можете оперативно восстанавливать сервисы и их данные после сбоя или миграции.
Если у вас возникли вопросы по работе с Docker, резервному копированию или скриптам — не стесняйтесь задавать их! 🚀