DockerでOverlayFSを使用する

今日はDockerで高速と呼ばれているOverlayFSを利用することをしたいと思います。

すでに、いろいろな報告、紹介があるので、そちらも合わせてみていただければと思います。

1.中井さんのめもめも：[Fedora22のDockerでoverlayfsドライバーを利用する手順](http://enakai00.hatenablog.com/entry/2015/06/28/204932)
2.[【RHEL7.1】Dockerでoverlayfsが便利すぎるので乗り換えるべき！](http://qiita.com/Gin/items/60f887cd5281a387cf79)
3. [第68回　Dockerストレージドライバーの性能比較 (中井悦司) ](http://www.school.ctc-g.co.jp/columns/nakai/nakai68.html)
　※Dockerコンテナを複数起動するときに、overlayFSを利用した場合は非常に速度が速いようです。ファイルシステムの仕組み上、ファイルシステムの書き込み/読み込みにおいても同様の結果が得られると思います。

※利用環境は、CentOS 7.1＋Dockerです。

# CentOSでoverlayを使用する
Dockerの設定は、3つあります。/etc/sysconfig/に保存された3つのファイルです。

```
# ls -al /etc/sysconfig/docker*
-rw-r--r--. 1 root root 1561  8月  2 01:02 /etc/sysconfig/docker
-rw-r--r--. 1 root root   56  3月 30 22:36 /etc/sysconfig/docker-network
-rw-r--r--. 1 root root  597  3月 30 22:36 /etc/sysconfig/docker-storage
```

dockerを利用する場合は、/etc/sysconfig/dockerにdockerデーモン(dockerエンジン)のパラメータを記載します。「-s overlay」を使いします。
「-s」については、[daemon](https://docs.docker.com/reference/commandline/daemon/)を見てください。「-s」は「--storage-driver="" 」の略式で、ストレージのドライバを指定することができます。通常、CentOSでは、devicemapperですが、それ以外に、aufs, btrfs, zfs, overlayを指定することができます。今回は、overlayを指定するわけです。

```
# Modify these options if you want to change the way the docker daemon runs
#OPTIONS='--selinux-enabled'
OPTIONS='--selinux-enabled -s overlay'
```

設定するとdockerの再起動が必要です。再起動後、docker infoの結果で、Storage Driver: overlayになっていれば成功です。非常に簡単です。

```
# systemctl restart docker.service   
# docker info
Containers: 1
Images: 3
Storage Driver: overlay
 Backing Filesystem: xfs
Execution Driver: native-0.2
Kernel Version: 3.10.0-229.7.2.el7.x86_64
Operating System: CentOS Linux 7 (Core)
CPUs: 2
Total Memory: 3.69 GiB
Name: localhost.localdomain
ID: 552I:6CNP:VS67:ODAE:ZRYZ:AIWK:XXKB:VKG2:P6HB:PTWU:HAJG:LWCC
```

# overlayFSにして、何がわかった?
##何が変わったのでしょうか。

devicemapper(loopbackLVM)の時にループバックデバイスとして登録されていましたが、なくなっています。

```
# losetup
# lsblk
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda               8:0    0   50G  0 disk 
├─sda1            8:1    0  500M  0 part /boot
└─sda2            8:2    0 49.5G  0 part 
  ├─centos-root 253:0    0 45.6G  0 lvm  /
  └─centos-swap 253:1    0  3.9G  0 lvm  [SWAP]
sr0              11:0    1  636M  0 rom  
[root@localhost ~]# df -h
ファイルシス            サイズ  使用  残り 使用% マウント位置
/dev/mapper/centos-root    46G  1.3G   45G    3% /
devtmpfs                  1.9G     0  1.9G    0% /dev
tmpfs                     1.9G     0  1.9G    0% /dev/shm
tmpfs                     1.9G  8.6M  1.9G    1% /run
tmpfs                     1.9G     0  1.9G    0% /sys/fs/cgroup
/dev/sda1                 497M  162M  336M   33% /boot
```

ディスクを見ると、/var/lib/docker以下に、overlay、repositories-overlayが増えています。でも、空っぽです。

```
# ls -al /var/lib/docker/
合計 20
drwx------.  9 root root 4096  8月  5 07:46 .
drwxr-xr-x. 25 root root 4096  8月  5 07:07 ..
drwx------.  2 root root    6  8月  5 07:46 containers
drwx------.  3 root root   17  8月  5 07:46 graph
drwx------.  2 root root   29  8月  2 02:12 init
-rw-r--r--.  1 root root 5120  8月  5 07:46 linkgraph.db
drwxr-xr-x.  2 root root    6  8月  5 07:46 overlay
-rw-------.  1 root root   41  8月  5 07:46 repositories-overlay
drwx------.  2 root root    6  8月  2 02:14 tmp
drwx------.  2 root root   26  8月  2 02:12 trust
drwx------.  2 root root    6  8月  2 02:12 volumes
# du -h /var/lib/docker/overlay/
0       /var/lib/docker/overlay/
```

## イメージを取得する

では、イメージを取得したらどうなるのでしょうか。/var/lib/overlay/以下にディレクトリが3つできました。

```
# docker pull centos
latest: Pulling from docker.io/centos
Digest: sha256:57554136c655abb33ecb7bb790b1db0279668d3763c3b81f31bc6c4e60e4a1f3
Status: Downloaded newer image for docker.io/centos:latest
# ls -al /var/lib/docker/overlay/
合計 8
drwxr-xr-x. 5 root root 4096  8月  5 07:51 .
drwx------. 9 root root 4096  8月  5 07:46 ..
drwx------. 3 root root   17  8月  5 07:51 7322fbe74aa5632b33a400959867c8ac4290e9c5112877a7754be70cfe5d66e9
drwx------. 3 root root   17  8月  5 07:51 c852f6d61e65cddf1e8af1f6cd7db78543bfb83cdcd36845541cf6d9dfef20a0
drwx------. 3 root root   17  8月  5 07:51 f1b10cd842498c23d206ee0cbeaa9de8d2ae09ff3c7af2723a9e337a6965d639
```

これは何でしょうか。なるほど、ダウンロードしたイメージのIDに対応したディレクトリができているのがわかります。それぞれのディレクトリの中身は、CentOS7を構成するファイルがたくさん入っているので、割愛します。

```
# docker images --tree
Warning: '--tree' is deprecated, it will be removed soon. See usage.
└─f1b10cd84249 Virtual Size: 0 B
  └─c852f6d61e65 Virtual Size: 172.2 MB
    └─7322fbe74aa5 Virtual Size: 172.2 MB Tags: docker.io/centos:latest
```

## Dockerコンテナを起動してみる

では、Dockerコンテナを起動しています。df -h を調べたところ、「/」にマウントされているディスクはホストのディスクと同じです。

```
# docker run -it --name test01 centos /bin/bash
mktemp: failed to create file via template '/tmp/.colorlsXXX': Permission denied
bash: $TMP: ambiguous redirect
[root@89803bc3844b /]#
[root@89803bc3844b /]# df -h
Filesystem               Size  Used Avail Use% Mounted on
rootfs                    46G  1.3G   45G   3% /
overlay                   46G  1.3G   45G   3% /
tmpfs                    1.9G     0  1.9G   0% /dev
shm                       64M     0   64M   0% /dev/shm
tmpfs                    1.9G     0  1.9G   0% /run/secrets
/dev/mapper/centos-root   46G  1.3G   45G   3% /etc/hosts
tmpfs                    1.9G     0  1.9G   0% /proc/kcore
tmpfs                    1.9G     0  1.9G   0% /proc/timer_stats
[root@89803bc3844b /]# ls / 
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
```

/var/lib/docker/overlay/以下のディレクトリに作成されたコンテナIDのディレクトリが追加されています。(2つ増えています)

```
# ls -al /var/lib/docker/overlay/
合計 8
drwxr-xr-x. 7 root root 4096  8月  5 07:59 .
drwx------. 9 root root 4096  8月  5 07:59 ..
drwx------. 3 root root   17  8月  5 07:51 7322fbe74aa5632b33a400959867c8ac4290e9c5112877a7754be70cfe5d66e9
drwx------. 5 root root   57  8月  5 07:59 89803bc3844b59b8a5c1c437a2e1ff90f07b35baee14aa46f328ae1441eebe71
drwx------. 5 root root   57  8月  5 07:59 89803bc3844b59b8a5c1c437a2e1ff90f07b35baee14aa46f328ae1441eebe71-init
drwx------. 3 root root   17  8月  5 07:51 c852f6d61e65cddf1e8af1f6cd7db78543bfb83cdcd36845541cf6d9dfef20a0
drwx------. 3 root root   17  8月  5 07:51 f1b10cd842498c23d206ee0cbeaa9de8d2ae09ff3c7af2723a9e337a6965d639
```

## どのようにマウントしているのでしょうか。

まずは、マウントしている情報を知りたいので、起動したDockerコンテナのプロセスIDをしらべます。12438であることがわかります。

```
# ps -ef | grep docker
root      12318      1  0 07:32 ?        00:00:14 /usr/bin/docker -d --selinux-enabled -s overlay                                              
root      12434  12263  0 07:59 pts/0    00:00:00 docker run -it --name test01 centos /bin/bash                                                
root      12525  12505  0 08:01 pts/2    00:00:00 grep --color=auto docker                                                                     
** DockerデーモンのPIDを調べて、検索します。

[root@localhost ~]# ps -ef | grep 12318
root      12318      1  0 07:32 ?        00:00:14 /usr/bin/docker -d --selinux-enabled -s overlay                                              
root      12438  12318  0 07:59 pts/1    00:00:00 /bin/bash
```

取得したプロセスIDを利用して、/proc/以下にあるマウント情報を調べます。
overlayでマウントしていることがわかります。

```
# cat /proc/12438/mountinfo  | grep overlay
109 77 0:35 / / rw,relatime - overlay overlay rw,context="system_u:object_r:svirt_sandbox_file_t:s0:c82,c958",lowerdir=/var/lib/docker/overlay/7322fbe74aa5632b33a400959867c8ac4290e9c5112877a7754be70cfe5d66e9/root,upperdir=/var/lib/docker/overlay/89803bc3844b59b8a5c1c437a2e1ff90f07b35baee14aa46f328ae1441eebe71/upper,workdir=/var/lib/docker/overlay/89803bc3844b59b8a5c1c437a2e1ff90f07b35baee14aa46f328ae1441eebe71/work 
```

上の情報から、このようにマウントされていることがわかりますね。

```
lowerdir=/var/lib/docker/overlay/7322fbe74aa5632b33a400959867c8ac4290e9c5112877a7754be70cfe5d66e9/root
upperdir=/var/lib/docker/overlay/89803bc3844b59b8a5c1c437a2e1ff90f07b35baee14aa46f328ae1441eebe71/upper
workdir=/var/lib/docker/overlay/89803bc3844b59b8a5c1c437a2e1ff90f07b35baee14aa46f328ae1441eebe71/work
```

# あれ?書き込めない。。。

起動したDockerコンテナにファイルを作成しようとすると「Permission denied」とエラーが表示されます。なぜ？

```
[root@89803bc3844b /]# touch test 
touch: cannot touch 'test': Permission denied
```

## やっぱり中井さんのページに答えがありました。

中井さんのめもめも：[Fedora22のDockerでoverlayfsドライバーを利用する手順](http://enakai00.hatenablog.com/entry/2015/06/28/204932)に書いてあります。
overlayドライバは、SELinux未対応のため、使用できないそうです。


```
# sed -i 's/SELINUX=enforcing/SELINUX=permissive/' /etc/selinux/config
# shutdown -r now
```

ファイルが作られるようになりました♪