dockerはOS上のディスク領域をどう使っているのかまとめた

#dockerのディスクの使用方法

##dataとmetadata
dockerはディスクの管理方法として、dm-thinというDeviceMapperの機能を使います。
詳細は以下を参考にして下さい。

* [dm-thinの概要](http://akiradeveloper.hatenadiary.com/entry/2014/05/18/215938)
* [Docker専用のLinux - RHEL Atomic Hostが登場！](http://www.school.ctc-g.co.jp/columns/nakai/nakai59.html)

dm-thinではデータ領域とメタデータ領域が必要なため、dockerは`/var/lib/docker/devicemapper/devicemapper`に`data`というデバイスファイルイメージと、`metadata`というデータを作成します。

fileコマンドで確認すると`data`はext4 filesystemです

```
[root@master mnt]# ls -lh /var/lib/docker/devicemapper/devicemapper
合計 8.5G
-rw-------. 1 root root 100G  7月 15 11:27 data
-rw-------. 1 root root 2.0G  7月 15 11:14 metadata

[root@master mnt]# file /var/lib/docker/devicemapper/devicemapper/*
/var/lib/docker/devicemapper/devicemapper/data:     Linux rev 1.0 ext4 filesystem data, UUID=8ee719d1-ac3e-48a7-8bc8-62315601204c (extents) (64bit) (large files) (huge files)
/var/lib/docker/devicemapper/devicemapper/metadata: data

```

##ループバックデバイス

dockerは作成した`data`と`metadata`をデバイスにするためにループバックデバイスというLinuxの機能を使います。
※ループバックデバイス はディスクイメージファイルに対して、デバイスファイルを割り当てて、物理ディスクのよう に利用する機能です


```
[root@master mnt]# losetup
NAME       SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE
/dev/loop0         0      0         1  0 /var/lib/docker/devicemapper/devicemapper/data
/dev/loop1         0      0         1  0 /var/lib/docker/devicemapper/devicemapper/metadata
```

* data→/dev/loop0
* metadata→/dev/loop1



```
[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
```

`loop0`は、`docker-253:1-6851-pool`に100Gを割り当て、`docker-253:1-6851-xxxx…`にそれぞれ10Gづつ割り振っています。


ちなみに`docker-253:1-6851-pool`や`/dev/mapper/docker-253:1-6851-xxx....`はただのシンボリックリンクで、裏側にはDeviceMapperで作成された論理デバイスが存在します。

```
[root@master devicemapper]# ls -ltr /dev/mapper/docker-253\:1-6851-xxx...
lrwxrwxrwx 1 root root 8  7月 15 11:42 /dev/mapper/docker-253:1-6851-xxx...-> ../dm-19
```

###dataとmetadata領域の保存先を変更する方法

[こちら](http://qiita.com/Gin/items/4bd7596fa0b65dae36d9)にも書いていますが`/etc/sysconfig/docker-storage`にて設定が可能です。

```vim:/etc/sysconfig/docker-storage
DOCKER_STORAGE_OPTIONS = --storage-opt dm.metadatadev=/dev/mylogvol/my-docker-metadata --storage-opt dm.datadev=/dev/mylogvol/my-docker-data
```


ちなみに公式ではこんなことを言っています。ループバックデバイスは遅いらしいですね。

```

The loopback makes it slower, and there are some restrictive defaults, such as 100GB max storage

```

##コンテナで確認
dockerコンテナにログインして`df -h`を叩くと、先ほど確認した`docker-253:1-6851-xxxx…`が`/`領域にマウントされていることが確認できますね。

```
[root@5c10e21ed2f4 /]# df -h
Filesystem                             Size  Used Avail Use% Mounted on
/dev/mapper/docker-253:1-6851-xxx....  9.8G  311M  8.9G   4% /
tmpfs                                  2.0G     0  2.0G   0% /dev
shm                                    64M     0   64M   0% /dev/shm
/dev/mapper/centos-root                50G   30G   21G  59% /etc/hosts
tmpfs                                  2.0G     0  2.0G   0% /proc/kcore
tmpfs                                  2.0G     0  2.0G   0% /proc/timer_stats
```

10G割り当てられていた`docker-253:1-6851-xxxx…`は1つのコンテナのディスクの上限値ということですね。なお、シンプロビジョニングのため物理的に10G割り当てられているわけではないため、10個以上コンテナを作成しても問題ありません。

##まとめ

`data`←`loop0`←`dm-x`←`/dev/mapper/docker-253:1-6851-xxx....`←`コンテナの/領域`です