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の話もとても面白く勉強になりました.