#Dockerでoverlayfsを使ってみた
overlayfsはRHEL7.1には正式に導入されているUnionFilesystemで、Docker1.6.2では対応しています。
RHEL7.1のデフォルト構成は、DeviceMapper+thin-volumeとなっており、各コンテナの最大サイズは10Gと制限されています。
※ちなみにこちらにて制限を拡張する方法がありました
overlayfsはこちらを参照
##とりあえず設定してみる
事前準備として/var/lib/docker
配下を全て削除しておきましょう。
設定はこちら。/etc/sysconfig/docker
内のOPTION
に-s overlay
といれるだけです。
OPTIONS='--selinux-enabled -s overlay'
その後systemctl start docker
とコマンドを発行するとoverlay
で起動しています。
[root ~]# docker info
Containers: 3
Images: 41
Storage Driver: overlay
Backing Filesystem: xfs
Execution Driver: native-0.2
Kernel Version: 3.10.0-229.7.2.el7.x86_64
Operating System: Red Hat Enterprise Linux
CPUs: 8
Total Memory: 19.45 GiB
Name: test
ID: 43IZ:AW2E:LBT5:O52P:JTKE:S54D:L7HI:NDGB:V2QS:R7XS:SUDQ:NMRE
##比較してみる
DeviceMapperを使用したディスクの確保はこちらでまとめました。
まあ、こんなかんじになっています。
[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
しかし、overlayfs
ではこんな感じ。
[root ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 300G 0 disk
sda1 8:1 0 500M 0 part /boot
sda2 8:2 0 299.5G 0 part
rhel-swap 253:0 0 9.8G 0 lvm [SWAP]
rhel-root 253:1 0 50G 0 lvm /
rhel-home 253:2 0 239.6G 0 lvm /home
sdb 8:16 0 100G 0 disk
sr0 11:0 1 1024M 0 rom
Dockerが確保している領域がないぞ!!!
どういうことだ…ということで、コンテナ上でdf -h
をしてみます。
[root@0f3e378b0c35 /]# df -h
Filesystem Size Used Avail Use% Mounted on
rootfs 50G 32G 19G 64% /
overlay 50G 32G 19G 64% /
tmpfs 9.8G 0 9.8G 0% /dev
shm 64M 0 64M 0% /dev/shm
tmpfs 9.8G 92K 9.8G 1% /run/secrets
/dev/mapper/rhel-root 50G 32G 19G 64% /etc/hosts
tmpfs 9.8G 0 9.8G 0% /proc/kcore
tmpfs 9.8G 0 9.8G 0% /proc/timer_stats
50Gも見える…(前回はlimitの10Gでした)
##わかりやすくしてみる
LVMで100Gほどディスクを作り、/var/lib/docker
に100Gほどマウントしました
[root lib]# df -h
ファイルシス サイズ 使用 残り 使用% マウント位置
/dev/mapper/rhel-root 50G 29G 22G 58% /
devtmpfs 9.8G 0 9.8G 0% /dev
tmpfs 9.8G 0 9.8G 0% /dev/shm
tmpfs 9.8G 8.9M 9.8G 1% /run
tmpfs 9.8G 0 9.8G 0% /sys/fs/cgroup
/dev/mapper/rhel-home 240G 91M 240G 1% /home
/dev/sda1 497M 168M 330M 34% /boot
/dev/mapper/docker-lvol0 100G 41M 100G 1% /var/lib/docker
この状態で適当なコンテナを起動しdf -h
を実行します。
するとこんな感じに100Gと見えています。
[root@89cd550ba075 /]# df -h
Filesystem Size Used Avail Use% Mounted on
rootfs 100G 394M 100G 1% /
overlay 100G 394M 100G 1% /
tmpfs 9.8G 0 9.8G 0% /dev
shm 64M 0 64M 0% /dev/shm
tmpfs 9.8G 92K 9.8G 1% /run/secrets
/dev/mapper/docker-lvol0 100G 394M 100G 1% /etc/hosts
tmpfs 9.8G 0 9.8G 0% /proc/kcore
tmpfs 9.8G 0 9.8G 0% /proc/timer_stats
つまり、overlay
を使用すると/var/lib/docker
の領域をまるごとコンテナはアサインされるわけです。しかも、複数コンテナで同じ領域を共有します。
※厳密には/var/lib/docker/overlay
のようです
さて、ここで疑問が生じますが、同じ領域を共有すると変なことになりそうな感じがしませんか?
これを解決するのがoverlayfs
の仕組みです。解説はこちらにまかす!
そして、このoverlayfs
はパフォーマンスが優れています。解説はこちらにまかす!
##何が良いか
- パフォーマンスが良い
転載元:http://developerblog.redhat.com/2014/09/30/overview-storage-scalability-docker/
- 監視が楽
10G制限があるとコンテナ内のディスク閾値監視をコンテナ単位で行う必要があるが、overlay
であればホストOSの/var/lib/docker
領域を見るだけで良い!