2016/01/10

Oracle Linux 6にUEKr4を入れてDockerのoverlayfsを試す

Oracle 社が Red Hat Enterprise Linux の互換カーネルとして開発しているカスタムカーネル Unbreakable Enterprise Kernel の最新版 Release 4 (UEKr4) がリリースされました。

Linux 4.1 ベースということで変更点を眺めていると OverlayFS がサポートされているようでしたので、せっかくなので Oracle Linux 7 ではなく Oracle Linux 6 の Docker で overlayfs ストレージドライバを試したときのメモです。

Oracle Linux 6 に Docker をインストール

Oracle Linux 6 で Docker を動かすには Docker 社の提供する最新版を使用する方法もありますが、ここでは Oracle 社が提供している public-yum リポジトリの Addons を使用します。

KVM 環境に Oracle Linux 6.7 を用意します。
# uname -a
Linux ol67.vm.myhome 3.8.13-118.2.4.el6uek.x86_64 #2 SMP Thu Jan 7 15:56:17 PST 2016 x86_64 x86_64 x86_64 GNU/Linux

# cat /etc/redhat-release
Red Hat Enterprise Linux Server release 6.7 (Santiago)
public_ol6_addons リポジトリを有効にします。
# sed -i'' -e '/\[\(public_\)*ol6_addons/,/^enabled/s/\(enabled=\)0/\11/' /etc/yum.repos.d/public-yum-ol6.repo
そして docker-engine パッケージをインストールします(docker パッケージはバージョンが 1.6.1 と古い)。
# yum install docker-engine -y

# yum info docker-engine
Loaded plugins: security, ulninfo
Installed Packages
Name        : docker-engine
Arch        : x86_64
Version     : 1.8.3
Release     : 1.0.1.el6
Size        : 27 M
Repo        : installed
From repo   : public_ol6_addons
Summary     : The open-source application container engine
URL         : https://dockerproject.org
License     : ASL 2.0
Description : Docker is an open source project to pack, ship and run any application as a
            : lightweight container
            :
            : Docker containers are both hardware-agnostic and platform-agnostic. This means
            : they can run anywhere, from your laptop to the largest EC2 compute instance and
            : everything in between - and they don't require you to use a particular
            : language, framework or packaging system. That makes them great building blocks
            : for deploying and scaling web apps, databases, and backend services without
            : depending on a particular stack or provider.

Docker の起動

とりあえずインストール直後に docker を起動してみます。

# service docker start
Starting cgconfig service:                                 [  OK  ]
Starting docker:                                           [  OK  ]
# docker version
Client:
 Version:      1.8.3
 API version:  1.20
 Go version:   go1.4.2
 Git commit:   f0bb124
 Built:        Wed Oct 14 04:06:48 UTC 2015
 OS/Arch:      linux/amd64

Server:
 Version:      1.8.3
 API version:  1.20
 Go version:   go1.4.2
 Git commit:   f0bb124
 Built:        Wed Oct 14 04:06:48 UTC 2015
 OS/Arch:      linux/amd64
# docker info
Containers: 0
Images: 0
Storage Driver: devicemapper
 Pool Name: docker-252:0-1705344-pool
 Pool Blocksize: 65.54 kB
 Backing Filesystem: extfs
 Data file: /dev/loop0
 Metadata file: /dev/loop1
 Data Space Used: 1.821 GB
 Data Space Total: 107.4 GB
 Data Space Available: 23.34 GB
 Metadata Space Used: 1.479 MB
 Metadata Space Total: 2.147 GB
 Metadata Space Available: 2.146 GB
 Udev Sync Supported: true
 Deferred Removal Enabled: false
 Data loop file: /var/lib/docker/devicemapper/devicemapper/data
 Metadata loop file: /var/lib/docker/devicemapper/devicemapper/metadata
 Library Version: 1.02.95-RHEL6 (2015-09-08)
Execution Driver: native-0.2
Logging Driver: json-file
Kernel Version: 3.8.13-118.2.4.el6uek.x86_64
Operating System: Oracle Linux Server 6.7
CPUs: 1
Total Memory: 994.2 MiB
Name: ol67.vm.myhome
ID: IXNG:S37Y:QLCH:7TG4:7WDT:FLWV:SFHD:J4CX:JO7I:WWKU:7KLP:QCME
WARNING: bridge-nf-call-iptables is disabled
WARNING: bridge-nf-call-ip6tables is disabled

