【ツール活用|実務向け】Docker Volumeを安全にバックアップ・リストアする「tar連携」の実践テクニック

1. 導入

Dockerで永続化しているボリューム(Volume)の中身をバックアップしたい場面は、DBのマイグレーションや環境移行時に必ず発生します。しかし、ボリューム内のファイルを直接ホストOSから操作するのは、パーミッションの問題やファイルロックのリスクがあり推奨されません。本記事では、一時的なコンテナを介してボリュームを `tar` アーカイブ化する、現場で最も標準的な「ポータブルなバックアップ手法」を解説します。

2. 基礎知識

Docker Volumeは、コンテナのライフサイクルから独立してデータを保持するための仕組みです。これらは通常ホストOS上の特定のディレクトリに配置されますが、Docker Engineによって管理されているため、直接ファイルをコピーするのではなく、Dockerの機能を使ってデータの「スナップショット」を抽出するのが鉄則です。今回使用する `tar` コマンドは、複数のファイルを一つのアーカイブにまとめるLinuxの標準ユーティリティであり、これを利用することでディレクトリ構造やファイル属性(権限など)を維持したままバックアップを作成できます。

3. 実装/解決策

バックアップの基本戦略は、対象のボリュームをマウントした「補助コンテナ」を起動し、そのコンテナ内で `tar` コマンドを実行してアーカイブをホスト側のディレクトリに書き出すというものです。この際、`–rm` オプションを付けて実行することで、処理終了後に補助コンテナを自動的に削除し、環境をクリーンに保つことができます。

4. サンプルプログラム

以下のコマンドは、`my_app_data` というボリュームをバックアップし、現在のディレクトリに `backup.tar` を生成する実例です。

バックアップ実行コマンド
-v my_app_data:/source:ro : ボリュームを読み取り専用でマウント
-v $(pwd):/backup : カレントディレクトリをバックアップ用ディレクトリとしてマウント
alpine : 軽量なAlpine Linuxコンテナを使用
tar cvf : 圧縮ファイルを作成(c:作成, v:詳細表示, f:ファイル指定)

docker run –rm \
-v my_app_data:/source:ro \
-v $(pwd):/backup \
alpine \
tar cvf /backup/backup.tar -C /source .

リストア実行コマンド(backup.tarをボリュームに展開)
-C /target で展開先を指定
docker run –rm \
-v my_app_data:/target \
-v $(pwd):/backup \
alpine \
tar xvf /backup/backup.tar -C /target

5. 応用・注意点

現場で活用する際の重要な注意点を3つ挙げます。

・DB稼働中の整合性
データベースのボリュームをバックアップする場合、コンテナが稼働したままだとファイルに不整合が生じる可能性があります。可能であれば `docker stop` でコンテナを停止してからバックアップを取得してください。

・パーミッションの扱い
`tar` で展開した際、ファイルの所有者がrootに書き換わることがあります。運用環境に合わせて、展開後に `chown` などで権限を調整する必要がないか確認してください。

・容量の大きいボリューム
巨大なデータを扱う場合、`tar` コマンドに `z` オプション(gzip圧縮)を付与して容量を削減することも検討してください。ただし、CPU負荷が高まるため、本番環境で行う際はリソース状況を考慮してください。

コメント

タイトルとURLをコピーしました