Dockerでルートディスクサイズを調整する

今日はDockerのルートサイズを調整してみましょう。

# デフォルトは？

初期設定のままでは、ルートディレクトリのサイズは、10Gになっています。

```
# docker run -it centos:6 /bin/bash
[root@43447de6ca71 /]# 
[root@43447de6ca71 /]# 
[root@43447de6ca71 /]# df -h
Filesystem            Size  Used Avail Use% Mounted on
rootfs                9.8G  254M  9.0G   3% /
/dev/mapper/docker-253:0-101301287-43447de6ca71fe7bf974a1d99264765148d306bd6b612e8310bb28e0b5f7d9ed
                      9.8G  254M  9.0G   3% /
tmpfs                 914M     0  914M   0% /dev
shm                    64M     0   64M   0% /dev/shm
...
tmpfs                 914M     0  914M   0% /proc/timer_stats
```

では、ホストの方はどうなってなっているのでしょうか。
10Gのディスクがマウントされていますよね。

```
# lsblk 
NAME                                                                                        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda                                                                                           8:0    0   20G  0 disk 
├─sda1                                                                                        8:1    0  500M  0 part /boot
...
loop0                                                                                         7:0    0  100G  0 loop 
└─docker-253:0-101301287-pool                                                               253:4    0  100G  0 dm   
  ├─docker-253:0-101301287-base                                                             253:5    0   10G  0 dm   
  └─docker-253:0-101301287-43447de6ca71fe7bf974a1d99264765148d306bd6b612e8310bb28e0b5f7d9ed 253:6    0   10G  0 dm   
loop1                                                                                         7:1    0    2G  0 loop 
└─docker-253:0-101301287-pool                                                               253:4    0  100G  0 dm   
  ├─docker-253:0-101301287-base                                                             253:5    0   10G  0 dm   
  └─docker-253:0-101301287-43447de6ca71fe7bf974a1d99264765148d306bd6b612e8310bb28e0b5f7d9ed 253:6    0   10G  0 dm   
```

#設定変更

では、サイズを変更してみましょう。参考のページは、こちら[Storage driver options](https://docs.docker.com/reference/commandline/daemon/#storage-driver-options)です。

「dm.basesize」を設定すればよいようです。
参考のページでは、dockerデーモンを起動する引数として指定していますが、systemctrlなどで起動する場合は、設定ファイルに記載します。
Dockerの起動設定には、/etc/sysconfig/docker、/etc/sysconfig/docker-network、/etc/sysconfig/docker-storageがあります。

```
# ls /etc/sysconfig/docker*
/etc/sysconfig/docker  /etc/sysconfig/docker-network  /etc/sysconfig/docker-storage
```

ベースサイズの設定は、/etc/sysconfig/docker、/etc/sysconfig/docker-storageどちらに書いてもよさそうです。
以下のように設定します。「--storage-opt」を書いた後に、「 dm.basesize=50G 」を書いてください。
「--storage-opt dm.basesize=50G 」が1つの設定です。ちなみにほかのストレージのオプションを追加する場合には、「--storage-opt」をもう一度書く必要あります。

```:/etc/sysconfig/docker-storage
DOCKER_STORAGE_OPTIONS= --storage-opt dm.basesize=50G 
```

では、再起動して起動してみましょう。50Gになっていることが確認できます。

```
# docker run -it centos:6 /bin/bash 
[root@cbf5aa97998c /]# 
[root@cbf5aa97998c /]# df -h
Filesystem            Size  Used Avail Use% Mounted on
rootfs                 50G  270M   47G   1% /
/dev/mapper/docker-253:0-67182476-cbf5aa97998c60efbc53dfbe4fbcb407e41fac4f947f35d10eb9670c6b229c02
                       50G  270M   47G   1% /
...
```

# あれ？困った人のために

/var/lib/dockerを削除しない場合は、前回と同じままです。

```
# systemctl stop docker
# 
# systemctl start docker

# docker run -it centos:6 /bin/bash
[root@c9c5ada649e6 /]# df -h
Filesystem            Size  Used Avail Use% Mounted on
rootfs                9.8G  254M  9.0G   3% /
/dev/mapper/docker-253:0-101301287-c9c5ada649e6fa31835a3fbd8b46eb609283e48d2327d96504b8ff908e7a99d6
                      9.8G  254M  9.0G   3% /
...
```

これはなぜか。答えは、おそらくと気づいて、キーワードで検索したら、中井さんのドキュメントにしっかり書いてありました。[Dockerイメージ管理の内部構造](http://www.slideshare.net/enakai/docker-43975886)の13ページ目を見てください。

Dockerのサービスを起動したときに、ベースになる論理ディスクが作成されるようです。それをもとにスナップショットをとることで、うまく利用しているようです。そのため、最初にディスクが作成されたタイミングのディスクサイズがずっと使用され続けてしまいます。一度作ったディスクサイズを広げようとすると、一度DockerHUBにあげる、exportするなどの作業を行ったうえで、一度すべて削除してから、設定変更を行う必要があるということです。

```
# cat /var/lib/docker/devicemapper/metadata/base | python -mjson.tool
{
    "device_id": 1,
    "initialized": true,
    "size": 53687091200,
    "transaction_id": 1
}
```

# 結論
/etc/sysconfig/docker-storageに「--storage-opt dm.basesize=50G 」を記載することで設定を変更できます。
ただし、設定変更が反映されるのは、/var/lib/docker/devicemapperを再作成したタイミングからとなります。
このイメージは50Gで、あのイメージは30Gでということが簡単にはできないようですね。
「-v」を使ってマウントしてしまうと、ディスク制限はなく、ホストと同じ扱いになります。Dockerコンテナとしてはあまりよくないですね。