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

  • 76
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

dockerのディスクの使用方法

dataとmetadata

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

dm-thinではデータ領域とメタデータ領域が必要なため、dockerは/var/lib/docker/devicemapper/devicemapperdataというデバイスファイルイメージと、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は作成したdatametadataをデバイスにするためにループバックデバイスという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にて設定が可能です。

/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

コンテナで確認

dokcerコンテナにログインして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個以上コンテナを作成しても問題ありません。

まとめ

dataloop0dm-x/dev/mapper/docker-253:1-6851-xxx....コンテナの/領域です