【Dockerの最新機能を使ってみよう】Dockerのボリュームプラグインとストレージドライバについて知る 2ページ
Dockerが使用するストレージへのアクセスを提供する「ストレージドライバ」
続いて、ストレージドライバについて説明していこう。前述のとおり、ストレージドライバはDockerがイメージを管理するために使用する機構だ。Docker 1.10では、表1の6つのストレージドライバが提供されている。
ドライバ名 | 使用するストレージ |
---|---|
overlay | OverlayFS |
aufs | AUFS |
btrfs | Btrfs |
devicemapper | Device Mapper |
vfs | VFS(イメージの差分管理を行わない) |
zfs | ZFS |
1つのホスト上では1つのドライバしか利用できない。つまり、コンテナ毎に異なるストレージドライバを使うことはできない。現在使用されているドライバは「docker info」コマンドで確認できる。下記の例ではdevicemapperドライバが使われていることが分かる。
# docker info : : Storage Driver: devicemapper Pool Name: docker-253:0-223022-pool Pool Blocksize: 65.54 kB Base Device Size: 10.74 GB Backing Filesystem: xfs Data file: /dev/loop0 Metadata file: /dev/loop1 Data Space Used: 1.086 GB Data Space Total: 107.4 GB Data Space Available: 14.11 GB Metadata Space Used: 2.843 MB Metadata Space Total: 2.147 GB Metadata Space Available: 2.145 GB Udev Sync Supported: true Deferred Removal Enabled: false Deferred Deletion Enabled: false Deferred Deleted Device Count: 0 Data loop file: /var/lib/docker/devicemapper/devicemapper/data WARNING: Usage of loopback devices is strongly discouraged for production use. Either use `--storage-opt dm.thinpooldev` or use `--storage-opt dm.no_warn_on_loop_devices=true` to suppress this warning. Metadata loop file: /var/lib/docker/devicemapper/devicemapper/metadata Library Version: 1.02.109 (2015-09-22) Execution Driver: native-0.2 : :
btrfsやzfsはそれぞれbtrfs、ZFS専用で、他のファイルシステムでは利用できない。逆にoverlayはbtrfsやAUFS、ZFS上、aufsはbtrfsおよびAUFS上では利用できないという制約がある。さらに、AUFSやZFSはLinuxカーネルでは標準サポートされておらず、利用のためには別途カーネルモジュールなどを用意する必要がある。Ubuntuなど一部のディストリビューションではこれらモジュールが標準で利用できるが、そうでないディストリビューションもあるため注意が必要だ。たとえばFedoraやRed Hat Enterprise Linux(RHEL)、CentOSではAUFSについて標準ではサポートされていない。
使用するドライバはdocker daemon実行時の「–storage-driver=<ドライバ名>」引数で指定できる。また、ディストリビューションによっては別途特別な設定ツールが用意されている場合がある。たとえばRed Hat Enterprise Linux/CentOS/Fedoraでは「docker-storage-setup」というツールが用意されており、devicemapperおよびoverlayドライバを利用するための設定を自動的に行えるようになっている。
なお、Docker公式ドキュメントの「Select a storage driver」ページによると、「production-ready」(実運用環境で利用可能な段階)となっているのはaufsとdevicemapperのみとされている。overlayドライバおよびzfs(ZFS FUSE経由での利用)については「stable」(安定)となっているが、まだテスト・検証向けという段階のようだ(表2)。
ドライバ名 | Linuxカーネルでの標準サポート | 実運用環境での利用 | 安定度 | 適した用途 | 適さない用途 |
---|---|---|---|---|---|
aufs | なし | ○ | 安定 | PaaS等での利用 | 書き込み頻度の高いもの |
devicemapper(loopback利用) | あり | × | 安定 | 研究/テスト | パフォーマンスが要求されるもの |
devicemapper(LVM利用) | あり | ○ | 安定 | – | PaaS等での利用 |
brtfs | あり | × | × | ビルドプール | 書き込み頻度が高いもの、コンテナの頻繁な操作 |
overlay | あり | × | 安定 | 研究/テスト | コンテナの頻繁な操作 |
zfs(ZFS on Linux利用) | なし | × | × | PaaS等での利用 | |
zfs(FUSE利用) | なし | × | 安定 | 研究/テスト |
overlayドライバを利用してみる
前述のように、現時点で実運用環境向けに推奨されているドライバはaufsおよびdevicemapperのみだ。そのためUbuntuではaufsが、Red Hat Enterprise LinuxやCentOS、Fedoraではdevicemapperがデフォルトのストレージドライバになっている。いっぽう、よりパフォーマンスの良いドライバとして注目されているのがoverlayドライバだ。ovarlayドライバはほかのドライバと比較してコンテナの起動/停止時のパフォーマンスが優れていると言われている。overlayドライバは実運用環境向けではないというステータスだが、テスト環境などでの利用においては十分安定しているようだ。そこで、以下ではこのoverlayドライバを利用するための設定を紹介する。
まずRed Hat Enterprise Linux/CentOS/Fedora環境のデフォルト設定ではストレージドライバとしてdevicemapperが利用されるが、overlayドライバも標準でサポートされており、簡単な設定で利用が可能だ。まず、/etc/sysconfig/docker-storage-setupファイル内に下記の1行を追加する。
STORAGE_DRIVER=overlay
続いて「docker-storage-setup」コマンドを実行すると、各種設定が自動的に変更される。
# docker-storage-setup
また、現時点ではoverlayドライバはSELinuxが有効だと正しく動作しない。SELinuxを「Permissive」設定にする(「setenfoce」コマンドで0に設定する)のではなく完全に無効にする必要があるため、/etc/sysconfig/selinuxファイル内の「SELINUX=」部分を次のように修正して再起動しておく。
SELINUX=disabled
以上が完了した状態でdockerサービスを起動すると、overlayドライバが利用されるようになる。
また、Ubuntuでは/etc/default/dockerファイル内の「DOCKER_OPTS」変数でDockerデーモンに与えるオプションを指定できるので、ここで下記のように「–storage-driver=」オプションを追加すれば良い。
DOCKER_OPTS="--storage-driver=overlay"
続いてDockerサービスを再起動すると、overlayドライバが利用されるようになる。
systemctl restart docker.service
どちらも場合も、Dockerの再起動後は「docker info」コマンドでoverlayドライバが利用されているかを確認しておこう。
# docker info : : Storage Driver: overlay Backing Filesystem: extfs : :
着実に進化したDockerのストレージ関連機構
かつてのDockerにおいてはボリュームの管理方法等がやや不明確であったが、ボリュームプラグインの導入と「docker volume」コマンドの導入によって管理が容易になっている。また、複数のDockerホストを組み合わせた環境においては、プラグインを利用してネットワーク経由でアクセスできるストレージをボリュームとして利用することで、Dockerのみで簡単に異なるDockerホスト上にあるコンテナ間でボリュームを共有できるようになっている。これによって、より容易に複数のDockerホストを組み合わせたクラスタ環境を構築できるようになる。
またストレージドライバについては、一部はまだ開発途上の技術ではあるものの、overlayドライバを実際に利用してみると、確かにコンテナの起動や削除などが高速になったように感じられた。まだ実運用環境にはおすすめできないというステータスではあるが、テスト環境等、万が一トラブルが発生したとしても影響が少ない用途では試してみる価値はあるだろう。