Heroku Meetup #12でLTしてきた+Heroku on Docker

“Go Web ApplicationをHerokuにデプロイ + Heroku on Docker #herokujp”

Heroku Meetup #12でLTをしてきた.MartiniをつかったGo Web ApplicationをHerokuにぶっ込んでみたという内容で,基本は“Martini(+Ginkgo)をWerckerでCIしてHerokuにデプロイ”が基になっている.

せっかく最近Dockerを使っているので,HerokuとDockerを絡めた話がしたいなと思い,“building”を使ってDocker Container上にHerokuと同じ環境を作るという話を追加した.以下はその補足.

Heroku on Docker

Heroku on Docker | CenturyLink Labs

CenturyLink Labsが開発した“building”というツールを使えば,Herokuのbuildpackを使うアプケーション用のコンテナを簡単に立ち上げることができる.つまり,ローカルで気軽にHerokuと同様の環境をつくることができる.

似たようなツールに“dokku”というツールがある.dokkuはbuildpackとDockerを使ってmini Herokuを作ることができるツール.dokkuを立てたサーバに対してアプリケーションをgit pushすると,新しくDockerコンテナが起動し,アプリケーションのビルドが行われる(“Inside Dokku in 5 minutes”が詳しい).

buildingは,dokkuをシンプルにしたツール.カレントディレクトリのアプリケーションをdokkuのbuildstepというスクリプトを使ってビルドしたDockerイメージをつくり,それを使ってコンテナを立ち上げるということをやってくれる.dokkuのようにサーバを立ててssh鍵を通すといった設定なしで使える.

buildingはdokkuをカジュアルに使えるようにしたツールであると言える.

buildingの使いどころ

以下のような場合に使える.

  • ローカルにHerokuと同じ環境をつくりたい
  • Cleanな環境でHerokuアプリケーションをビルドしたい
  • buildpackのテストをしたい

buildingはHeroku同様にThird partyのbuildpackの追加も可能なので,それがちゃんと動作するかをテストすることもできる.

buildingを動かす

まず,インストール.Rubygemsとして配布されている.

$ gem install building

あとは,動かしたHerokuアプリケーション(Rails,Node,HHVM,WordPress,Go)のディレクトリ内で以下を実行するだけ.

$ building -p 3000 tcnksm/app

-pで解放したいポート番号を指定する.tcnksm/appは作成したいDockerイメージ名.

これだけで,

  • 専用のDockerfileの作成
  • イメージのビルド
  • コンテナの起動

をやってくれ,ローカルにHerokuと同じ環境でアプリケーションが立ち上がる.

buildingの動作

buildingがつくるDockerfileは以下のような感じ.

FROM ctlc/buildstep:ubuntu13.10

ADD . /app
RUN /build/builder
CMD /start web

たいしたことはしていない.カレントディレクトリのアプリケーションをADDしてそれに対して,builderというコマンドを実行しているだけ.

builderはctlc/buildstep:ubuntu13.10イメージに含まれており,dokkuのbuildstepというスクリプトの一部.これがアプリケーションの言語を判断し,その言語のBuildpackを使ってアプリケーションのビルドを行う.

まとめ

ctlc/buildstep:ubuntu13.10という肝となるDockerイメージがあり,それの立ち上げ等を支援するというbuildingは新しいアプリケーションの形であるなあと思った.

最後に,Heroku Meetupで発表する機会を与えてくださった@ayuminさん,ありがとうございました.がちゃぴん先生のLXCの話もとても面白く勉強になりました.

参考