(O+P)ut

アウトプット



(O+P)ut

エンジニアのアウトプット

【Docker入門】Overlayfsによる複数層の重ね合わせハンズオン

スポンサーリンク

はじめに

以下の記事にて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ファイルシステムの入門記事でした。