45
47

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

DockerでOverlayFSを使用する

Posted at

今日は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

ファイルが作られるようになりました♪

45
47
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
45
47

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?