今日は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です。
「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」をもう一度書く必要あります。
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イメージ管理の内部構造の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コンテナとしてはあまりよくないですね。