今日はDockerで高速と呼ばれているOverlayFSを利用することをしたいと思います。
すでに、いろいろな報告、紹介があるので、そちらも合わせてみていただければと思います。
1.中井さんのめもめも:Fedora22のDockerでoverlayfsドライバーを利用する手順
2.【RHEL7.1】Dockerでoverlayfsが便利すぎるので乗り換えるべき!
3. 第68回 Dockerストレージドライバーの性能比較 (中井悦司)
※Dockerコンテナを複数起動するときに、overlayFSを利用した場合は非常に速度が速いようです。ファイルシステムの仕組み上、ファイルシステムの書き込み/読み込みにおいても同様の結果が得られると思います。
※利用環境は、CentOS 7.1+Dockerです。
CentOSでoverlayを使用する
Dockerの設定は、3つあります。/etc/sysconfig/に保存された3つのファイルです。
# ls -al /etc/sysconfig/docker*
-rw-r--r--. 1 root root 1561 8月 2 01:02 /etc/sysconfig/docker
-rw-r--r--. 1 root root 56 3月 30 22:36 /etc/sysconfig/docker-network
-rw-r--r--. 1 root root 597 3月 30 22:36 /etc/sysconfig/docker-storage
dockerを利用する場合は、/etc/sysconfig/dockerにdockerデーモン(dockerエンジン)のパラメータを記載します。「-s overlay」を使いします。
「-s」については、daemonを見てください。「-s」は「--storage-driver="" 」の略式で、ストレージのドライバを指定することができます。通常、CentOSでは、devicemapperですが、それ以外に、aufs, btrfs, zfs, overlayを指定することができます。今回は、overlayを指定するわけです。
# Modify these options if you want to change the way the docker daemon runs
#OPTIONS='--selinux-enabled'
OPTIONS='--selinux-enabled -s overlay'
設定するとdockerの再起動が必要です。再起動後、docker infoの結果で、Storage Driver: overlayになっていれば成功です。非常に簡単です。
# systemctl restart docker.service
# docker info
Containers: 1
Images: 3
Storage Driver: overlay
Backing Filesystem: xfs
Execution Driver: native-0.2
Kernel Version: 3.10.0-229.7.2.el7.x86_64
Operating System: CentOS Linux 7 (Core)
CPUs: 2
Total Memory: 3.69 GiB
Name: localhost.localdomain
ID: 552I:6CNP:VS67:ODAE:ZRYZ:AIWK:XXKB:VKG2:P6HB:PTWU:HAJG:LWCC
overlayFSにして、何がわかった?
##何が変わったのでしょうか。
devicemapper(loopbackLVM)の時にループバックデバイスとして登録されていましたが、なくなっています。
# losetup
# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 50G 0 disk
├─sda1 8:1 0 500M 0 part /boot
└─sda2 8:2 0 49.5G 0 part
├─centos-root 253:0 0 45.6G 0 lvm /
└─centos-swap 253:1 0 3.9G 0 lvm [SWAP]
sr0 11:0 1 636M 0 rom
[root@localhost ~]# df -h
ファイルシス サイズ 使用 残り 使用% マウント位置
/dev/mapper/centos-root 46G 1.3G 45G 3% /
devtmpfs 1.9G 0 1.9G 0% /dev
tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs 1.9G 8.6M 1.9G 1% /run
tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
/dev/sda1 497M 162M 336M 33% /boot
ディスクを見ると、/var/lib/docker以下に、overlay、repositories-overlayが増えています。でも、空っぽです。
# ls -al /var/lib/docker/
合計 20
drwx------. 9 root root 4096 8月 5 07:46 .
drwxr-xr-x. 25 root root 4096 8月 5 07:07 ..
drwx------. 2 root root 6 8月 5 07:46 containers
drwx------. 3 root root 17 8月 5 07:46 graph
drwx------. 2 root root 29 8月 2 02:12 init
-rw-r--r--. 1 root root 5120 8月 5 07:46 linkgraph.db
drwxr-xr-x. 2 root root 6 8月 5 07:46 overlay
-rw-------. 1 root root 41 8月 5 07:46 repositories-overlay
drwx------. 2 root root 6 8月 2 02:14 tmp
drwx------. 2 root root 26 8月 2 02:12 trust
drwx------. 2 root root 6 8月 2 02:12 volumes
# du -h /var/lib/docker/overlay/
0 /var/lib/docker/overlay/
イメージを取得する
では、イメージを取得したらどうなるのでしょうか。/var/lib/overlay/以下にディレクトリが3つできました。
# docker pull centos
latest: Pulling from docker.io/centos
Digest: sha256:57554136c655abb33ecb7bb790b1db0279668d3763c3b81f31bc6c4e60e4a1f3
Status: Downloaded newer image for docker.io/centos:latest
# ls -al /var/lib/docker/overlay/
合計 8
drwxr-xr-x. 5 root root 4096 8月 5 07:51 .
drwx------. 9 root root 4096 8月 5 07:46 ..
drwx------. 3 root root 17 8月 5 07:51 7322fbe74aa5632b33a400959867c8ac4290e9c5112877a7754be70cfe5d66e9
drwx------. 3 root root 17 8月 5 07:51 c852f6d61e65cddf1e8af1f6cd7db78543bfb83cdcd36845541cf6d9dfef20a0
drwx------. 3 root root 17 8月 5 07:51 f1b10cd842498c23d206ee0cbeaa9de8d2ae09ff3c7af2723a9e337a6965d639
これは何でしょうか。なるほど、ダウンロードしたイメージのIDに対応したディレクトリができているのがわかります。それぞれのディレクトリの中身は、CentOS7を構成するファイルがたくさん入っているので、割愛します。
# docker images --tree
Warning: '--tree' is deprecated, it will be removed soon. See usage.
└─f1b10cd84249 Virtual Size: 0 B
└─c852f6d61e65 Virtual Size: 172.2 MB
└─7322fbe74aa5 Virtual Size: 172.2 MB Tags: docker.io/centos:latest
Dockerコンテナを起動してみる
では、Dockerコンテナを起動しています。df -h を調べたところ、「/」にマウントされているディスクはホストのディスクと同じです。
# docker run -it --name test01 centos /bin/bash
mktemp: failed to create file via template '/tmp/.colorlsXXX': Permission denied
bash: $TMP: ambiguous redirect
[root@89803bc3844b /]#
[root@89803bc3844b /]# df -h
Filesystem Size Used Avail Use% Mounted on
rootfs 46G 1.3G 45G 3% /
overlay 46G 1.3G 45G 3% /
tmpfs 1.9G 0 1.9G 0% /dev
shm 64M 0 64M 0% /dev/shm
tmpfs 1.9G 0 1.9G 0% /run/secrets
/dev/mapper/centos-root 46G 1.3G 45G 3% /etc/hosts
tmpfs 1.9G 0 1.9G 0% /proc/kcore
tmpfs 1.9G 0 1.9G 0% /proc/timer_stats
[root@89803bc3844b /]# ls /
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
/var/lib/docker/overlay/以下のディレクトリに作成されたコンテナIDのディレクトリが追加されています。(2つ増えています)
# ls -al /var/lib/docker/overlay/
合計 8
drwxr-xr-x. 7 root root 4096 8月 5 07:59 .
drwx------. 9 root root 4096 8月 5 07:59 ..
drwx------. 3 root root 17 8月 5 07:51 7322fbe74aa5632b33a400959867c8ac4290e9c5112877a7754be70cfe5d66e9
drwx------. 5 root root 57 8月 5 07:59 89803bc3844b59b8a5c1c437a2e1ff90f07b35baee14aa46f328ae1441eebe71
drwx------. 5 root root 57 8月 5 07:59 89803bc3844b59b8a5c1c437a2e1ff90f07b35baee14aa46f328ae1441eebe71-init
drwx------. 3 root root 17 8月 5 07:51 c852f6d61e65cddf1e8af1f6cd7db78543bfb83cdcd36845541cf6d9dfef20a0
drwx------. 3 root root 17 8月 5 07:51 f1b10cd842498c23d206ee0cbeaa9de8d2ae09ff3c7af2723a9e337a6965d639
どのようにマウントしているのでしょうか。
まずは、マウントしている情報を知りたいので、起動したDockerコンテナのプロセスIDをしらべます。12438であることがわかります。
# ps -ef | grep docker
root 12318 1 0 07:32 ? 00:00:14 /usr/bin/docker -d --selinux-enabled -s overlay
root 12434 12263 0 07:59 pts/0 00:00:00 docker run -it --name test01 centos /bin/bash
root 12525 12505 0 08:01 pts/2 00:00:00 grep --color=auto docker
** DockerデーモンのPIDを調べて、検索します。
[root@localhost ~]# ps -ef | grep 12318
root 12318 1 0 07:32 ? 00:00:14 /usr/bin/docker -d --selinux-enabled -s overlay
root 12438 12318 0 07:59 pts/1 00:00:00 /bin/bash
取得したプロセスIDを利用して、/proc/以下にあるマウント情報を調べます。
overlayでマウントしていることがわかります。
# cat /proc/12438/mountinfo | grep overlay
109 77 0:35 / / rw,relatime - overlay overlay rw,context="system_u:object_r:svirt_sandbox_file_t:s0:c82,c958",lowerdir=/var/lib/docker/overlay/7322fbe74aa5632b33a400959867c8ac4290e9c5112877a7754be70cfe5d66e9/root,upperdir=/var/lib/docker/overlay/89803bc3844b59b8a5c1c437a2e1ff90f07b35baee14aa46f328ae1441eebe71/upper,workdir=/var/lib/docker/overlay/89803bc3844b59b8a5c1c437a2e1ff90f07b35baee14aa46f328ae1441eebe71/work
上の情報から、このようにマウントされていることがわかりますね。
lowerdir=/var/lib/docker/overlay/7322fbe74aa5632b33a400959867c8ac4290e9c5112877a7754be70cfe5d66e9/root
upperdir=/var/lib/docker/overlay/89803bc3844b59b8a5c1c437a2e1ff90f07b35baee14aa46f328ae1441eebe71/upper
workdir=/var/lib/docker/overlay/89803bc3844b59b8a5c1c437a2e1ff90f07b35baee14aa46f328ae1441eebe71/work
あれ?書き込めない。。。
起動したDockerコンテナにファイルを作成しようとすると「Permission denied」とエラーが表示されます。なぜ?
[root@89803bc3844b /]# touch test
touch: cannot touch 'test': Permission denied
やっぱり中井さんのページに答えがありました。
中井さんのめもめも:Fedora22のDockerでoverlayfsドライバーを利用する手順に書いてあります。
overlayドライバは、SELinux未対応のため、使用できないそうです。
# sed -i 's/SELINUX=enforcing/SELINUX=permissive/' /etc/selinux/config
# shutdown -r now
ファイルが作られるようになりました♪