K2NR.ME

このエントリーをはてなブックマークに追加 Tweet

dokkuのつらいところとつかいどころ

最近dockerの事ばかり考えてます。タイトルが言いたかっただけなので以下蛇足なのですが本文を書きます。

dokkuという、dockerによるOSSのherokuライクなPaaS実装があります。ここ数ヶ月くらい主に業務でdokkuを実際に使いまくってたんですが、すごい便利だなと思う反面トラップがそこかしこに仕掛けられてはまりまくってたのでここにまとめます。

dokkuとは

githubの「Docker powered mini-Heroku in around 100 lines of Bash」っていうのが分かりやすくていいですね。実際には主な構成要素は

になってて、git pushされるとbuildstepコンテナを起動してその中でheroku buildpackを使ってビルドを実行、アプリを起動、nginxにサブドメイン追加してupstream登録みたいな流れです

つらいところ

スケールアウトできない

dokkuのREADMEにも記載があるんですが、スケールアウトするようなクラスタ構成にはできません。つらいところというか、だからこそシンプルなしくみでPaaSが実現できてるわけだし、dokkuが想定してる範囲内で使いましょうという話です。

プラグインが不安定

プラグインのリストがあるんですが、この中のどれだけが今でもまともに動くのか。

一番つらかったのはMySQLのプラグインが動かなかったことですね。dokku単体ではアプリからDBが使えるようにはなってないのでプラグインを導入する必要があるのですが、少なくとも上記のリストには(現時点でも)動作するMySQLプラグインはありません。

これからdokkuでMySQL使うという人は僕がforkしたmysqlプラグインを使うことをおすすめします。

https://github.com/k2nr/dokku-mysql-plugin

APIがない

dokkuのコマンドをAPI的に使うときはdokkuが動いているホストにsshしてdokku ...というコマンドを実行するしかありません。 そのコマンドもあまり充実してなくて、例えばアプリの一覧を取得するAPIはありません(/home/dokku/以下のディレクトリがアプリ名になってるのでls -d /home/dokku/*/とかやれば一応取得できます)

たまにエラー出て失敗する

こんなエラーです。本当によく出ました。

curl --fail --retry 3 --retry-delay 1 --connect-timeout 3 --max-time 30 https://s3-external-1.amazonaws.com/heroku-buildpack-ruby/ruby-2.0.0-p481-default-cache.tgz

これ実際はdokkuのエラーではなくheroku buildpackが出してるエラーなんで別にdokkuは悪くないんですが。

原因はバイナリをダウンロードする際にcurlがタイムアウトすることです。多分東京リージョンでdokku動かしてると出やすいのかな。

対策するにはuser-env-compileプラグインを導入して、ビルド時にCURL_TIMEOUTCURL_CONNECT_TIMEOUTを長めに設定すればいいです。

デプロイ時にダウンタイムがある

すでに動いてるアプリをアップデートするとき、デプロイ開始から完了までの間502 bad gatewayになります。と書いてたら、どうやら最新のdokkuではゼロダウンタイムのパッチがマージされたみたいで、最新のdokkuならゼロダウンタイムでデプロイできるかもしれません(試してません)

つかいどころ

スケールアウトできない性質上、プロダクションで使うわけにはいかないでしょうから

くらいに用途は限られそうです。heroku使えばいいじゃんというのはまあ、あるんですが、herokuでは実現が難しいこともdokku使えば(カスタマイズすれば)なんでもできてしまうので、場合によってはherokuよりも現実的な選択肢です。(プライベートネットワーク内にPaaSが欲しいとか、herokuなら有料になってしまうような構成を実現するとか、マイナーなデータストア使いたいとか、etc)

comments powered by Disqus