2016-10-12 9 views
3

大きなファイル(データベース)を持つdockerを使用しており、これらのファイルを画像の一部として保存したいと考えています。 問題は、ファイルが変更され、イメージに変更をコミットする場合です。通常、ファイルの一部のみが変更され、差異だけを保存することをドッカーに願っています。大きなファイルのDocker copy on write

私たちが変更をコミットしない限り、コピーライトはブロックレベルで動作するようです。 docker commitを実行すると、コミットのサイズは変更されるファイルのサイズの合計になります。

我々が使用している:

ストレージドライバを:devicemapper

プール名:ドッキングウィンドウ-thinpool

ライブラリのバージョン:1.02.107-RHEL7(2016年6月9日)

ブロックレベルで変更を保存(ドッカーコミット)できるストレージドライバはありますかつまり、小さな部分だけが変更された場合、ファイル全体を保存しませんか?

+0

ようこそ!多くの場合、コードサンプルを提供することで、より迅速かつ正確に質問に答えることができます。これはあなたの質問にも当てはまるかもしれません。もし、そうであれば、これをお読みください:[最小、完全、および検証可能な例の作成方法](http://stackoverflow.com/help/mcve) –

答えて

0

Rawデータベースファイルは実際にCOWレイヤー上にあるべきではなく、イメージにコミットされるべきでもありません。

この種のデータは、ボリュームシステムが実際に設計されたものです。通常のデータベースプロセスを使用して、データを入力し、バックアップを取得します。イメージにはデータベースソフトウェアが含まれていて、ボリュームには状態が含まれている必要があります。

+0

まあ...データ量はコンテナごとに分かりますか? 私は100GBの大きなデータベースを持っていて、10台の同じ実行データベースを作成したい場合は、どれだけのスペースが必要ですか? イメージにデータを保存すると、約120GBしか必要ありません。 10個のデータベースすべてに共通の初期データ用に100 GB、実行中のインスタンスごとに約2 GB。 データボリュームを使用する場合、どれくらいのスペースが必要ですか?私が正しく10×100 GBを理解していれば。 私が言及するのを忘れた場合、コンテナが終了した後もデータを永続化する必要はありません。 しかし、私は(時々)データの状態を保存する必要があります。 – mihab

0

device mapperストレージドライバは、ブロックレベルで動作し、あなたが望むものを正確に行う必要があります。

更新既存のデータは、コピーオンライト操作を使用しています。 Device Mapperはブロックベースのテクノロジなので、これらの操作はブロックレベルで行われます。たとえば、コンテナ内の大きなファイルを少し変更すると、devicemapperストレージドライバはファイル全体をコピーしません。変更するブロックのみをコピーします。各ブロックは64KBです。

あなたが商業的にサポートされているドッカーエンジンを使用している場合は、devicemappercompatibility matrixでRHELやCentOSのためのサポートドライバーですが、バックエンドはメインラインカーネルであるので、それは他のディストリビューション上で実行する必要があります。

関連する問題