2015年8月31日月曜日

Oracle Linux Docker + Btrfs を試してみる。

Oracle Linux 6 のマニュアルに、
Storage Driver を Docker デフォルトの デバイス・マッパーのかわりに
Btrfs にする方法が記載されているので試してみました。
第 10章 Docker
10.2 Docker Engineのインストールおよび構成
http://docs.oracle.com/cd/E39368_01/b71105/section_kfy_f2z_fp.html

事前に、必要に応じて現時点で Docker ホストに登録されているイメージやコンテナを
退避(もしくは削除)しておきます。
たとえば、docker rm / rmi コマンドで削除したり、docekr save コマンドで退避したりしておきます。

今回の環境です。
[root@docker-host01 ~]# cat /etc/oracle-release
Oracle Linux Server release 6.6
[root@docker-host01 ~]# uname -r
3.8.13-44.1.1.el6uek.x86_64
[root@docker-host01 ~]# docker -v
Docker version 1.6.1, build a8a31ef/1.6.1

新規追加したデバイス 「/dev/sdb」を Btrfs でフォーマットして使用します。
[root@docker-host01 ~]# fdisk -l /dev/sdb

ディスク /dev/sdb: 107.4 GB, 107374182400 バイト
ヘッド 255, セクタ 63, シリンダ 13054
Units = シリンダ数 of 16065 * 512 = 8225280 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O size (minimum/optimal): 512 bytes / 512 bytes
ディスク識別子: 0x00000000

Btrfs への変更手順。

Btrfs を使用するため、btrfs-progs をインストールします。
[root@docker-host01 ~]# yum install -y btrfs-progs

今回は、下記のバージョンをインストールしました。
[root@docker-host01 ~]# rpm -q btrfs-progs
btrfs-progs-0.20-1.8.git7854c8b.el6.x86_64

ディスクを Btrfs でフォーマットします。
[root@docker-host01 ~]# mkfs.btrfs -L docker-fs /dev/sdb

WARNING! - Btrfs v0.20-rc1 IS EXPERIMENTAL
WARNING! - see http://btrfs.wiki.kernel.org before using

fs created label docker-fs on /dev/sdb
        nodesize 4096 leafsize 4096 sectorsize 4096 size 100.00GB
Btrfs v0.20-rc1
[root@docker-host01 ~]# btrfs filesystem show docker-fs
failed to open /dev/fd0: No such device or address
failed to open /dev/sr0: No medium found
Label: 'docker-fs'  uuid: b60f7688-48cb-4d73-821d-27edf0080f32
        Total devices 1 FS bytes used 28.00KB
        devid    1 size 100.00GB used 2.04GB path /dev/sdb

Btrfs v0.20-rc1

Docker サービスを停止しておきます。
[root@docker-host01 ~]# service docker stop
docker を停止中:                                           [  OK  ]

元の Docker 関連データを退避します。
[root@docker-host01 ~]# mv /var/lib/docker /var/lib/docker_bk
[root@docker-host01 ~]# mkdir /var/lib/docker

Btrfs の領域をマウントため、/etc/fstab ファイルに追記します。
[root@docker-host01 ~]# vi /etc/fstab

今回は fstab に下記を追記しました。
LABEL=docker-fs         /var/lib/docker         btrfs   defaults        0 0

そして Btrfs の領域をマウントします。
[root@docker-host01 ~]# mount -a
[root@docker-host01 ~]# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/vg_ol66base01-lv_root
                       14G  4.4G  8.6G  34% /
tmpfs                 498M     0  498M   0% /dev/shm
/dev/sda1             477M   64M  385M  15% /boot
/dev/sdb              100G  320K   98G   1% /var/lib/docker


Docker が Btrfs を利用するように、
/etc/sysconfig/docker ファイルに、ストレージドライバ設定(-s btrfs)を追記します
[root@docker-host01 ~]# vi /etc/sysconfig/docker
追記のように設定を修正します。
other_args="-s btrfs"

Docker を起動します。
[root@docker-host01 ~]# service docker start
Starting docker:                                           [  OK  ]

ストレージドライバが btrfs になりました。
[root@docker-host01 ~]# docker info
Containers: 0
Images: 0
Storage Driver: btrfs
Execution Driver: native-0.2
Kernel Version: 3.8.13-44.1.1.el6uek.x86_64
Operating System: <unknown>
CPUs: 1
Total Memory: 994.7 MiB
Name: docker-host01
ID: XMKW:Q7ZI:XKC3:KIEM:SQWR:MSYF:5KVP:3S25:DUBQ:PFE2:HGHU:WAGB

Docker + Btrfs のストレージの見え方。

Btrfs になった Docker の様子を見てみます。
まず、まだ Docker イメージがないため、Docker-Hub からダウンロードします。
※ダウンロードするイメージは「oraclelinux:6」です。
[root@docker-host01 ~]# docker pull oraclelinux:6
6: Pulling from oraclelinux
8c3e49cb06dc: Pull complete
c96aadb57deb: Pull complete
cfc75fa9f295: Pull complete
Digest: sha256:01129dad95bb42b3db85ff489952b6d62a07da24d3239bb09d711d8a5c7caeac
Status: Downloaded newer image for oraclelinux:6

ダウンロードしたDocker イメージは、下記のようなレイヤを持っています。
docker コマンドからのイメージやコンテナの表示は、Btrfs にしても特に変化しません。
[root@docker-host01 ~]# docker images --tree
Warning: '--tree' is deprecated, it will be removed soon. See usage.
  8c3e49cb06dc Virtual Size: 0 B
    c96aadb57deb Virtual Size: 156.2 MB
      cfc75fa9f295 Virtual Size: 156.2 MB Tags: oraclelinux:6

