0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

お題は不問!Qiita Engineer Festa 2024で記事投稿!
Qiita Engineer Festa20242024年7月17日まで開催中!

Docker 仮想容量を減らす時のBackup・Restoreスクリプト

Last updated at Posted at 2024-07-10

tl:dr

Docker Desktopで仮想ディスク容量を減らすときに、一度全てデータが削除されてしまうので、ImageとVolumeを引き継ぐために用意したスクリプト

環境

Mac
Docker Desktop v4.31.1

実行方法

1.スクリプトを作成
2.スクリプトファイルに実行権限を付与

chmod +x backup.sh restore.sh

3.backup.shを実行

./backup.sh

4.Docker Desktopの仮想ディスク容量を小さくする
5.restore.shを実行

./restore.sh

backup.sh

#!/bin/bash

# バックアップディレクトリの作成
BACKUP_DIR="./docker_backup"
VOLUME_BACKUP_DIR="$BACKUP_DIR/volumes"
IMAGE_BACKUP_DIR="$BACKUP_DIR/images"
mkdir -p $VOLUME_BACKUP_DIR
mkdir -p $IMAGE_BACKUP_DIR

# コンテナの停止
docker stop $(docker ps -q)

# ボリュームのバックアップ
echo "バックアップ中のボリューム..."
docker volume ls -q | while read volume; do
  echo "ボリューム $volume をバックアップ中..."
  docker run --rm -v $volume:/volume -v $VOLUME_BACKUP_DIR:/backup busybox tar cf /backup/$volume.tar -C /volume ./
done

# イメージのバックアップ
echo "バックアップ中のイメージ..."
docker images --format "{{.Repository}}_{{.Tag}} {{.ID}}" | while read image; do
  image_name=$(echo $image | awk '{print $1}')
  image_id=$(echo $image | awk '{print $2}')
  echo "イメージ $image_name ($image_id) をバックアップ中..."
  docker save -o $IMAGE_BACKUP_DIR/${image_name}.tar $image_id
done

echo "バックアップが完了しました。"

restore.sh

#!/bin/bash

# バックアップディレクトリの指定
BACKUP_DIR="./docker_backup"
VOLUME_BACKUP_DIR="$BACKUP_DIR/volumes"
IMAGE_BACKUP_DIR="$BACKUP_DIR/images"

# ボリュームのリストア
echo "リストア中のボリューム..."
ls $VOLUME_BACKUP_DIR/*.tar | while read backup; do
  volume=$(basename $backup .tar)
  echo "ボリューム $volume をリストア中..."
  docker volume create $volume
  docker run --rm -v $volume:/volume -v $VOLUME_BACKUP_DIR:/backup busybox tar xf /backup/$(basename $backup) -C /volume
done

# イメージのリストア
echo "リストア中のイメージ..."
ls $IMAGE_BACKUP_DIR/*.tar | while read backup; do
  image_file=$(basename $backup .tar)
  image_name=$(echo $image_file | awk -F '_' '{print $1}')
  image_tag=$(echo $image_file | awk -F '_' '{print $2}')
  echo "イメージ $image_name:$image_tag をリストア中..."
  docker load -i $IMAGE_BACKUP_DIR/$image_file.tar
  image_id=$(docker images -q | head -n 1)  # リストア直後の最新のイメージIDを取得
  docker tag $image_id $image_name:$image_tag
done

echo "リストアが完了しました。"

あとがき

適当なところも多いので、スクリプトは好きなようにアレンジしてください!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?