Docker ストレージドライバを変更

UEKr3 で overlayfs を使用するとどうなるか試してみます。

# service docker stop
# rm -rf /var/lib/docker

# sed -i'' -e 's/^\(other_args=\).*/\1"-s overlay"/' /etc/sysconfig/docker

# service docker start
Starting docker:                                           [  OK  ]

# service docker status
docker は停止していますがサブシステムがロックされています
サポートされていないので当然ですが、以下のメッセージが出て docker の起動に失敗しています。
level=warning msg="You are running linux kernel version 3.8.13-118.2.4.el6uek.x86_64, which might be unstable running docker. Please upgrade your kernel to 3.10.0."
level=info msg="Listening for HTTP on unix (/var/run/docker.sock)"
level=error msg="'overlay' not found as a supported filesystem on this host. Please ensure kernel is new enough and has overlay support loaded."
level=fatal msg="Error starting daemon: error initializing graphdriver: driver not supported"

Oracle Linux 6 に UEKr4 をインストール

overlayfs をサポートする UEKr4 をインストールするためにリポジトリファイルを最新化します。

# cd /etc/yum.repos.d
# curl -O http://public-yum.oracle.com/public-yum-ol6.repo
ol6_UEK_latest リポジトリに UEKr4 はまだ無いようですので ol6_UEKR4 リポジトリを有効にしてパッケージを更新します。
# sed -i'' -e '/\[ol6_UEKR4\]/,/^enabled/s/\(enabled=\)0/\11/' /etc/yum.repos.d/public-yum-ol6.repo

# yum update -y

# reboot
再起動後、UEKr4 で起動して docker が overlay ストレージドライバで起動していることが確認できます。
# uname -a
Linux ol67.vm.myhome 4.1.12-32.el6uek.x86_64 #2 SMP Thu Dec 17 19:31:07 PST 2015 x86_64 x86_64 x86_64 GNU/Linux
# docker info
Containers: 0
Images: 0
Storage Driver: overlay
 Backing Filesystem: extfs
Execution Driver: native-0.2
Logging Driver: json-file
Kernel Version: 4.1.12-32.el6uek.x86_64
Operating System: Oracle Linux Server 6.7
CPUs: 1
Total Memory: 991.7 MiB
Name: ol67.vm.myhome
ID: WU7J:P6QV:6R25:L2XI:TFIK:3ZZ2:FGZN:L4QY:YEFB:4ACW:C7D5:MP2G

OverlayFS を試す

selinux は無効にしていませんがコンテナ内でふつうに読み書きはできました。

# ps -ef | grep [d]ocker
root      1655     1  3 11:59 ?        00:00:16 /usr/bin/docker daemon -s overlay
# docker run -it centos /bin/bash
Unable to find image 'centos:latest' locally
latest: Pulling from library/centos
fa5be2806d4c: Pull complete
2bf4902415e3: Pull complete
86bcb57631bd: Pull complete
c8a648134623: Pull complete
Digest: sha256:8072bc7c66c3d5b633c3fddfc2bf12d5b4c2623f7004d9eed6aae70e0e99fbd7
Status: Downloaded newer image for centos:latest

[root@5572765322da /]# df -h
Filesystem                   Size  Used Avail Use% Mounted on
overlay                       27G  6.4G   20G  25% /
tmpfs                        496M     0  496M   0% /dev
shm                           64M     0   64M   0% /dev/shm
tmpfs                        496M     0  496M   0% /sys/fs/cgroup
/dev/mapper/vg_ol67-lv_root   27G  6.4G   20G  25% /etc/hosts

[root@5572765322da /]# touch /tmp/a

