リモート開発メインのソフトウェア開発企業のエンジニアブログです

Docker コンテナのボリュームの内容をバックアップして復元する方法

先日、使用していた Docker Desktop (macOS) が不安定になり、色々な対処を試みましたが解決せず最終的に泣く泣くアンインストール→再インストールすることにしました。この場合、既存のコンテナやイメージ、ボリュームのデータは失われてしまいますがあるプロジェクトのローカル環境で使用している DB(MySQL)と S3(実態は MinIO)のデータを保存したかったため、その方法を試してみたので共有します。

Moba Pro

構成

# compose.yaml

services:
  db:
    image: mysql:8.0
    environment:
      MYSQL_ALLOW_EMPTY_PASSWORD: yes
    volumes:
      - db_mysql_data:/var/lib/mysql

  s3:
    image: minio/minio
    command: ['server', '/data']
    environment:
      - MINIO_ROOT_USER=development
      - MINIO_ROOT_PASSWORD=development
    volumes:
      - s3_data:/data

volumes:
  db_mysql_data:
  s3_data:

db_mysql_datas3_data の内容が保存したいボリュームになります。こちらを控えておけばデータがパージされても後で復元が可能です。

やった事

ボリュームの内容を保存する

docker compose stop # コンテナが起動している場合はこれ以降の書き込みを防ぐ為に停止しておく

mkdir backup # この中に保存する

# db_mysql_data のバックアップ
docker run --rm -v myapp_db_mysql_data:/data -v "$(pwd)/backup:/backup" alpine tar -czf /backup/db_mysql_data.tar.gz -C /data .
# s3_data のバックアップ
docker run --rm -v myapp_s3_data:/data -v "$(pwd)/backup:/backup" alpine tar -czf /backup/s3_data.tar.gz -C /data .

ボリューム名ですが、compose.yaml の volumes に定義している名前がそのまま使われる訳ではなく、<プロジェクト名>_<compose.yaml記載のvolume名> となっている点に注意。docker volume ls | grep db_mysql_data とかで探してみましょう。

内容を確認します:

$ ls -lah backup

total 426848
drwxr-xr-x   4 issei  staff   128B Jan 20 11:15 .
drwxr-xr-x  45 issei  staff   1.4K Jan 20 11:14 ..
-rw-r--r--   1 issei  staff    65M Jan 20 11:15 db_mysql_data.tar.gz
-rw-r--r--   1 issei  staff   128M Jan 20 11:14 s3_data.tar.gz

問題なさそうです。

ボリュームの内容を復元する

今回は Docker Desktop をインストールし直したので先ほどのボリュームはありません。この状況は以下のコマンドで擬似的に再現できます。 (この Compose プロジェクトのイメージやボリュームが全て消えるので要注意)

docker compose down -v --remove-orphans --rmi local

以下のコマンドでボリュームを復元します。ボリューム名ですが先ほどの通り <プロジェクト名>_<compose.yaml記載のvolume名> でお願いします:

# 復元するボリュームを予め (Compose 経由せず) 作っておく
docker volume create myapp_db_mysql_data
docker volume create myapp_s3_data

# db_mysql_data の復元
docker run --rm -v myapp_db_mysql_data:/data -v "$(pwd)/backup:/backup" alpine tar -xzf /backup/db_mysql_data.tar.gz -C /data 
# s3_data の復元
docker run --rm -v myapp_s3_data:/data -v "$(pwd)/backup:/backup" alpine tar -xzf /backup/s3_data.tar.gz -C /data

特にエラーが出なければ成功です。この後は普通に Compose Up しましょう:

docker compose up 

以上になります。

← 前の投稿

Flutter の物理シミュレーションを理解する ‐ ③ SpringSimulation

次の投稿 →

Google Apps Script (GAS)でDriveのファイルの一覧を作成する

コメントを残す