- 2013-12-08 (日) 17:00
- Advent Calendar 2013 | Docker | unix | Web+DB
Shin x blog Advent Calendar 2013 の 8 日目です。
これまで Docker を RHEL/CentOS で動かす際に懸案だったのは、AUFS への対応でした。RHEL/CentOS 6.x のカーネルは AUFS へ対応していないので、Docker を動かすには、AUFS 対応のカーネルを入れる必要がありました。
Docker 0.7 では、この対応としてストレージドライバという機構が採用されました。
ここでは、ストレージドライバによる RHEL/CentOS 対応について見てみます。
CentOS 6.5 で利用されているストレージドライバ
Docker 0.7 で採用されたストレージドライバは、Docker コンテナが利用するファイルシステムを選択する機構です。これにより、AUFS 以外のファイルシステムを利用ことが可能になっています。0.7 では、aufs / devicemapper / vfs の 3 つのドライバーが存在します。
この中で、RHEL/CentOS では devicemapper というドライバが利用されています。
どのドライバが利用されているかを確認するのには、docker info コマンドを実行します。
CentOS 6.5 で docker info コマンドで確認すると下記のようになります。Driver: の箇所が devicemapper と表示されており、これがドライバとして利用されているのが分かります。
[vagrant@localhost ~]$ sudo docker info Containers: 47 Images: 24 Driver: devicemapper // <---- Pool Name: docker-253:0-1835642-pool Data file: /var/lib/docker/devicemapper/devicemapper/data Metadata file: /var/lib/docker/devicemapper/devicemapper/metadata Data Space Used: 1790.1 Mb Data Space Total: 102400.0 Mb Metadata Space Used: 4.7 Mb Metadata Space Total: 2048.0 Mb
ちなみに ubuntu 上で docker info を実行すると、こちらは aufs と表示されます。
vagrant@precise64:~$ sudo docker info Containers: 2 Images: 1 Driver: aufs Root Dir: /var/lib/docker/aufs Dirs: 5 WARNING: No swap limit support
AUFS 以外のストレージドライバ採用の経緯
AUFS 以外のストレージドライバとして何を利用するかの経緯については、community.redhat.com にエントリがあります。
Adventures in Dockerland | Open Source Community
まず、AUFS について。AUFS は、現在の Ubuntu カーネルでは非推奨となっていて、いずれは削除されるようです。
このため、RHEL/CentOS 対応を行うかどうかに関わらず、AUFS 以外のストレージドライバへの対応が必要だったように思います。
そして、AUFS に変わるコピーオンライトなストレージとして、下記の 4 つが検討されていました。
- overlayfs
- btrfs
- lvm snapshots
- lvm thin provisioning
結果的には、最後の lvm thin provisioning が採用されており、devicemapper ドライバとして実装されています。こうして RHEL/CentOS でも Docker が利用できるようになりました。
件のエントリでは、それぞれの方法についての考察なども書かれていますので、気になる方は読んで見てください。
CentOS 6.4 で Docker を動かす
Docker 0.7 で対応した lvm thin provisioning は、RHEL/CentOS 6.4 からサポートされているので、CentOS 6.4 環境でも Docker が動きそうです。
そこで、Vagrant 上の CentOS 6.4 でも試してみました。インストール方法などは前エントリのままです。
$ cat /etc/redhat-release CentOS release 6.4 (Final) $ sudo docker run -i -t centos /bin/bash bash-4.1# $ sudo docker info Containers: 0 Images: 0 Driver: devicemapper Pool Name: docker-253:0-262375-pool Data file: /var/lib/docker/devicemapper/devicemapper/data Metadata file: /var/lib/docker/devicemapper/devicemapper/metadata Data Space Used: 291.5 Mb Data Space Total: 102400.0 Mb Metadata Space Used: 0.7 Mb Metadata Space Total: 2048.0 Mb
ちゃんと動いてますね。docker info コマンドでは、Driver は、ちゃんと devicemapper になっています。
CentOS 6.3 で Docker を動かない?
では逆に動かないところも見てみたいので、次は CentOS 6.3 でも試してみました。
適当な Box ファイルが手元に無かったので、AWS Marketplace にある CentOS 6.3 の AMI を使いました。
# cat /etc/redhat-release CentOS release 6.3 (Final) # docker run -i -t centos /bin/bash bash-4.1# # docker info Containers: 9 Images: 2 Driver: devicemapper Pool Name: docker-202:64-9417-pool Data file: /var/lib/docker/devicemapper/devicemapper/data Metadata file: /var/lib/docker/devicemapper/devicemapper/metadata Data Space Used: 858.7 Mb Data Space Total: 102400.0 Mb Metadata Space Used: 1.7 Mb Metadata Space Total: 2048.0 Mb
あれ?ちゃんと動いていますね。Driver も devicemapper になっています。コンテナ内で yum など使っていくつかパッケージをインストールしたり、docker commit でイメージを作ったりしましたが、正常に動いているようでした。
調べてみると、lvm thin provisioning は正式採用されたのは 6.4 ですが、6.3 の段階で Technology Preview として実装されていたようです。なるほど。
LVM の Thin Provisioning 型 LV とスナップショット利用
6.2 なら、Driver: vfs となり、違った挙動が見れるのかもしれません。
利用するストレージドライバの決定
Docker が環境に応じてどのようにストレージドライバを決定しているかを見てみました。
利用するストレージドライバの決定は、graphdriver/driver.go にある New メソッドにて行われます。下記が該当ソースです。
まず、環境変数やオプションによるドライバ指定を処理します。すでにドライバが指定されていれば、そのドライバを利用します。
その後に priority 変数の順に利用するドライバを決定します。それぞれのドライバが利用できるかチェックして、利用できるならば、それを使います。priority は、下記のように定義されているので、aufs / devicemapper / vfs の順でチェックが行われます。
このように通常、ストレージドライバは自動で決定されます。
一方、環境変数や -s オプションを使うことで利用するドライバを指定することも可能です。
下記では、docker コマンドに -s オプションに vfs を指定して、docker デーモンを起動しています。docker info を見ると vfs がドライバとして利用されていることが分かります。
$ sudo service docker stop # docker を一旦停止 $ sudo docker -d -s vfs # docker コマンドから、docker デーモンを起動 $ sudo docker info Containers: 0 Images: 0 Driver: vfs
さいごに
Docker 0.7 でサポートされたストレージドライバによる RHEL/CentOS サポートについて見てみました。
コピーオンライトなストレージは、Docker における重要な技術なので、今後もより良い環境を求めて、他のファイルシステムへの対応が進みそうです。
ここで見たようにストレージドライバに関しては RHEL/CentOS 6.4 環境でも動いているので、6.5 環境がまだ無い人は試してみて下さい。
参考
- Docker 0.7 runs on all Linux distributions – and 6 other major features | Docker Blog
- aufsRootFileSystemOnUsbFlash - Community Ubuntu Documentation