dokkuを普段持ち歩いてるMacbook AirのVirtualBoxのUbuntu12.04に入れた。

dokkuはDocker環境をセットアップしてくれて、そこに個人用のHerokuのようなものを建立してくれる。
dokku本体は100行ぐらいのshellscriptで実装されている。そこから作者のprogrium氏が作った色々なツールが呼び出されるので、実体としてはもっと大きいけど。

vagrantとかchefとか全く使わずに、アプリをgit pushするとVMが建つ環境が簡単に作れる。
gitのhookでdockerコンテナが作られて、フロントのnginxのproxyが設定されて、websocketも通る。
コンテナ構築にはherokuのbuildpackが使われているので、アプリの内容に応じて自動的にnodeとかrubyとかの環境がセットアップされる。
buildpackはherokuがアップデートしていってくれるから、今後RubyやNodeが新しくなっても良い感じにフォローしてくれて、楽できる。

家のMacMiniにも似たようなセットアップをして、自宅をmini heroku化もできた。そっちの設定はまたあとで書く。


参考になる


なんだかんだでぐぐる前にgithubにあるREADMEちゃんと読むのが一番参考になる


Ubuntuインストール

Mac OSX上のVirtualBoxに、ubuntu12.04 64bit serverを入れた。
あたらしくまっさらなUbuntuを用意する事が推奨されている。

2014年4月11日現在、ubuntu 13系+dockerの組み合わせでデッドロックしたりコンテナが止まらなかったりするらしい。

% sudo apt-get install openssh-server
% sudo apt-get install python-software-properties # 12.04だと必要

インストール時のオプションは全部デフォルトのままでよい。

自分のMacからは、Ubuntuが 192.168.56.103 として見えるようになった。(ホストオンリーアダプタを使っている)
普通にNATとかブリッジアダプタとかでもいいし、ネットワークは好きに設定すればいい。


なお起動する時にVirtualBoxのGUIからではなく、
% VBoxManage startvm "VM名" --type headless
で起動するとGUIなしでVMを起動できる。MacのLaunchDaemonに書けば便利


dokkuインストール

安定版を入れた。

Ubuntuで
% wget -qO- https://raw.github.com/progrium/dokku/v0.2.2/bootstrap.sh | sudo DOKKU_TAG=v0.2.2 bash
dokkuというユーザーが増えて、dockerやnginxなどが入る。


ssh鍵のインストール

ubuntuインストール時に作った普通のユーザーと、dokkuというユーザーそれぞれに同じ鍵をインストールした

Macから
% brew install ssh-copy-id
% ssh-copy-id -i ~/.ssh/id_rsa.pub sho@192.168.56.103

sshでubuntuに入ってから
% cat ~/.ssh/authorized_keys | sudo sshcommand acl-add dokku shokai
/home/dokku/.ssh/authorized_keys に書き込まれる。


ホスト名の設定

Ubuntuに /home/dokku/VHOST を作り、
dokku.192.168.56.103.xip.io
を書いた。

dokkuのnginxはリクエストのホスト名のサブドメイン部分でどのアプリケーションへのリクエストなのかを判別して振り分けるので、IPアドレスではなくドメイン名でアクセスできるようにしなければならない。

xip.ioを使うとサブドメイン部分をそのまま返してくれるのでLAN内のマシンにドメインが振られてるように見せかけられる。


ちゃんとグローバルIPでドメイン名ある環境だったら、xip.ioは必要ない。


デプロイする

試しにHerokuのnodejsサンプルをデプロイしてみる。

Macから
% git clone git@github.com:heroku/node-js-sample.git
% cd node-js-sample
% git remote add dokku dokku@dokku.192.168.56.103.xip.io:node—js-sample
これは
git remote add リモート名 dokku@ホスト名:アプリ名
という事。


git pushでデプロイする
% git push dokku master
すると、Herokuにデプロイした時と同じようにbuildpackがNode環境を作ってる様子が流れて、
http://node-js-sample.dokku.192.168.56.103.xip.io
で起動する。



試しにsocket.ioでwebsocketを使っているアプリもデプロイしてみたら、ちゃんとwebsocket proxy通った。

dockerを0.10から0.9に戻す

dokku v0.2.2は、docker 0.10だと動かない。
デプロイすると
Invalid namespace name (app), only [a-z0-9_]
というエラーがでて失敗する。

issueが立ってた。
Dokku 0.10.0: Pre-receive hook declined: Invalid namespace name (app) · Issue #533 · progrium/dokku
docker 0.10からnamespaceが4文字以上必要に変更されたが、dokku v0.2.2が作るコンテナはappというnamespaceを使おうとするので失敗する。

とりあえずdockerを0.9.0に落とせば動くので、Ubuntuで
% sudo apt-get remove --purge lxc-docker
% sudo apt-get install lxc-docker-0.9.0

これでMacからgit pushしなおしたらデプロイ通った。


コンテナの管理

dockerコマンドとdokkuコマンドを併用する。
詳しくはgithubのREADMEの下の方に書いてある

Ubuntuで
コンテナ一覧
% sudo docker ps

コンテナの削除。dokkuでの名前で指定して削除する
% sudo dokku delete アプリ名

コンテナのログを見る。tail -fみたいに追ってくれる。
% sudo docker logs -f コンテナ名


コンテナ名は、docker psしたら一番右にでてくるnostalgic_nobelとかsad_galileoみたいな厨二ネームっぽいやつがソレ。


手元のMacからログを見たりする

これらのコマンドはもちろんssh command proxyからも実行できる。
自分をdockerグループに追加すれば /var/run/docker.sock の権限が得られるので、sudoが必要なくなる
% gpasswd -a sho docker

Macから
% ssh ホスト名 docker ps
% ssh ホスト名 docker logs -f コンテナ名
でログが見れる。