Btrfs のサブボリュームを表示してみると、
Docker イメージのレイヤのもつ ID と一致しています。
※docker コマンドでは、ID が省略されて表示されています。
[root@docker-host01 ~]# btrfs subvolume list /var/lib/docker
ID 257 gen 9 top level 5 path btrfs/subvolumes/8c3e49cb06dc5b36240627eca5238665ce373d96f41e28947920828dfe434381
ID 258 gen 10 top level 5 path btrfs/subvolumes/c96aadb57deb25ded19051bd5980e2ffa39f55ccbecf2db045e90c96452cb88f
ID 260 gen 11 top level 5 path btrfs/subvolumes/cfc75fa9f295d84c856f6e6205389282643c67842fdcc62abc24f55acdc01b64

ためしに、イメージからコンテナを起動してみます。
※コンテナの名前は「cont01」にしています。
[root@docker-host01 ~]# docker run -itd --name=cont01 oraclelinux:6 /bin/bash
f6a525e98af1ee4950939f0abce0287e3501a9c89ce2adab90b6ab9c3581ffb3

起動したコンテナです。直前に起動したコンテナ 1つだけ存在しています。
[root@docker-host01 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                            PORTS               NAMES
f6a525e98af1        oraclelinux:6       "/bin/bash"         2 minutes ago       Exited (137) About a minute ago                       cont01

コンテナをコミットして、イメージ「ol6:v01」を作成してみます。
[root@docker-host01 ~]# docker stop cont01
cont01
[root@docker-host01 ~]# docker commit cont01 ol6:v01
cd272416c9345e33af83f481425d7b536bd83ed0378e4946d7685aadf01bbdeb
[root@docker-host01 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
ol6                 v01                 cd272416c934        5 seconds ago       156.2 MB
oraclelinux         6                   cfc75fa9f295        4 weeks ago         156.2 MB
[root@docker-host01 ~]# docker images --tree
Warning: '--tree' is deprecated, it will be removed soon. See usage.
  8c3e49cb06dc Virtual Size: 0 B
    c96aadb57deb Virtual Size: 156.2 MB
      cfc75fa9f295 Virtual Size: 156.2 MB Tags: oraclelinux:6
        cd272416c934 Virtual Size: 156.2 MB Tags: ol6:v01

サブボリュームは下記のように見えます。
コンテナ(停止してまだ削除していない)と、新しいイメージのサブボリュームが増えました。
サブボリュームのパスから、
cd272416c934~がイメージ「ol6:v01」で、
f6a525e98af1~がコンテナ「cont01」に紐づきます。
[root@docker-host01 ~]# btrfs subvolume list /var/lib/docker
ID 257 gen 9 top level 5 path btrfs/subvolumes/8c3e49cb06dc5b36240627eca5238665ce373d96f41e28947920828dfe434381
ID 258 gen 10 top level 5 path btrfs/subvolumes/c96aadb57deb25ded19051bd5980e2ffa39f55ccbecf2db045e90c96452cb88f
ID 260 gen 20 top level 5 path btrfs/subvolumes/cfc75fa9f295d84c856f6e6205389282643c67842fdcc62abc24f55acdc01b64
ID 263 gen 20 top level 5 path btrfs/subvolumes/f6a525e98af1ee4950939f0abce0287e3501a9c89ce2adab90b6ab9c3581ffb3-init
ID 264 gen 20 top level 5 path btrfs/subvolumes/f6a525e98af1ee4950939f0abce0287e3501a9c89ce2adab90b6ab9c3581ffb3
ID 265 gen 21 top level 5 path btrfs/subvolumes/cd272416c9345e33af83f481425d7b536bd83ed0378e4946d7685aadf01bbdeb

「oraclelinux:6」のイメージに紐づく、「cfc75fa9f295~」のサブボリュームの情報を表示すると、
このサブボリュームのスナップショットとして
イメージ「ol6:v01」と、「cont01」コンテナのサブボリュームが存在することわかります。
[root@docker-host01 ~]# btrfs subvolume show /var/lib/docker/btrfs/subvolumes/cfc75fa9f295d84c856f6e6205389282643c67842fdcc62abc24f55acdc01b64
/var/lib/docker/btrfs/subvolumes/cfc75fa9f295d84c856f6e6205389282643c67842fdcc62abc24f55acdc01b64
        Name:                   cfc75fa9f295d84c856f6e6205389282643c67842fdcc62abc24f55acdc01b64
        uuid:                   c071af1e-81c9-2d46-8d3e-b4c817c26521
        Parent uuid:            070a22a6-4d3b-2049-9de6-c3739006279d
        Creation time:          2015-08-31 02:07:28
        Object ID:              260
        Generation (Gen):       20
        Gen at creation:        10
        Parent:                 5
        Top Level:              5
        Flags:                  -
        Snapshot(s):
                                btrfs/subvolumes/f6a525e98af1ee4950939f0abce0287e3501a9c89ce2adab90b6ab9c3581ffb3-init
                                btrfs/subvolumes/cd272416c9345e33af83f481425d7b536bd83ed0378e4946d7685aadf01bbdeb

Oracle VM Server では OCFS2 のストレージ機能が活用されていたと思いますが、
レイヤ構造な Docker は Btrfs と相性よさそうだと思いました。

以上、Docker + Btrfs を試してみる話でした。

0 件のコメント:

コメントを投稿