dshimizu/blog

アルファ版

Ubuntu 16.04 LTS で Docker の ZFS Storage Driver を試す

ZFS はかつて Sun Microsystems社(現Oracle社)によって開発され、現在は CDDL というライセンスでオープンソース化されているファイルシステムです。CDDL は LinuxGPL ライセンスと互換性がないため、ZFSLinux カーネル・モジュールのメインラインに取り込まれません。しかし、ZFS on Linux (ZoL)プロジェクトにより、外部モジュールとしてインストールことで利用できるようになっています。

以前に ZFS on Ubuntu 16.04 LTS な環境を作成していたので、この環境で Docker の ZFS Storage Dviver を試してみました。

Docker の ZFS Storage Driver を使う設定

環境

試した時のOS, ZFS on Linux, Docker のバージョン情報は以下です。

OS Ubuntu 16.04 LTS
Docker docker-ce 17.03.1~ce-0~ubuntu-xenial
ZFS on Linux zfsutils-linux 0.6.5.6 (Ubuntu 標準パッケージ)

ZFS ストレージプールは以下のような状態です。 50Gの仮想ディスクを全てZFSストレージプールに割り当てています。

# zpool list
NAME    SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
rpool  49.8G  1.75G  48.0G         -     8%     3%  1.00x  ONLINE  -
# zpool status -v rpool
  pool: rpool
 state: ONLINE
  scan: scrub repaired 0 in 0h0m with 0 errors on Sun Apr  9 00:24:16 2017
config:

        NAME        STATE     READ WRITE CKSUM
        rpool       ONLINE       0     0     0
          vda1      ONLINE       0     0     0

errors: No known data errors

ZFSのデータセット(ファイルシステム等)は以下のような状態です。

# zfs list
NAME                USED  AVAIL  REFER  MOUNTPOINT
rpool              1.76G  46.4G    96K  none
rpool/ROOT         1.76G  46.4G    96K  legacy
rpool/ROOT/ubuntu  1.76G  46.4G  1.76G  /

Docker ZFS Storage Driver設定

まずはじめにdocker用のZFSファイルシステムを作成します。 rpool/ROOT/docker というデータセット/var/lib/docker にマウントする、という設定です。各名称は環境に応じて置き換えてください。 正常に終了した場合は特に何も出力はありません。

# zfs create -o mountpoint=/var/lib/docker rpool/ROOT/docker

ZFSファイルシステムの状態を確認します。 rpool/ROOT/docker というデータセットが追加されています。

root@www4242gi:~# zfs list
NAME                USED  AVAIL  REFER  MOUNTPOINT
rpool              1.76G  46.4G    96K  none
rpool/ROOT         1.76G  46.4G    96K  legacy
rpool/ROOT/docker    96K  46.4G    96K  /var/lib/docker
rpool/ROOT/ubuntu  1.76G  46.4G  1.76G  /

マウントを確認します。 /var/lib/docker が追加されています。

# df -h
Filesystem         Size  Used Avail Use% Mounted on
udev               982M     0  982M   0% /dev
tmpfs              201M  3.0M  198M   2% /run
rpool/ROOT/ubuntu   49G  1.8G   47G   4% /
tmpfs             1001M     0 1001M   0% /dev/shm
tmpfs              5.0M     0  5.0M   0% /run/lock
tmpfs             1001M     0 1001M   0% /sys/fs/cgroup
rpool/ROOT/docker   47G  128K   47G   1% /var/lib/docker

Dockerのインストール

公式手順に沿って docker をインストールします。

Dockerのリポジトリ追加のためのGPG公開鍵を取得します。

# curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -

リポジトリを設定します。

# add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"

パッケージをインストールします。

# apt-get update
# apt-get install docker-ce

/etc/default/dockerに以下のオプション設定を追加します。

DOCKER_OPTS="-s zfs --storage-opt zfs.fsname=rpool/ROOT/docker"

Dockerサービスを起動します。

# systemctl start docker

Storage Driver が ZFS となっていることを確認します。

