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-driver
を devicemapper
から 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-driver
が devicemapper
から 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