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

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

  • Post Author:

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

構成

# 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 

以上になります。

we are hiring

優秀な技術者と一緒に、好きな場所で働きませんか

株式会社もばらぶでは、優秀で意欲に溢れる方を常に求めています。働く場所は自由、働く時間も柔軟に選択可能です。

現在、以下の職種を募集中です。ご興味のある方は、リンク先をご参照下さい。

コメントを残す