# docker info
:
Storage Driver: zfs
 Zpool: rpool
 Zpool Health: ONLINE
 Parent Dataset: rpool/ROOT/docker
 Space Used By Parent: 122880
 Space Available: 49847799808
 Parent Quota: no
 Compression: lz4
:

これで設定は完了です。

確認

適当にコンテナをインストールして立ち上げてみると以下のように変更を加えた分だけzfs snapshotが自動で作成されて差分管理されていることが確認できます。 従来の aufs だと /var/lib/docker/aufs/{diff,layers,mnt}で差分やメタデータ、コンテナのマウントなどが管理されていましたが、Storage Driverが変わったことで管理方法が変わっていることが確認できます。

コンテナをインストールした後のZFSのデータセット(ファイルシステム等)の状態

$ sudo zfs list -t snapshot
NAME                                                                                                USED  AVAIL  REFER  MOUNTPOINT
rpool/ROOT/docker/00b9ff93a429baacecbef7019b97d7da6d9a5d009de34b83108035142a1ad745@938599727           0      -   123M  -
rpool/ROOT/docker/00b9ff93a429baacecbef7019b97d7da6d9a5d009de34b83108035142a1ad745@446189193           0      -   123M  -
rpool/ROOT/docker/22119e6615c374c2b051ef2ec4fe00bb2ae8a058c37a6b2b9ea373d1ef7eb719@146404075           0      -   122M  -
rpool/ROOT/docker/225219b9b348c2df9ebde8ebfefff3debc5ddb975261a1d9b4c7b6f3d37d2fe0-init@851168268      0      -   431M  -
rpool/ROOT/docker/4130c95b2e1697cf40b76b39e386e50bb8452277c4a99aed51bad2a4a8dee0d7@255180764           0      -   322M  -
rpool/ROOT/docker/65f1cc11395cd9cf7cc4be47691b322488d679221d05cc1be4d67af9fc7399f7@750276851           0      -   143M  -
rpool/ROOT/docker/6fab13b404736526703d2a4c26dff4ca35397bec23ee317cd912fa7d658fb6b1@750641577           0      -   431M  -
rpool/ROOT/docker/741717566de2684b047f0b66153aaad73928e196b2ea7e1fecc13170de63ab7b@781729949           0      -   143M  -
rpool/ROOT/docker/9aeb536e269ff58d5c0cb3c61baf4ffe64298059496b5c241eaf5298fb611d39-init@362220662      0      -   143M  -
rpool/ROOT/docker/9eab88da0c84800fc44ab80da5983f4f1c1201f44b63bd4f12a26db4af443a79@788361781           0      -   322M  -
rpool/ROOT/docker/b192ed7e72c933114530fa4c93754856380b8c25b1ea68915de27c5b8c85ca2b@377158498           0      -   431M  -
rpool/ROOT/docker/bd40b62d5cc3696c4f27e50c45317d3a5102dc0c2c806830e81fccfea918440a@112467486           0      -   431M  -
rpool/ROOT/docker/d0b5c3c50f6abcf891270fdb439756387ed1a4cb5949f6c14e345846d75e656a@229228012           0      -   126M  -
rpool/ROOT/docker/d1e6bccb690236e83a64072f93aa2be22cab01eacf048ebc5c436326b1be5a23@366231673           0      -   143M  -
rpool/ROOT/docker/df4241d5b1fb552c3ba2cb35914fe32861a46a8a3ba5468b94caa16668fd049f@39803025            0      -   122M  -
rpool/ROOT/docker/e64b1882877ab43170fae3ad7e407e3da17c599d5a544f448191431c96658116@446526209           0      -   126M  -
rpool/ROOT/docker/f17c96a2644a63f37d3ec9de37020e2c690dd28638562856ab3a10badb27165b@167335386           0      -   122M  -
rpool/ROOT/docker/f604d324b0f148a1ce494727b424eb2670387d13e48d8c104990e2a1e493f650@849196370           0      -   143M  -
rpool/ROOT/docker/fde4c9a9788fa76c2457924947c73538ad5db740998e75ca9a8f35b7a7b7aa96@229010432           0      -   431M  -

まとめ

いろいろ便利ではある気はするがProductionで使えるのか...