2017-04-11 9 views
1

Docker's Unionファイルシステムを考えると、現在の画像(最前面のレイヤー)上で実際に変更が行われ、前のレイヤーでは変更されません。問題は、これらのレイヤーがDockerによって破壊されず、隠されている理由です。何か特別な理由はありますか?Dockerが隠れたレイヤーを破壊しないのはなぜですか?

+0

「隠れたレイヤー」の意味を明確にすることはできますか? – Matt

+0

Dockerのボリュームが何であるかを理解するためには、最初にDockerでファイルシステムが正常に動作するかどうかを明確にする必要があります。ドッカー画像は、一連の読み取り専用レイヤとして保存されます。コンテナを起動すると、Dockerは読み取り専用イメージを取得し、上部に読み書きレイヤーを追加します。実行中のコンテナが既存のファイルを変更した場合、そのファイルは基礎となる読み取り専用レイヤーから、変更が適用される最上位の読み取り/書き込みレイヤーにコピーされます。読み取りと書き込みのレイヤー内のバージョンは、元のファイルを隠しますが、元のレイヤーにはまだ存在します。 – Vennesa

+0

from:http://container-solutions.com/understanding-volumes-docker/ – Vennesa

答えて

2

キャッシング

個別に各レイヤを保存することにより、ドッキングウィンドウは、結果をキャッシュすることができますし、それが以前の変更によって無効化されていない場合は、後でそれを再利用します。複数の画像を有する場合

過すべてのファイルシステムの使用をより速くビルドになり、より小さな

+0

ありがとう、ちょうどそれらを再使用することに関する質問。前のレイヤーは読み取り専用にならないのですか? 3層のDockerfileを編集することはできますか?バージョンコントロールシステムのようなものを考えて... – Vennesa

+1

@Vennesa、3層のDockerfileを編集した場合、それ以降はすべて新しいハッシュ、つまり新しいアイデンティティが得られるでしょう - これが強制されなければ既存のアイデンティティに関連する価値を変更した場合、子供の状態にはほとんど予測できない副作用があり、アイデンティティを単一の具体的なものにする能力を失うことになります。 gitのツリーにすべての親コミットのハッシュがどのように含まれているかに精通している場合、これは非常に同じ概念です。 –

+1

また、安全に再利用できるものと、この戦略では不可能なものを "無料で"見つけることができます:親とそのDockerfileのハッシュを格納した状態がある場合、その値がそれらの入力に対応することがわかります。 –

1

ドッカーは、ユニオンファイルシステムであるAUFS上に構築されたのと同じ基本イメージから構築。

画像がAUFSを経由して互いの上に変化を積層して作成されている(他の方法は、それ以来追加されている)

典型的なビルドしますRUNいくつかのデータを作成し、それが層に保存何か。

RUN touch a -- L1  a 
RUN touch b -- L2   b 
RUN touch c -- L3   c 

各レイヤーには、それ自身の変更セットのみが格納されます。

これらのAUFSレイヤーの合計は、コンテナの基礎となる仮想ファイルシステムになるように1つずつマウントされます。 「画像」は、下にあるレイヤー内のデータのビューです。

イメージ自体にはデータは保存されません。データを格納するレイヤーのみを参照します。

*image view    a b c 
L3       c 
L2      b 
L1      a 

コンテナの変更は、このすべての上にレイヤーで行われます。適切なレイヤーから既存のデータをコピーして、変更する必要がある場合は新しいデータをレイヤーに追加するか、下位レイヤーの実際のデータではなくデータへの参照を削除するデータを「削除」します。

私は層は次のようになり

echo test >> a 
touch d 
rm c 

、ファイルを変更したファイルを作成し、ファイルを削除した場合:あなたは下位層の1を破壊した場合

Lcontainer    a * d 
L3       c 
L2      b 
L1      a 

コンテナに表示されるビューにはそのデータが存在しません。 Derick Bailey mentionsとして

*image view    a c 
L3       c 
L1      a 

これは全く同じ層を再び使用する場合、層が画像間で共有することを可能にするいくつかの巧妙な画像の構築時間キャッシングを可能にします。これは通常、既存の画像FROMをビルドするときです。

decivemapperzfsのような新しいストレージドライバは、同じ戦略を実装しますが、各層のファイルシステムスナップショットまたはクローンを使用してブロックレベルで実行します。下位レイヤ/スナップショットから変更されていないディスクブロックは、元のレイヤ/スナップショットから読み込まれます。コンテナレイヤー/スナップショットは、変更または削除されるまで元のデータに戻ってポインタを保持します。

+0

クールな例。ありがとう – Vennesa

関連する問題