はじめに
以下の記事にてDockerで利用される基盤技術を簡単に紹介しましたが
今回はコンテナ技術で採用される「overlayfs」というファイルシステムについて実際にコマンド発行しながら解説します。
Overlayfsハンズオン
以下のように二つのディレクトリを作成し
$ mkdir upper $ mkdir lower
upperディレクトリにはtest1とtest2、lowerディレクトリにはtest1とtest3を用意します
$ echo "up 1" > ./upper/test1 $ echo "up 2" > ./upper/test2 $ echo "low 1" > ./lower/test1 $ echo "low 3" > ./lower/test3
ここでのポイントはどちらもtest1は存在しますが中身は違います。
これらをmergeするためのディレクトリを用意し
$ mkdir merged
以下コマンドでoverlayfsフォーマットのファイルシステムを作成します。
$ mount -t overlay overlay -o lowerdir=lower,upperdir=upper,workdir=/tmp merged $ tree merged/ merged/ ├── test1 ├── test2 └── test3
確かにマージされています。
それぞれの中身を見てみると
$ cat merged/test1 up 1 $ cat merged/test2 up 2 $ cat merged/test3 low 3
どちらのディレクトリにもあったtest1に関してはupperdirに指定したディレクトリのファイルが配置されています。
ちなみにworkdirに指定した/tmp配下には以下のような空ディレクトリが作成されています。
ls -l /tmp d--------- 2 root root XX work
ここからはおまけですが、この状態で以下のようにそれぞれのディレクトリにファイルを追加で配置すると
$ echo "up 4" > ./upper/test4 $ echo "low 5" > ./lower/test5
mergedディレクトリには反映されています。
$ tree merged/ merged/ ├── test1 ├── test2 ├── test3 ├── test4 └── test5
改めてupperとlowerは以下
$ tree upper/ upper/ ├── test1 ├── test2 └── test4 $ tree lower/ lower/ ├── test1 ├── test3 └── test5
そして中身はtest4とtest5の中身はもちろん
$ cat merged/test4 up 4 $ cat merged/test5 low 5
この状態でupperに
$ echo "up 5" > ./upper/test5
とするとmergeはどうなるでしょうか?
値は先に登録されたものが優先されるようです。
$ cat merged/test5 low 5
ただし再度mount処理を行えば
$ mount -t overlay overlay -o lowerdir=lower,upperdir=upper,workdir=/tmp merged $ cat merged/test5 up 5
やはり置き換わります。
コンテナの世界でも使われ方
例えばイメージを作成する際にDockerfileに記載されているコマンドを一行ずつ実行していきますが、それらは一行毎にlayerが分かれており、それらを最後まで実行してoverlayした結果が最終的に見えるファイルシステムとなっています。
要は下層の土台にではなく最上位の層にのみ変化を与える形で変更が記録されるのです。
ちなみに、mergeされたものはファイルの実体をコピーしているわけではなくあくまでもリンクとしての見え方なので、容量に影響を与えない点もポイントです。
終わりに
複数ディレクトリを透過的に重ねる技術であるUnion File Systemの一つの形式であるoverlayfs(overlayfs2)ですが、Dockerだけでなくバージョン管理システムやバックアップシステムの仕組みにも採用されるものなので実機で試しながら理解を深めておくとどこかで役立つかもしれません。
以上、overlayファイルシステムの入門記事でした。