皆さんはDockerを利用する上で、イメージやコンテナのバックアップを行っていますでしょうか。
Dockerを検証環境や開発環境として利用している分には、更新データの管理は利用者側で行うという運用もありますので、バックアップは特に必要ないという意見もあるでしょう。
しかし、Dockerを使用してユーザにサービスを提供する常駐システムを作る場合は、バックアップの必要な場面が必ず出てくると思います。
例えば、フロントエンドのWebサービスなどでコンテナ内では完全に静的なコンテンツのみ扱う運用にしたとしても、ログファイルの管理は行った方がよいです。
コンパイルだけしか行わないコンテナでも、コンパイラの中間的な出力情報は保存しておきたいということがあるかもしれません。
ひとことでバックアップといいましても、Docker環境内には様々なリソースがありますので、リソース別にバックアップの考え方をまとめてみました。
Docker環境における様々な更新データ
まず以下の図を見てください。
Dockerに関わる全てのリソースにおけるデータの復元性についてまとめた構成図になります。

構成図は、「Dockerホスト」とDockerホスト内のDisk領域「/var/lib/docker」、Dockerコンテナの3つのエリアについて、各々のエリアが全損した場合にデータの復元が可能かどうかについて「×」と「△」で示しています。
「×」は復元不可能であることを、「△」は機械的な作業を行えば短時間で復元可能であること示してます。
例えばDockerイメージ構成ファイルに「×」が付いているのは、ここに含まれるDockerfileは利用者が作成するものですので、破損してしまいますとどこにも存在しなくなることを表していることになります。
×印と△印の色は、黒がDockerホスト全損時、ピンクが/var/lib/dockerパーティションの全損時、水色がコンテナの全損時を表しております。
以下は図内の各リソースの説明です。
Docker(bin,lib)
Dockerシステムのバイナリ(dockerやdockerdの実行ファイルやライブラリなど)
Docker設定ファイル
Dockerシステムの定義ファイル(systemdのオプションを指定するシステムファイルなど)
Dockerイメージ構成ファイル
自作のDockerイメージを作成するために必要なファイル(Dockerfileや定義ファイルなど)
コンテナ構成ファイル
Dockerコンテナを作成および起動するためのファイル(docker-compose.ymlやその他の定義ファイル、データファイルなど)。DockerコンテナにデータボリュームとしてマウントしたDockerホスト上のディレクトリも含む。
データボリューム
コンテナにマウントするデータボリュームの実データ
Dockerイメージ
DockerHubから入手したり、自作するなどしたDockerイメージの実データ
コンテナレイヤ―
Dockerコンテナ内の更新データ
これを踏まえた上で、各データのバックアップの考え方を解説していきます。
※/var/lib/dockerは、Dockerシステムの全データが格納されているディレクトリのデフォルトの場所です。「docker info」コマンドの「Docker Root Dir」の値で確認できます。
「コンテナ」内のリソースのバックアップ方針
前節の構成図を見ますと、「×」が3つ付いています。
構成図内の3領域のどの部分に障害が発生しても問題の発生する可能性があるでしょう。
Dockerコンテナ内のリソースは3種類に分類できます。
- ベースとなるDockerイメージ部分
- Dockerコンテナ内の更新データのレイヤ部分
- データボリューム部分
1つ目のDockerイメージ部分と3つ目のデータボリューム部分は/var/lib/docker及びDockerホストエリア内のリソースとして扱いますので、本節ではDockerコンテナ内の更新データのレイヤ部分のみを対象とします。
更新データのレイヤ部分は、Dockerコンテナ内で生成されたオリジナルデータがほとんどでして、唯一無二のデータということになります。
この部分は、Dockerコンテナの再起動を行っても消えませんが、Dockerコンテナを削除すると消えてしまいます。
ですので、DockerホストやDocker環境、Dockerコンテナに障害が発生してしまいますと、更新データのレイヤ部分は無くなってしまう可能性があり、その場合はもちろん復元不可能です。
レイヤ部分はDocker固有の仕組みによって制御されてますので、Docker以外のツールによって簡単にバックアップするということが困難です。
バックアップ方針としまして以下の2つのどちらかを検討されることをおすすめします。
- バックアップが必要なコンテナ内の更新データを洗い出して、データボリュームに出力されるようにする
- docker exportを使用して定期的にコンテナの内容をアーカイブする
2つの中では、1つ目のデータボリュームに出力する方が現実的です。
データボリュームは高価なストレージシステム上に作成することも可能です。
データベース領域をデータボリュームに配置しますと、Dockerコンテナ内のサービスを停止してしまえば、お好きな方法でバックアップすることができます。
docker exportコマンドは、Dockerコンテナ内のファイルをtarファイルにアーカイブするだけですので、対象リソースが巨大な場合は運用的に無理でしょう。
/var/lib/docker内リソースのバックアップ方針
※/var/lib/docker内にはDockerコンテナやDockerイメージの実体が格納されています。また、Docker固有のシステム情報なども存在します。しかし、本節ではDockerコンテナやDockerイメージに関するデータのみを対象としております。
バックアップ方針を検討する際に重要なのは、データボリュームになります。
格納されているファイルが静的なものであればよいのですが、データベースファイルなどは対象サービスを停止するような工夫が必要ですね。
Dockerイメージ部分に関しましては、DockerHubなどから入手したものであれば再度取得すれば良いのでバックアップの優先度は低いです。ただしベンダ作成の公式イメージは、サポート終了などのような理由で削除されてしまう可能性がありますので、古いバージョンのDockerイメージを使い続ける必要性のある場合は、docker saveコマンドでご自身の環境に保存しておきましょう。
オリジナルのDockerイメージの場合は、イメージ作成の際に使用したDockerfileや他の構成ファイルなどがありますので、再度作成すれば良いことになります。
Dockerイメージ部分の黒い「×」マークは、Dockerホスト障害時にオリジナルのDockerイメージを作成するためのファイルを消失してしまう可能性があるという意味で付けました。
Dockerホスト内リソースのバックアップ方針
Docker(bin,lib)とそれ以外に分けて解説します。
Docker(bin,lib)内リソース
Docker(bin,lib)は、Dockerシステムのファイルを指します。
DockerのバイナリファイルやDocker固有のシステムファイルなどを破損した場合は、Docker本体を再インストールすることでほとんどの場合復旧できます。
Dockerイメージなどが格納されている領域/var/lib/dockerは、Docker本体のアンインストールを行っても削除されません。
ですので、Docker本体を再インストールすることで、以前の/var/lib/dockerの内容で運用を再開することができます。
ただし、以前の状態に戻ることをDockerが保証しているわけではありませんのでご注意ください。
Docker(bin,lib)以外のリソース
Docker(bin,lib)以外のリソースであるDocker設定ファイルや各種構成ファイルの具体例を挙げておきます。
Docker設定ファイル
- systemdによるDocker起動時に指定するパラメータファイル(デフォルトでは/etc/systemd/system/docker.service.d/下のconfファイル(CentOS7の場合))
Dockerイメージ構成ファイル
- イメージを作成するためのDockerfileファイル
- Dockerfileに定義されているファイル(例えば、パッケージのインストールファイル、定義ファイルなど)
- イメージを作成するコマンドが記述されているシェルスクリプトなど
- その他Dockerイメージを作成するために必要なファイル
コンテナ構成ファイル
- Dockerコンテナを起動するコマンドが記述されているシェルスクリプトなど
- docker-composeを利用している場合は、docker-compose.ymlファイル
- Dockerコンテナ内にコピーするファイル(シェルスクリプトや定義ファイルなど)
- その他Dockerコンテナを作成するために必要なファイル
これらのオリジナルファイルは、tarなどでまとめてDockerホスト外にバックアップします。
データボリュームのバックアップ方法の一例
上の方で説明しましたとおり、Dockerコンテナにマウントされているデータボリュームは定期的にバックアップを行う必要があります。
データボリュームのバックアップを行うためには、マウントされているDockerコンテナ内になんらかのバックアップツールが必要になりますが、できることならDockerコンテナ内に余計なツールは入れたくないところです。
そんな場合には、バックアップ用のDockerコンテナを利用されると良いでしょう。
DockerHubには様々なバックアップツールがアップロードされていまして、その中から1つオススメなものをご紹介します。
「boombatower/docker-backup」というツールです。
このツールは、Dockerコンテナにマウントされているデータボリュームを自動的に見つけてアーカイブしてくれます。
リストア機能も標準装備です。
「boombatower/docker-backup」でアーカイブしたファイルを他のメディアにバックアップすれば作業は完了となります。
指定したDockerコンテナにマウントされているデータボリュームの情報を取得する処理がポイントなのですが、実はその機能はdocker runコマンドのオプション「- -volumes-from」で標準実装されています。
「boombatower/docker-backup」は、そのオプションを利用しているだけですので安心して使うことができます。
尚、このツールの件につきましては、別記事「Dockerのバックアップの考え方とその方法について」で紹介しておりますので、そちらをご参照ください。
まとめ
本ページの内容を各データ別に簡単にまとめてみます。
Docker(bin,lib)
Dockerホスト全損時に備えたDockerのインストール手順書の整備
Docker設定ファイル
Dockerホスト全損時に備えたDockerホスト外への退避
Dockerイメージ構成ファイル
Dockerホスト全損時に備えたDockerホスト外への退避
コンテナ構成ファイル
Dockerホスト全損時に備えたDockerホスト外への退避
データボリューム
データボリューム領域をアーカイブしてコンテナ外にコピーした後、そのアーカイブファイルをバックアップ
Dockerイメージ
Dockerホスト全損時に備えた「Dockerイメージ構成ファイル」のDockerホスト外への退避、及びDockerイメージ作成手順書の整備
環境によっては「docker export」でイメージをtarファイルにする方法も
コンテナレイヤ―
Dockerコンテナ自体のバックアップは不要
バックアップが必要な更新データはデータボリューム内に配置する
Dockerホスト全損時に備えた「コンテナ構成ファイル」のDockerホスト外への退避、及びコンテナ作成手順書の整備
以上です。
コンピュータシステムにとって、バックアップ及びリストアは最重要ポイントの1つです。
しっかり設計して安心できるシステムを構築するためのお役にほんの少しでも立てたらうれしいです。
最後までお読みいただきありがとうございました。
コメント