#dockerのディスクの使用方法
##dataとmetadata
dockerはディスクの管理方法として、dm-thinというDeviceMapperの機能を使います。
詳細は以下を参考にして下さい。
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領域の保存先を変更する方法
こちらにも書いていますが/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....
←コンテナの/領域
です