めもめも

このブログに記載の内容は個人の見解であり、必ずしも所属組織の立場、戦略、意見を代表するものではありません。

Fedora22のDockerでoverlayfsドライバーを利用する手順

まずは、表題の手順だけを簡潔に・・・。そのうち、内部構造も詳しく説明するかも知れません。

手順

Fedora22 Serverをインストールして、まずは最新パッケージにアップデートした上で、「石川さんごめんなさい」をします。(overlayfsドライバーがSELinux未対応のため)

# dnf -y update
# sed -i 's/SELINUX=enforcing/SELINUX=permissive/' /etc/selinux/config
# reboot

/etc/sysconfig/dockerのOPTIONSに '-s overlay' を追加します。

OPTIONS='--selinux-enabled -s overlay'

Dockerを起動します。

# systemctl enable docker.service
# systemctl start docker.service

# docker info
Containers: 0
Images: 11
Storage Driver: overlay
 Backing Filesystem: xfs
Execution Driver: native-0.2
Kernel Version: 4.0.5-300.fc22.x86_64
Operating System: Fedora 22 (Twenty Two)
CPUs: 2
Total Memory: 993.4 MiB
Name: f22
ID: E74A:KMVO:ID2P:SVNH:MUKR:ZLR6:QAUM:CDAZ:R7VH:FQUK:FPLF:TM3A

以上です。

内部構造のメモ書き

Dockerイメージを取ってくると、/var/lib/docker/overlayの下に各イメージを保存したディレクトリが用意されます。

# docker pull -a docker.io/centos

# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
docker.io/centos    centos6             a005304e4e74        9 days ago          203.1 MB
docker.io/centos    6                   a005304e4e74        9 days ago          203.1 MB
docker.io/centos    latest              7322fbe74aa5        9 days ago          172.2 MB
docker.io/centos    7                   7322fbe74aa5        9 days ago          172.2 MB
docker.io/centos    centos7             7322fbe74aa5        9 days ago          172.2 MB
docker.io/centos    centos5.11          223843a319ca        9 weeks ago         284.1 MB
docker.io/centos    5.11                223843a319ca        9 weeks ago         284.1 MB
docker.io/centos    6.6                 8b44529354f3        9 weeks ago         202.6 MB
docker.io/centos    centos6.6           8b44529354f3        9 weeks ago         202.6 MB
docker.io/centos    centos7.0.1406      feb2761601e7        9 weeks ago         210.2 MB
docker.io/centos    7.0.1406            feb2761601e7        9 weeks ago         210.2 MB
docker.io/centos    7.1.1503            f1dade627e25        9 weeks ago         212.1 MB
docker.io/centos    centos7.1.1503      f1dade627e25        9 weeks ago         212.1 MB
docker.io/centos    centos5             9069226e092e        9 weeks ago         284.1 MB
docker.io/centos    5                   9069226e092e        9 weeks ago         284.1 MB

# ls -l /var/lib/docker/overlay/
合計 0
drwx------. 3 root root 17  6月 28 17:29 223843a319cac73d666e66265569d4c3c2f416b8b1c2c0af4391d1541051be35
drwx------. 3 root root 17  6月 28 17:23 7322fbe74aa5632b33a400959867c8ac4290e9c5112877a7754be70cfe5d66e9
drwx------. 3 root root 17  6月 28 17:28 8b44529354f3ca0fbe44794e2dbd0169a8ae6e2cdfa2d6df3fcd0777892ebb85
drwx------. 3 root root 17  6月 28 17:29 9069226e092e9c8d68450ca4a416bec6acf1709584e9fd70ea5fe8040bf9859e
drwx------. 3 root root 17  6月 28 17:28 a005304e4e74c1541988d3d1abb170e338c1d45daee7151f8e82f8460634d329
drwx------. 3 root root 17  6月 28 17:28 c43c1996cf187f30bc8af15e7a3bc5aee1eba2a0995baaf3e4135a7a676d74b1
drwx------. 3 root root 17  6月 28 17:23 c852f6d61e65cddf1e8af1f6cd7db78543bfb83cdcd36845541cf6d9dfef20a0
drwx------. 3 root root 17  6月 28 17:23 f1b10cd842498c23d206ee0cbeaa9de8d2ae09ff3c7af2723a9e337a6965d639
drwx------. 3 root root 17  6月 28 17:28 f1dade627e2541880e968459c4c3861678a8b576714f0325e16a7a04c32326c6
drwx------. 3 root root 17  6月 28 17:28 fb9cc58bde0c0a8fe53e6fdd23898e45041783f2d7869d939d7364f5777fde6f
drwx------. 3 root root 17  6月 28 17:29 feb2761601e7a65e37e4b78a1bd688cb1e7a847045e2f98ac50abba081d79d31

各ディレクトリ内のrootの下にイメージのコンテンツが普通に展開されています。親イメージに含まれるファイルは、該当ファイルへのハードリンクになっています。ローカルディスクにイメージを保存する際に、overlayを使用するわけではありません。

イメージを指定してコンテナを起動すると、コンテナ用のディレクトリは、overlayで用意されます。

# docker run -itd docker.io/centos:6.6 /bin/bash
906b7f9fcb94fd3b55de8059b8ae7dc3e26778ba7e280ccf98f72294d7a7b239

# ls -l /var/lib/docker/overlay/906b7f9fcb94fd3b55de8059b8ae7dc3e26778ba7e280ccf98f72294d7a7b239
合計 4
-rw-r--r--. 1 root root 64  6月 28 20:46 lower-id
drwx------. 2 root root  6  6月 28 20:46 merged
drwxr-xr-x. 6 root root 81  6月 28 20:46 upper
drwx------. 3 root root 17  6月 28 20:46 work

lower-idは、親イメージのIDを保存したテキストファイル、upperが差分を保存するUpper Layerのディレクトリ、親イメージとupperを合成したものがmergedにoverlayマウントされて、ここがコンテナのルートファイルシステムとして割り当てられます。(mergedへのマウントは、コンテナ内部のnamespaceで行われるので、ホストからはmergedの中身は見えません。)

ソースコード的には、docker/daemon/graphdriver以下のドライバーが下記のメソッドを実装します。

・Create():親イメージを複製した新規イメージを作成
・ApplyDiff():既存イメージに差分レイヤーを上書きした新しいイメージを作成

overlayドライバーの場合は、Create()の際に上記のoverlayマウントを行います。

ApplyDiff()は、Create()で既存イメージを新規イメージとしてoverlayマウントした後、既存イメージのrootを新規イメージのrootとしてハードリンクコピーした後、差分レイヤーを上書きしてマージします。これにより、親イメージとハードリンクでファイルを共有した新規イメージが作成されます。