MacのVagrant上にDocker＆Dokku環境入れてローカルmini-Heroku環境構築してみる



最近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ファイル](https://github.com/progrium/dokku/blob/master/dokku)参照

1. クライアントからgit pushを受け取る
2. 前の環境が残っているなら一回まっさらにする（dokku cleanup)
3. アプリを入れて言語に応じてbuildpackを構築（dokku build）
4. 環境変数等を設定（dokku release）
5. コンテナ起動（dokku deploy）



# ローカルのMac環境セットアップ

## Vagrant インストール

Vagrant未導入であれば以下からMacようのものをとってきてインストールします。

[http://www.vagrantup.com/](http://www.vagrantup.com/)


```sh
$ vagrant -v
Vagrant 1.5.2
```

## Box追加

Ubuntu 12.04 (precise64)を入れます。

```sh
$ 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でログインします。

```sh
$ vagrant up
$ vagrant ssh
```

次にゲストOS上でdokkuをインストールします。
12.04の場合、python-software-propertiesが必要になるので事前に入れておきます。
ちょっと時間かかります。

```sh
$ 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を擬似的にドメイン名にしちゃいます。

```sh
# まずは名前解決されることを確認
$ 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)](https://github.com/progrium/dokku/issues/533)


Docker 0.10.0からはnamespace指定が4文字以上じゃないといけないのにDokkuが「app」という3文字で指定しちゃってるからだめみたいです。

回避策は今のところ２つあるみたい。

- dockerを0.9.0にダウングレード
- dokkuファイルを自分で手直し（app→4文字以上の何か)

とりあえず前者で対応しました。

```sh
# 現状のをアンインストールしてからバージョン指定でインストール
$ sudo apt-get remove --purge lxc-docker
$ sudo apt-get install lxc-docker-0.9.0
```




# ローカル環境に戻って設定

## 公開鍵登録

VHOST設定が終わったら一旦ローカル環境に戻って公開鍵を登録します。

```sh
# 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公式にも記載されているサンプルを動作させてみます。


```sh
$ 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/](http://node-js-sample.deploy.192.168.33.10.xip.io/)


## アプリを削除する

アプリを削除します。このとき同時にコンテナも削除されます。

```sh
# vagrant上で実行
$ dokku delete node-js-sample
```

この他もちろんDockerを直接触ることもできます。


# 参考にさせていただいたサイト

[progrium/dokku](https://github.com/progrium/dokku)

[DockerとdokkuをMacにインストールして自分をHeroku化した](http://shokai.org/blog/archives/8855)

[Vagrantでdokkuを動かす](http://qiita.com/hokaccha/items/af109d4037fa1d788617)

[dokku + VirtualBoxで自分のHerokuを作る](http://blog.coiney.com/2013/08/10/create-my-own-heroku/)

[Inside Dokku in 5 minutes](http://banyan.me/slides/20140116/slides.html#slide-0)