#chiroito ’s blog

Java を中心とした趣味の技術について

Docker でZFS をストレージとして使う

Docker のストレージドライバに ZFS 用のドライバがあると知り、家にある ZFS サーバを ZFS 兼 Docker サーバにしてみました。

参考:
docs.docker.com

環境

既存の環境の確認

ZFS は以下の通り storage という名前のプールで構築してあります。

[root ~]# zpool list
NAME      SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
storage   476G   20.0G   456G         -      -    4%  1.00x  ONLINE  -

[root ~]# zfs list
NAME             USED  AVAIL  REFER  MOUNTPOINT
storage         20.0G   441G   336K  /storage
storage/data    20.0G   441G  20.0G  /storage/data

Docker Machine を使ってインストールしたままなので、Docker のストレージドライバは devicemapper になっています。

[root ~]# docker info | grep "Storage Driver" | grep -v grep
Storage Driver: devicemapper

ZFS ドライバへの変更

Docker を止めてから作業をします。既に ZFS のマウント先のディレクトリがある場合は削除します。storage/dockerと言う名前で ZFSファイルシステムを作成し、/var/lib/docker へマウントします。Docker の実行時引数にある ---storage-driverdevicemapper から zfs へ変更すると作業は完了です。docker を起動しましょう。

[root ~]# systemctl stop docker
[root ~]# rm -fr /var/lib/docker
[root ~]# zfs create -o mountpoint=/var/lib/docker storage/docker
[root ~]# sed s/devicemapper/zfs/ /etc/systemd/system/docker.service > /etc/systemd/system/docker.service.new
[root ~]# mv -f /etc/systemd/system/docker.service.new /etc/systemd/system/docker.service
[root ~]# systemctl daemon-reload
[root ~]# systemctl start docker

ZFS ドライバを使っている確認

---storage-driverdevicemapper から zfs へ変更されたことを確認しましょう。

[root@home ~]# docker info | grep "Storage Driver" | grep -v grep
Storage Driver: zfs

以上で Docker から ZFS が使用できるようになります。

ダメだったこと

ZFS ファイルシステムのマウント先となる /var/lib/docker が空ではないのに消すのを忘れてしまいました。そのため、ファイルシステムは作成できましたがマウントできませんでした。 /var/lib/docker を削除し、マウントポンとが正しく設定されていることを確認してからマウントしましょう。

[root ~]# zfs create -o mountpoint=/var/lib/docker storage/docker
cannot mount '/var/lib/docker': directory is not empty
filesystem successfully created, but not mounted

[root ~]# rm -fr /var/lib/docker

[root ~]# zfs get mountpoint storage/docker
NAME            PROPERTY    VALUE            SOURCE
storage/docker  mountpoint  /var/lib/docker  local

[root ~]# zfs mount storage/docker