ZFS はかつて Sun Microsystems社(現Oracle社)によって開発され、現在は CDDL というライセンスでオープンソース化されているファイルシステムです。CDDL は Linux の GPL ライセンスと互換性がないため、ZFS は Linux カーネル・モジュールのメインラインに取り込まれません。しかし、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で使えるのか...