Docker コンテナのボリュームの内容をバックアップして復元する方法
先日、使用していた 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_data
, s3_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
以上になります。
コメントを残す