1. はじめに
本記事では、Windows環境におけるDockerのボリュームバックアップ方法について解説します。
-
対象読者:
- Dockerで永続データ管理をしている方
- ボリュームのバックアップやリストア方法を知りたい方
-
ゴール:
- Dockerボリュームのバックアップ&リストアの手順を理解し、実践できるようになる
2. Dockerとは?
Dockerとは、アプリケーションとその実行環境をひとまとめにした「コンテナ」という単位で管理・実行できる、軽量な仮想化技術です。
このコンテナは、アプリが動作するのに必要なOSやライブラリ、設定などをすべてパッケージ化しており、どこでも同じ環境を再現できます。
例えば、開発者のPCで動くものが、そのまま本番環境や別のマシン上でも同じように動作するため、「環境による不具合」を大幅に減らすことができます。
Dockerの裏側では、ホストOSのカーネルを共有しながらプロセスを隔離することで、仮想マシンよりも軽量かつ高速に環境を構築できます。
補足
Dockerの基本概念やWSL上での利用方法は以下の記事を参照してください。
3. ボリュームとは?
Dockerにおけるボリューム(Volume)とは、Dockerが管理する専用の永続ストレージ領域です。
コンテナの外にデータを保存し、コンテナ削除後も保持できます。
補足
一般的なIT用語としての「ボリューム」は、HDDなどの物理的な記憶媒体(ストレージ)を論理的に区切った領域の一部、または全体を指しますが、
Dockerの文脈では「Docker専用のデータ保存領域」という意味で使われます。
ボリュームについてまとめた記事はこちら
Docker ボリュームマウント、バインドマウント、一時メモリマウント まとめ(Windows環境)
4. マウントとは?なぜ必要?
マウントとは、ホストやDockerボリュームのストレージ領域をコンテナ内のディレクトリに接続する仕組みです。
これによりコンテナから永続化されたデータにアクセスできます。
5. バックアップとリストアの仕方
補足
下記の記事で紹介しているDockerプロジェクトを例に解説します。
Docker(Docker Compose)基礎解説(WindowsのWSLを使用した環境構築編)
Docker でコンテナに外部ストレージを接続する方法は、大きく分けて 3 種類 あります。
-
ボリュームマウント(Volume Mount)
→ 今回解説する対象 - バインドマウント(Bind Mount)
→ フォルダをコピーすればOK - 一時メモリマウント(tmpfs Mount)
→ 永続化をさせないのでバックアップを取る場面は限られるはず
5-1. バックアップを取得
例:db_data ボリュームをバックアップ
# powershellで実行
docker run --rm `
-v docker-sample_db_data:/volume `
-v ${PWD}:/backup `
alpine `
tar czf /backup/db_data_backup.tar.gz -C /volume .
docker run --rm alpine
- alpine イメージ(軽量なLinux)で一時的なコンテナを起動
(他にはbusyboxも軽量なため用途に適している) -
--rmで実行後にコンテナは自動削除
-v docker-sample_db_data:/volume
- Docker Volume
db_dataをコンテナ内の/volumeにマウント
-v ${PWD}:/backup
- ホスト側の現在のディレクトリ(${PWD})を
/backupにマウント - これにより、コンテナ内で
/backupに書き込むと、ホスト側のカレントフォルダにファイルが作られる
tar czf /backup/db_data_backup.tar.gz -C /volume .
-
tarコマンドで/volumeの中身をアーカイブ-
c= 作成 (create) -
z= gzip 圧縮 -
f= ファイルに出力
-
- 出力先は
/backup/db_data_backup.tar.gz -
-C /volume .で/volumeに移動してその中身を全部まとめる
5-2. バックアップから復元
# powershellで実行
docker run --rm `
-v docker-sample_db_data:/volume `
-v ${PWD}:/backup `
alpine `
sh -c "tar xzf /backup/db_data_backup.tar.gz -C /volume"
docker run --rm alpine
- alpine イメージ(軽量なLinux)で一時的なコンテナを起動
(バックアップ同様、busybox も軽量で用途に適している) -
--rmで実行後にコンテナは自動削除
-v docker-sample_db_data:/volume
- 復元先の Docker Volume
db_dataをコンテナ内の/volumeにマウント
-v ${PWD}:/backup
- ホスト側の現在のディレクトリ(${PWD})を
/backupにマウント - これにより、コンテナ内で
/backupを参照するとホスト側のカレントフォルダにアクセスできる
sh -c "tar xzf /backup/db_data_backup.tar.gz -C /volume"
-
tarコマンドでアーカイブを展開-
x= 展開 (extract) -
z= gzip 圧縮の解凍 -
f= ファイル指定
-
-
/backup/db_data_backup.tar.gzを/volumeに展開 -
-C /volumeで/volumeに移動して中身を全て復元
補足
- バックアップ対象ボリュームを使用中のコンテナは停止推奨(データ整合性のため)
- 複数ボリュームの場合は個別に実施
- 定期的にバックアップするならスケジューラーや専用ツールを活用
6. 実際にバックアップとリストアができるか確認
6-1. Docker Composeでビルドをして volume を作成
# volumeを作成する
PS C:\Users\UserName\00.個人フォルダ\01.Git\docker-sample> docker-compose up -d --build
(省略)
[+] Running 5/5
✔ docker-sample-app Built
✔ Network docker-sample_app-network Created
✔ Volume "docker-sample_db_data" Created
✔ Container db Started
✔ Container spring-app Started
# 作成したvolumeを確認する
PS C:\Users\UserName\00.個人フォルダ\01.Git\docker-sample> docker volume ls
DRIVER VOLUME NAME
local docker-sample_db_data
6-2. DBを更新
6-3. volume のバックアップを作成
PS C:\Users\UserName\00.個人フォルダ\01.Git\docker-sample> docker run --rm `
>> -v docker-sample_db_data:/volume `
>> -v ${PWD}:/backup `
>> alpine `
>> tar czf /backup/db_data_backup.tar.gz -C /volume .
6-4. volume を削除
コンテナを停止&削除→volumeを削除→コンテナを再作成
※ボリュームは存在しないので再作成される
# コンテナを停止&削除
PS C:\Users\UserName\00.個人フォルダ\01.Git\docker-sample> docker-compose down
[+] Running 3/3
✔ Container spring-app Removed
✔ Container db Removed
✔ Network docker-sample_app-network Removed
# 初期状態のvolumeが存在することを確認
PS C:\Users\UserName\00.個人フォルダ\01.Git\docker-sample> docker volume ls
DRIVER VOLUME NAME
local docker-sample_db_data
# volumeを削除
PS C:\Users\UserName\00.個人フォルダ\01.Git\docker-sample> docker volume rm docker-sample_db_data
docker-sample_db_data
# volumeが削除されていることを確認
PS C:\Users\UserName\00.個人フォルダ\01.Git\docker-sample> docker volume ls
DRIVER VOLUME NAME
# コンテナを再作成
PS C:\Users\UserName\00.個人フォルダ\01.Git\docker-sample> docker-compose up -d
[+] Running 4/4
✔ Network docker-sample_app-network Created
✔ Volume "docker-sample_db_data" Created
✔ Container db Started
✔ Container spring-app Started
PS C:\Users\UserName\00.個人フォルダ\01.Git\docker-sample> docker volume ls
DRIVER VOLUME NAME
local docker-sample_db_data
6-5. volume をリストア
コンテナを停止&削除→volumeを削除→volumeをリストア→コンテナを再作成
※ボリュームは存在するのでそのまま利用される
# コンテナを停止&削除
PS C:\Users\UserName\00.個人フォルダ\01.Git\docker-sample> docker-compose down
[+] Running 3/3
✔ Container spring-app Removed
✔ Container db Removed
✔ Network docker-sample_app-network Removed
# 初期状態のvolumeが存在することを確認
PS C:\Users\UserName\00.個人フォルダ\01.Git\docker-sample> docker volume ls
DRIVER VOLUME NAME
local docker-sample_db_data
# 初期状態のvolumeを削除
PS C:\Users\UserName\00.個人フォルダ\01.Git\docker-sample> docker volume rm docker-sample_db_data
docker-sample_db_data
# 初期状態のvolumeが削除されていることを確認
PS C:\Users\UserName\00.個人フォルダ\01.Git\docker-sample> docker volume ls
DRIVER VOLUME NAME
# 6-3でバックアップしておいたvolumeをリストア
PS C:\Users\UserName\00.個人フォルダ\01.Git\docker-sample> docker run --rm `
>> -v docker-sample_db_data:/volume `
>> -v ${PWD}:/backup `
>> alpine `
>> sh -c "tar xzf /backup/db_data_backup.tar.gz -C /volume"
# リストアしたvolumeが存在することを確認
PS C:\Users\UserName\00.個人フォルダ\01.Git\docker-sample> docker volume ls
DRIVER VOLUME NAME
local docker-sample_db_data
# コンテナを再作成
PS C:\Users\UserName\00.個人フォルダ\01.Git\docker-sample> docker-compose up -d
[+] Running 3/3
✔ Network docker-sample_app-network Created
✔ Container db Started
✔ Container spring-app Started
7. まとめ
本記事では、Windows環境におけるDockerボリュームのバックアップとリストア方法を解説しました。
- Dockerボリュームのデータをtarアーカイブ化して安全に保存
-
docker runで一時コンテナを使い、簡単にバックアップ・復元可能



