Docker 1.7で追加されたZFS storage driverを使ってみる

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

Docker 1.7がリリースされましたね!

Announcing_Docker_1_7__Multi-host_networking__plugins_and_orchestration_updates___Docker_Blog

また新たな機能がたくさん追加されていますが、そのなかでも僕が一番興味を持ったのはZFS storage driverです!

ZFSはもともとSolaris上で実装されたファイルシステムで、UFSの次世代型ファイルシステムと言われています。仮想ボリュームをサポートしていたり、ファイルシステムとしてRAID機能をもっていたり、スナップショット機能があったりと、面白い機能がてんこ盛りです。

さっそく、DockerのZFS storage driverを触ってみました!

やってみた

試した環境はCentOS7(CentOS Linux release 7.1.1503) on EC2です。selinuxはdisabledにしています。

Docker 1.7のインストール

yumでDockerをインストールすると、まだ1.6しかインストールされません。なので公式ドキュメントに記載されているrpmをダウンロードして、ローカルインストールします。

$ curl -O -sSL https://get.docker.com/rpm/1.7.0/centos-7/RPMS/x86_64/docker-engine-1.7.0-1.el7.centos.x86_64.rpm
$ sudo yum localinstall --nogpgcheck docker-engine-1.7.0-1.el7.centos.x86_64.rpm
$ sudo systemctl start docker

バージョンを確認すると、ちゃんと1.7になっています。

$ sudo docker version
Client version: 1.7.0
Client API version: 1.19
Go version (client): go1.4.2
Git commit (client): 0baf609
OS/Arch (client): linux/amd64
Server version: 1.7.0
Server API version: 1.19
Go version (server): go1.4.2
Git commit (server): 0baf609
OS/Arch (server): linux/amd64

ZFS storage driverを有効にする

一旦Dockerをサービス停止します。

$ sudo systemctl stop docker

ZFSをインストールします。

$ sudo yum localinstall --nogpgcheck https://download.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm
$ sudo yum localinstall --nogpgcheck http://archive.zfsonlinux.org/epel/zfs-release.el7.noarch.rpm
$ sudo yum install kernel-devel zfs

ZFSストレージプールを作るためのファイルをddコマンドで作成します。

$ dd if=/dev/zero of=/tmp/disk.img bs=1024 count=1048576

そしてZFSストレージプールを作ります。

$ sudo zpool create zroot /tmp/disk.img

すでにある/var/lib/dockerを退避し、ZFSファイルシステムとしてマウントします。

$ sudo mv /var/lib/docker /var/lib/docker.org
$ sudo zfs create zroot/docker -o mountpoint=/var/lib/docker

Dockerをサービス開始します。

$ sudo systemctl start docker

そしてdocker infoで確認すると、Storage Driverがzfsになっています!

$ sudo docker info
Containers: 0
Images: 0
Storage Driver: zfs
 Zpool: zroot
 Zpool Health: ONLINE
 Parent Dataset: zroot/docker
 Space Used By Parent: 19456
 Space Available: 1031696896
 Parent Quota: no
 Compression: off
Execution Driver: native-0.2
Logging Driver: json-file
Kernel Version: 3.10.0-229.7.2.el7.x86_64
Operating System: CentOS Linux 7 (Core)
CPUs: 1
Total Memory: 992.1 MiB
Name: ip-172-31-4-69.ap-northeast-1.compute.internal
ID: YCQE:I6Z3:XBRR:5X6N:GKPA:UTRY:NBLN:WAII:7UGN:PC7Y:SR26:LIQG

当然Dockerコンテナも普通に起動します。

$ sudo docker run busybox echo "Running on ZFS"
Running on ZFS

ZFSのスナップショットを試してみる

ZFSなので/var/lib/dockerを丸ごとスナップショットとして取得することができます。

$ sudo zfs snapshot zroot/docker@20150626

もう一度Dockerコンテナを起動します。

$ sudo docker run busybox echo "Second running"
Second running

すると、起動済みのDockerコンテナが2つあることがわかります。

$ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS                     PORTS               NAMES
058e3103f2b0        busybox             "echo 'Second runnin   9 seconds ago       Exited (0) 9 seconds ago                       happy_lumiere
591d8d47e8ce        busybox             "echo 'Running on ZF   2 minutes ago       Exited (0) 2 minutes ago                       focused_bohr

では先ほど取得したZFSスナップショットでロールバックしてみます。ロールバック後はDockerサービスを再起動します。

$ sudo zfs rollback zroot/docker@20150626
$ sudo systemctl restart docker

再度確認すると、スナップショット取得後に起動したDockerコンテナが無くなっていることがわかります!

$ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS                     PORTS               NAMES
591d8d47e8ce        busybox             "echo 'Running on ZF   4 minutes ago       Exited (0) 4 minutes ago                       focused_bohr

さいごに

今回はZFSプールをファイルで作成しましたが、EBSをRAID構成にしてZFSプールにすれば信頼性も向上しますし、ZFSスナップショット機能によってDocker環境のみのバックアップとリストアが可能になります。便利ですね!