Dockerを支える技術②「Union File System」
Union File Systemは、複数のレイヤーのファイルシステムをあたかも1つのファイルシステムかのように扱う技術です。親となるファイルシステムに編集可能なレイヤーを重ね、レイヤーを通して透過的に見せる仕組みになっています。また、Linuxディストリビューションによって、異なるファイルシステムの仕組みが利用されています。
Dockerで使われているUnion File Systemは次の3つです。
- AUFS
- Devicemapper
- VFS
AUFSの仕組み
その中でも代表的な一つのUnion File Systemの実装であるAUFS(Another Union File System)について説明していきます。次の図をご覧ください。
AUFSでは、このようにファイルシステムが多層に重なっています。最下層はベースとなる元のイメージです。真ん中の層は一度編集された後、保存された差分を保持しています。これら2つの層は、読み取りのみ可能のファイルシステムで、その上に編集可能な層が重なっています。
上図において、a~dはAUFS上のファイルを表しています。
- 「a」は新規に追加されたファイルです。これは編集可能な層に追加されます。
- 「b」はこれまで一度も編集されていないファイルです。これを参照するときには、最下層上の「b」ファイルを参照します。
- 「c」は前回編集したファイルで、その際に最下層からコピーされ、差分として真ん中の層に保存されています。したがって、閲覧時は真ん中の層を参照します。
- 「d」は、今回編集しようとしているファイルです。そのため、編集可能なファイルとして、最下層から最上層にコピーされています。
このように、a~dのファイルは異なる層に位置していますが、あたかも1つのファイルシステム化のように見せています。それがAUFSの仕組みです。
DockerにおけるAUFS
DockerではAUFSの仕組みを使って、起動の速さを向上させています。次の図はDockerが起動した状態です。ベースとなるイメージをマウントし、その上に編集可能なファイルシステムの層を重ねています。
Dockerのコンテナ上で、ファイルシステムに変更を加えると、最上層の編集可能なファイルシステムに差分が加わります。Dockerにはcommitというコマンドがあり、このコマンドを発行することによって、コンテナに加えられた差分より新しいイメージを作成することができます。次回にコンテナを立ち上げる際には、前回発行したcommitコマンドによって保存されたイメージが、読み取りのみ可能のファイルシステムとなってマウントされる仕組みとなっています。
保存された読み取りのみ可能なイメージはコンテナ間で共有することができるため、各環境およびプロセスごとに巨大なディスクイメージファイルを持つ必要がありません。したがって、使用するストレージやメモリを節約でき、結果として、起動の速さにも、貢献しています。
