俺のブログサーバーのdockerのstorageをLVMベースに変更した件。

Linux

性能改善しましたよ。dockerのストレージをloopback sparseファイルから、LVMベースにマイグレートしてみました。

ってゆっか、罠なんですよ。see /etc/sysconfig/docker-storage(※CentOS 6の場合)

# By default, Docker uses a loopback-mounted sparse file in
# /var/lib/docker.  The loopback makes it slower, and there are some
# restrictive defaults, such as 100GB max storage.

え?え?なんて?って、8.6秒バズーカ並のツッコミを入れたくなる内容がしれっと書いてあります。遅いんだよね。ははは。って。

しかも起動時に、こんなこと言ってくるし。

WARNING: You are running linux kernel version 2.6.32-431.17.1.el6.x86_64, which might be unstable running docker. Please upgrade your kernel to 3.8.0.

だったらfirewalldともっと仲良くしろよ、って言いたいんですが・・・。何この俺様感。

それは置いておいて。公式ドキュメントやネット上の幾つかの検証でも、LVMにすることでかなり速くなるっぽいことが書いてあったので、手順検証してマイグレートしてみました。普通に考えて、ストレージイメージはやっぱりブロックデバイスだよなぁ、って思うし。ちなみに、性能的にはoverlayfsやbtrfs辺りが速そうなんですが、そこまではチャレンジしていません。それこそカーネルが対応していればやってみたいかな。あとbtrfsはまだ普及期じゃないかな、とも思います。

手順は簡単。

  • docker exportで必要なコンテナのイメージを取得
  • LVM領域を作成
  • dockerを再起動して、空のLVMストレージデバイスをつかませる
  • docker importでコンテナのイメージを読み込み
  • docker runでコンテナ起動

ついでに、今回、dockerホストの再起動等でもサービスが自動的に起動してくるように、restartポリシーを付けてdocker runしています。これが正しいサービスの永続化手法なのかどうか分かりませんが、systemdやrcからコンテナを起こすのは「美しくない」と思いましたし。libvertのautostartも、一応「起こしてくれることは起こしてくれる」レベルなので、まぁそこはそんなもんでしょう、と。

まずはexportで必要なコンテナのイメージをエクスポートします。大事なこと。exportの対象はcontainerで、importされる先はimageです。なので、exportするために、commitする必要はありません。

docker export php-fpm.home | gzip > centos7_php7-fpm.tgz

これで、tar(gz)アーカイブにイメージのツリーが保存されます。ただのtarアーカイブです。必要なコンテナについて、これを繰り返して、当方では5個のイメージを収集しました。

dockerストレージ領域は–thinオプション(-T)を付けて作ります。今回は軽く24GBです。

lvcreate -L24G -T -n dockerdata vg_disk1

そうすると、こんな感じでThinpoolが出来ます。

[root@~]# lvs
  LV         VG             Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  dockerdata vg_disk1       twi-a-tz-- 24.00g             0.00   0.54
  lv_disk1   vg_disk1       -wi-ao---- 64.00g

そしたら、dockerサービスを徐ろに停止します。

/etc/init.d/service stop

ここからサービス断です。dockerの設定を変更します。

ここでまた罠というか、なんというか・・・。CentOS 6だと、ストレージオプションの指定は/etc/sysconfig/dockerです。docker-storageってファイルがあるんですが、これをどこからも参照していません(私がfind/grepした限り)。docker-storageのDOCKER_STORAGE_OPTIONSが効きそうなところですが、効かないので、/ets/sysconfig/dockerのother_argsでstorage optionを追加します。

【2016/6/1追記】このファイルはdocker-storage-setupスクリプトが使っているか作っているかしています。CentOS7ではこれが使えた記憶が・・・。

other_args="--storage-driver=devicemapper --storage-opt dm.thinpooldev=vg_disk1-dockerdata"

ちなみに、私が一瞬、ハマったポイントとしては、この「storage-driver」の指定をしないと、「dm.thinpooldevなんて知るか」と言われて、もしやdockerのバージョンが低くてthinpoolに対応していない!?と焦ることになります(焦りました)。いや、loopback sparseでもstorage driverは「devicemapper」なので、デフォルトで通るよね、と思うと、通りません。ちゃんと指定しましょう。

続いて/var/lib/dockerを移動なり削除するなりして、空ディレクトリにします。

その後、普通に起動すると、もうストレージ切り替わってます。

/etc/init.d/docker start

変わったかどうかは、docker infoで分かります。変更前。

Containers: 5
Images: 66
Storage Driver: devicemapper
 Pool Name: docker-253:2-852770-pool
 Pool Blocksize: 65.54 kB
 Backing Filesystem: extfs
 Data file: /dev/loop0
 Metadata file: /dev/loop1
 Data Space Used: 15.23 GB
 Data Space Total: 107.4 GB
 Data Space Available: 43.28 GB
 Metadata Space Used: 13.57 MB
 Metadata Space Total: 2.147 GB
 Metadata Space Available: 2.134 GB
...

変更後はこうなる。

Containers: 0
Images: 0
Storage Driver: devicemapper
 Pool Name: vg_disk1-dockerdata
 Pool Blocksize: 65.54 kB
 Backing Filesystem: extfs
 Data file:
 Metadata file:
 Data Space Used: 305.7 MB
 Data Space Total: 25.77 GB
 Data Space Available: 25.46 GB
 Metadata Space Used: 282.6 kB
 Metadata Space Total: 25.17 MB
 Metadata Space Available: 24.88 MB
...

ここまでくればあとはイメージを戻してコンテナ起動するだけです。

gunzip -c centos7_php7-fpm.tgz | docker import - centos7/php7-fpm
docker run -d -h php-fpm.home --name php-fpm.home -v /share/www/html:/var/www/html -v /share/php-fpm.home/var/log:/var/log -v /share/socks:/socks --link mariadb.home:mariadb.home --restart=on-failure:5 centos7/php7-fpm /usr/sbin/php-fpm --nodaemonize

一応、linkの指定等している場合は起動順があります。一応。restartポリシーはここで指定します。こうすることで、例えば、dockerサービス停止、起動した場合に、もともと起動していたコンテナは異常終了状態になるため、自動的に起動してきます。dockerのバージョンが新しいと、また別のポリシーもあるようですが(–restart=unless-stopped辺り)、これで再起動はしてくれるので、まずはこれで様子を見るかな、と。

無事、LVSが消費されているのが分かります。

  LV         VG             Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  dockerdata vg_disk1       twi-aotz-- 24.00g             16.41  10.48
  lv_disk1   vg_disk1       -wi-ao---- 64.00g

lsblkでもブロックデバイスのアサイン状況が見れます。

さて、これでどれくらい速くなったか、ですが、まだ実感はしていないところです。ただ、loopbackデバイスを使っていると、ちょっとファイル操作しただけでもdockerコンテナが「固まる」感覚があったのが低減されているように感じます。あくまで、主観的に。これは別に確認しようかな、と思っています。

まずは、懸念だったloopbackデバイスを脱却できて良かったです。やっぱりファイルシステムはブロックデバイス、だよねぇ、と。

コメント

タイトルとURLをコピーしました