最近Dockerが流行っているみたいで調べてみたらdokkuっていうmini-Heroku環境をローカルに構築できるっていうじゃないですか。
これができたらchefとかでわざわざ環境作ったり、capistranoでデプロイする手間なくgit pushだけでアプリ動作確認できるので楽チンですね。
Dokkuってなに?
簡単にいえばDocker上で動作するmini-Heroku環境です。
公式によれば最小のPaaS実装だと言っています。
前提
Ubuntu13 or 12.04 x64推奨。
ただし13のほうは問題があるようなので12.04のほうがいいかも。
Note: There are known issues with docker and Ubuntu 13.10 (1, 2) - use of 12.04 is recommended until these issues are resolved.
Dokkuの構成要素
- Dokku
- Docker
- Buildstep
- pluginhook
- sshcommand
- Nginx, SSH, Git
動作概要
以下が自動で実行されます。
詳しくはdokkuファイル参照
- クライアントからgit pushを受け取る
- 前の環境が残っているなら一回まっさらにする(dokku cleanup)
- アプリを入れて言語に応じてbuildpackを構築(dokku build)
- 環境変数等を設定(dokku release)
- コンテナ起動(dokku deploy)
ローカルのMac環境セットアップ
Vagrant インストール
Vagrant未導入であれば以下からMacようのものをとってきてインストールします。
$ vagrant -v
Vagrant 1.5.2
Box追加
Ubuntu 12.04 (precise64)を入れます。
$ vagrant box add precise64 http://files.vagrantup.com/precise64.box
$ vagrant init precise64
Vagrantfile編集
するとVagrantfileができます。
今回は以下のようにしました。
#Vagrantfile
VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
config.vm.box = "precise64"
config.vm.network "private_network", ip: "192.168.33.10"
config.vm.box_url = "http://files.vagrantup.com/precise64.box"
config.ssh.forward_agent = true
end
ゲストOS上でdokku導入
dokku(docker含む)の導入
あとはゲストOSを起動してSSHでログインします。
$ vagrant up
$ vagrant ssh
次にゲストOS上でdokkuをインストールします。
12.04の場合、python-software-propertiesが必要になるので事前に入れておきます。
ちょっと時間かかります。
$ sudo apt-get install -y python-software-properties
# 安定版の場合
$ wget -qO- https://raw.github.com/progrium/dokku/v0.2.2/bootstrap.sh | sudo DOKKU_TAG=v0.2.2 bash
# 開発版がいい場合はこちら
$ wget -qO- https://raw.github.com/progrium/dokku/master/bootstrap.sh | sudo bash
VHOST設定
続いてVHOSTの設定をします。
xip.ioという無償のサービスを使います。
これはdeploy.192.168.33.10.xip.io → 192.168.33.10
のように名前解決してくれるサービスです。
dokkuがIPアドレスではなくドメイン名を前提にするらしいのでこういうサービスでローカルIPを擬似的にドメイン名にしちゃいます。
# まずは名前解決されることを確認
$ nslookup deploy.192.168.33.10.xip.io
Server: 192.168.0.1
Connection to 127.0.0.1 closed.
Non-authoritative answer:
deploy.192.168.33.10.xip.io canonical name = deploy.2t77wg.xip.io.
Name: deploy.2t77wg.xip.io
Address: 192.168.33.10
確認できたらVHOSTの設定を/home/dokku/VHOSTに置きます。
$ sudo vi /home/dokku/VHOST
# VHOST
deploy.192.168.33.10.xip.io
その場しのぎのDockerダウングレード
どうもDocker 0.10.0とDokku 0.2.2は相性が悪いらしいです。
issue #533 Dokku 0.10.0: Pre-receive hook declined: Invalid namespace name (app)
Docker 0.10.0からはnamespace指定が4文字以上じゃないといけないのにDokkuが「app」という3文字で指定しちゃってるからだめみたいです。
回避策は今のところ2つあるみたい。
- dockerを0.9.0にダウングレード
- dokkuファイルを自分で手直し(app→4文字以上の何か)
とりあえず前者で対応しました。
# 現状のをアンインストールしてからバージョン指定でインストール
$ sudo apt-get remove --purge lxc-docker
$ sudo apt-get install lxc-docker-0.9.0
ローカル環境に戻って設定
公開鍵登録
VHOST設定が終わったら一旦ローカル環境に戻って公開鍵を登録します。
# id_rsa.pubがなければ事前にssh-keygenしておくこと
$ cat ~/.ssh/id_rsa.pub | ssh vagrant@192.168.33.10 "sudo sshcommand acl-add dokku vagrant"
ちなみにvagrantのアカウントは以下なので覚えておきましょう。
user:vagrant
pass:vagrant
実際に使ってみる
サンプルアプリを取ってきてお試しデプロイ
まずは、Dokku公式にも記載されているサンプルを動作させてみます。
$ git clone https://github.com/heroku/node-js-sample
$ cd node-js-sample
$ git remote add progrium dokku@deploy.192.168.33.10.xip.io:node-js-sample
$ git push progrium master
あとは以下にアクセスして表示されることを確認します。
http://node-js-sample.deploy.192.168.33.10.xip.io/
アプリを削除する
アプリを削除します。このとき同時にコンテナも削除されます。
# vagrant上で実行
$ dokku delete node-js-sample
この他もちろんDockerを直接触ることもできます。
参考にさせていただいたサイト
DockerとdokkuをMacにインストールして自分をHeroku化した