dokkuのつらいところとつかいどころ
最近dockerの事ばかり考えてます。タイトルが言いたかっただけなので以下蛇足なのですが本文を書きます。
dokkuという、dockerによるOSSのherokuライクなPaaS実装があります。ここ数ヶ月くらい主に業務でdokkuを実際に使いまくってたんですが、すごい便利だなと思う反面トラップがそこかしこに仕掛けられてはまりまくってたのでここにまとめます。
dokkuとは
githubの「Docker powered mini-Heroku in around 100 lines of Bash」っていうのが分かりやすくていいですね。実際には主な構成要素は
- nginx
- docker
- git
- buildstep
- その他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_TIMEOUT
とCURL_CONNECT_TIMEOUT
を長めに設定すればいいです。
デプロイ時にダウンタイムがある
すでに動いてるアプリをアップデートするとき、デプロイ開始から完了までの間502 bad gateway
になります。と書いてたら、どうやら最新のdokkuではゼロダウンタイムのパッチがマージされたみたいで、最新のdokkuならゼロダウンタイムでデプロイできるかもしれません(試してません)
つかいどころ
スケールアウトできない性質上、プロダクションで使うわけにはいかないでしょうから
- 開発用の環境
- スケールアウトを考えるまでもないちょっとしたwebアプリ
くらいに用途は限られそうです。heroku使えばいいじゃんというのはまあ、あるんですが、herokuでは実現が難しいこともdokku使えば(カスタマイズすれば)なんでもできてしまうので、場合によってはherokuよりも現実的な選択肢です。(プライベートネットワーク内にPaaSが欲しいとか、herokuなら有料になってしまうような構成を実現するとか、マイナーなデータストア使いたいとか、etc)