【RHEL7.1】Dockerでoverlayfsが便利すぎるので乗り換えるべき！

#Dockerでoverlayfsを使ってみた

overlayfsはRHEL7.1には正式に導入されているUnionFilesystemで、Docker1.6.2では対応しています。

RHEL7.1のデフォルト構成は、DeviceMapper＋thin-volumeとなっており、各コンテナの最大サイズは10Gと制限されています。
※ちなみに[こちら](http://qiita.com/dempasong/items/fafa4b1fe1fc8d9f452d)にて制限を拡張する方法がありました

overlayfsはこちらを参照

* [Dockerのoverlayfsドライバーによる性能向上](http://www.school.ctc-g.co.jp/columns/nakai/nakai69.html)

##とりあえず設定してみる

事前準備として`/var/lib/docker`配下を全て削除しておきましょう。

設定はこちら。`/etc/sysconfig/docker`内の`OPTION`に`-s overlay`といれるだけです。

```vi:/etc/sysconfig/docker

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

```

その後`systemctl start docker`とコマンドを発行すると`overlay`で起動しています。

```

[root ~]# docker info
Containers: 3
Images: 41
Storage Driver: overlay
 Backing Filesystem: xfs
Execution Driver: native-0.2
Kernel Version: 3.10.0-229.7.2.el7.x86_64
Operating System: Red Hat Enterprise Linux
CPUs: 8
Total Memory: 19.45 GiB
Name: test
ID: 43IZ:AW2E:LBT5:O52P:JTKE:S54D:L7HI:NDGB:V2QS:R7XS:SUDQ:NMRE

```


##比較してみる

DeviceMapperを使用したディスクの確保はこちらでまとめました。

* [dockerはOS上のディスク領域をどう使っているのかまとめた](http://qiita.com/Gin/items/60db45d0e83a6420c86c)


まあ、こんなかんじになっています。

```
[root@master mnt]# lsblk
NAME                                 MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
fd0                                    2:0    1     4K  0 disk
sda                                    8:0    0   200G  0 disk
sda1                                   8:1    0   500M  0 part /boot
sda2                                   8:2    0 199.5G  0 part
  centos-swap                        253:0    0  10.8G  0 lvm  [SWAP]
  centos-root                        253:1    0    50G  0 lvm  /
  centos-home                        253:2    0 138.8G  0 lvm  /home
sr0                                   11:0    1  1024M  0 rom
loop0                                  7:0    0   100G  0 loop
docker-253:1-6851-pool               253:3    0   100G  0 dm
  docker-253:1-6851-22f3507a1...     253:4    0    10G  0 dm
  docker-253:1-6851-2cf034932...     253:5    0    10G  0 dm
loop1                                  7:1    0     2G  0 loop
docker-253:1-6851-pool               253:3    0   100G  0 dm
  docker-253:1-6851-22f3507a1...     253:4    0    10G  0 dm
  docker-253:1-6851-2cf034932...     253:5    0    10G  0 dm
```


しかし、`overlayfs`ではこんな感じ。

```
[root ~]# lsblk
NAME          MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda             8:0    0   300G  0 disk
sda1          8:1    0   500M  0 part /boot
sda2          8:2    0 299.5G  0 part
  rhel-swap 253:0    0   9.8G  0 lvm  [SWAP]
  rhel-root 253:1    0    50G  0 lvm  /
  rhel-home 253:2    0 239.6G  0 lvm  /home
sdb             8:16   0   100G  0 disk
sr0            11:0    1  1024M  0 rom
```

Dockerが確保している領域がないぞ！！！

どういうことだ…ということで、コンテナ上で`df -h`をしてみます。

```
[root@0f3e378b0c35 /]# df -h
Filesystem             Size  Used Avail Use% Mounted on
rootfs                  50G   32G   19G  64% /
overlay                 50G   32G   19G  64% /
tmpfs                  9.8G     0  9.8G   0% /dev
shm                     64M     0   64M   0% /dev/shm
tmpfs                  9.8G   92K  9.8G   1% /run/secrets
/dev/mapper/rhel-root   50G   32G   19G  64% /etc/hosts
tmpfs                  9.8G     0  9.8G   0% /proc/kcore
tmpfs                  9.8G     0  9.8G   0% /proc/timer_stats
```

50Gも見える…（前回はlimitの10Gでした）


##わかりやすくしてみる

LVMで100Gほどディスクを作り、`/var/lib/docker`に100Gほどマウントしました

```
[root lib]# df -h
ファイルシス             サイズ  使用  残り 使用% マウント位置
/dev/mapper/rhel-root       50G   29G   22G   58% /
devtmpfs                   9.8G     0  9.8G    0% /dev
tmpfs                      9.8G     0  9.8G    0% /dev/shm
tmpfs                      9.8G  8.9M  9.8G    1% /run
tmpfs                      9.8G     0  9.8G    0% /sys/fs/cgroup
/dev/mapper/rhel-home      240G   91M  240G    1% /home
/dev/sda1                  497M  168M  330M   34% /boot
/dev/mapper/docker-lvol0   100G   41M  100G    1% /var/lib/docker
```

この状態で適当なコンテナを起動し`df -h`を実行します。
するとこんな感じに**100G**と見えています。

```
[root@89cd550ba075 /]# df -h
Filesystem                Size  Used Avail Use% Mounted on
rootfs                    100G  394M  100G   1% /
overlay                   100G  394M  100G   1% /
tmpfs                     9.8G     0  9.8G   0% /dev
shm                        64M     0   64M   0% /dev/shm
tmpfs                     9.8G   92K  9.8G   1% /run/secrets
/dev/mapper/docker-lvol0  100G  394M  100G   1% /etc/hosts
tmpfs                     9.8G     0  9.8G   0% /proc/kcore
tmpfs                     9.8G     0  9.8G   0% /proc/timer_stats
```

つまり、`overlay`を使用すると`/var/lib/docker`の領域をまるごとコンテナはアサインされるわけです。しかも、複数コンテナで同じ領域を共有します。
※厳密には`/var/lib/docker/overlay`のようです


さて、ここで疑問が生じますが、同じ領域を共有すると変なことになりそうな感じがしませんか？

これを解決するのが`overlayfs`の仕組みです。解説は[こちら](http://www.school.ctc-g.co.jp/columns/nakai/nakai69.html)にまかす！


そして、この`overlayfs`はパフォーマンスが優れています。解説は[こちら](http://www.school.ctc-g.co.jp/columns/nakai/nakai68.html)にまかす！

##何が良いか

* パフォーマンスが良い

![画像](http://www.breakage.org/wp-content/uploads/2014/09/20140819-container-create-destroy-1000-containers3.png)
転載元：http://developerblog.redhat.com/2014/09/30/overview-storage-scalability-docker/

　

* 監視が楽

10G制限があるとコンテナ内のディスク閾値監視をコンテナ単位で行う必要があるが、`overlay`であればホストOSの`/var/lib/docker`領域を見るだけで良い！