[root@5572765322da /]# ls -l /tmp/a
-rw-r--r--. 1 root root 0 Jan 10 12:08 /tmp/a
コンテナの外はからはどう見えるのでしょうか。overlay ディレクトリの下にいくつかサブディレクトリが作成されています。
# ls -1F /var/lib/docker/overlay/
2bf4902415e362b7e531ac48c5bb4b265292375ae9b9bf735360be9cbca5f8e5/
5572765322da5634aed17f159b74f66ee332efda77d00fa1ea401a2d39eb7acf/
5572765322da5634aed17f159b74f66ee332efda77d00fa1ea401a2d39eb7acf-init/
86bcb57631bd122c32b8e277b64b45ac00382e78e0d21530a50c090fd739d0ee/
c8a648134623c453dc62abcd747eafa40af057e28cd5937baeebe2ed4c32094e/
fa5be2806d4c9aa0f75001687087876e47bb45dc8afb61f0c0e46315500ee144/
コンテナの設定内容を確認します。
# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
5572765322da        centos              "/bin/bash"         3 minutes ago       Up 3 minutes                            admiring_stallman
# docker inspect 5572765322da | sed -n -e '/GraphDriver/,/},/ p'
    "GraphDriver": {
        "Name": "overlay",
        "Data": {
            "LowerDir": "/var/lib/docker/overlay/c8a648134623c453dc62abcd747eafa40af057e28cd5937baeebe2ed4c32094e/root",
            "MergedDir": "/var/lib/docker/overlay/5572765322da5634aed17f159b74f66ee332efda77d00fa1ea401a2d39eb7acf/merged",
            "UpperDir": "/var/lib/docker/overlay/5572765322da5634aed17f159b74f66ee332efda77d00fa1ea401a2d39eb7acf/upper",
            "WorkDir": "/var/lib/docker/overlay/5572765322da5634aed17f159b74f66ee332efda77d00fa1ea401a2d39eb7acf/work"
        }
    },
ベースとなる root ディレクトリに
# ll /var/lib/docker/overlay/c8a648134623c453dc62abcd747eafa40af057e28cd5937baeebe2ed4c32094e/root
合計 80
-rw-r--r--.  3 root root 18293 12月 24 03:12 2015 anaconda-post.log
lrwxrwxrwx.  1 root root     7 12月 24 03:06 2015 bin -> usr/bin
drwxr-xr-x.  2 root root  4096 12月 24 03:05 2015 dev
drwxr-xr-x. 48 root root  4096  1月 10 12:05 2016 etc
drwxr-xr-x.  2 root root  4096  8月 12 23:22 2015 home
lrwxrwxrwx.  1 root root     7 12月 24 03:06 2015 lib -> usr/lib
lrwxrwxrwx.  1 root root     9 12月 24 03:06 2015 lib64 -> usr/lib64
drwx------.  2 root root  4096 12月 24 03:05 2015 lost+found
drwxr-xr-x.  2 root root  4096  8月 12 23:22 2015 media
drwxr-xr-x.  2 root root  4096  8月 12 23:22 2015 mnt
drwxr-xr-x.  2 root root  4096  8月 12 23:22 2015 opt
drwxr-xr-x.  2 root root  4096 12月 24 03:05 2015 proc
dr-xr-x---.  2 root root  4096  1月 10 12:05 2016 root
drwxr-xr-x.  2 root root  4096 12月 24 03:05 2015 run
lrwxrwxrwx.  1 root root     8 12月 24 03:06 2015 sbin -> usr/sbin
drwxr-xr-x.  2 root root  4096  8月 12 23:22 2015 srv
drwxr-xr-x.  2 root root  4096 12月 24 03:05 2015 sys
drwxrwxrwt.  7 root root  4096  1月 10 12:05 2016 tmp
drwxr-xr-x. 13 root root  4096  1月 10 12:05 2016 usr
drwxr-xr-x. 18 root root  4096  1月 10 12:05 2016 var
コンテナ用に読み書きできる upper ディレクトリを overlay しているわけですね。
# ll /var/lib/docker/overlay/5572765322da5634aed17f159b74f66ee332efda77d00fa1ea401a2d39eb7acf/upper/tmp
合計 0
-rw-r--r--. 1 root root 0  1月 10 12:08 2016 a

おわりに

Oracle Linux 6 という少し古いシステムでも Unbreakable Enterprise Kernel Release 4 を適用することで overlayfs を試せました。

Docker のストレージドライバの本命は overlayfs だと思いますので、来たるべきコンテナ時代に備えて Oracle Linux + UEKr4 でいろいろ試してみようと思います。

0 件のコメント:

コメントを投稿