この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
はじめに
Docker 1.7がリリースされましたね!
また新たな機能がたくさん追加されていますが、そのなかでも僕が一番興味を持ったのは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環境のみのバックアップとリストアが可能になります。便利ですね!