dokku は Docker をベースにした、Heroku のような環境をかんたんに実現するためのソフトウェアとのこと。
DigitalOcean は、1時間あたり1円から使える安価なクラウド IaaS です。
DigitalOcean には dokku インストール済みの Image があるので、かんたんに dokku 環境を構築することができます。
…というわけで、やってみました。 そもそも DigitalOcean に登録すらしていなかったので、そこからやりました。
1. DigitalOcean にサインアップ
- メールアドレスを登録
- クレジットカード情報を追加
2. dokku インストール済みの Droplet 作成
DigitalOcean では OS 実行環境(AWS でいうところの EC2 インスタンス)は Droplet と呼ばれるようです。 "Create Droplet" から Droplet を作成します。
- 名前は "dokku" としておきます。
- Size はミニマムでもいいですが、今回はデフォルトの $0.015/hour, mem 1GB を選びました。
- Region は日本から比較的近い Singapore を選択
- Image として、"Applications" タブから "Dokku v0.2.3 on 14.04" を選びました。
- まだ SSH 鍵を登録していなかったので、"Add SSH Keys" から公開鍵を登録しました。
3. dokku の初期設定
Droplet が作成されたら管理画面でIPアドレスを確認し、http://<IPアドレス> にアクセスします。
dokku の初期設定画面が表示されます。
- "Public Key" には先ほど自分で登録したものが表示されているはずです。
- Hostname にはアクセスしたいドメイン名を設定します。今回、DNSサービスは使いませんが、"dokku" としておきます。
- "Use virtualhost naming for apps" にチェックを入れます。"app.dokku" のようなドメイン名でアプリケーションにアクセスできるようになります。
- "Finish Setup" で設定を完了します。
4. /etc/hosts の設定
DNSサービスを使っていないので、今回は /etc/hosts に下記のように書いて代替します。
<IPアドレス> dokku test.dokku
5. ~/.ssh/config の設定
先ほど登録した ssh 鍵を使うように設定しておきましょう。
Host dokku IdentityFile ~/.ssh/id_dsa.dokku
5. サンプルアプリケーションを動かす
試しに Heroku のサンプルアプリケーションを dokku に Deploy してみます。
$ git clone https://github.com/heroku/node-js-sample.git
$ cd node-js-sample
$ git remote add dokku dokku@dokku:test
$ git push dokku master
Counting objects: 378, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (305/305), done.
Writing objects: 100% (378/378), 210.37 KiB | 0 bytes/s, done.
Total 378 (delta 44), reused 378 (delta 44)
remote: Cloning into '/tmp/tmp.f30SN2xsPB'...
-----> Cleaning up ...
remote: warning: You appear to have cloned an empty repository.
remote: done.
-----> Building test ...
remote: HEAD is now at 97a7c5c... wording
-----> Node.js app detected
-----> Requested node range: 0.10.x
-----> Resolved node version: 0.10.35
-----> Downloading and installing node
-----> Exporting config vars to environment
-----> Installing dependencies
express@4.10.7 node_modules/express
├── merge-descriptors@0.0.2
├── utils-merge@1.0.0
├── methods@1.1.1
├── fresh@0.2.4
├── cookie@0.1.2
├── escape-html@1.0.1
├── range-parser@1.0.2
├── cookie-signature@1.0.5
├── finalhandler@0.3.3
├── vary@1.0.0
├── media-typer@0.3.0
├── parseurl@1.3.0
├── serve-static@1.7.2
├── content-disposition@0.5.0
├── path-to-regexp@0.1.3
├── depd@1.0.0
├── qs@2.3.3
├── on-finished@2.2.0 (ee-first@1.1.0)
├── debug@2.1.1 (ms@0.6.2)
├── etag@1.5.1 (crc@3.2.1)
├── send@0.10.1 (destroy@1.0.3, ms@0.6.2, on-finished@2.1.1, mime@1.2.11)
├── proxy-addr@1.0.5 (forwarded@0.1.0, ipaddr.js@0.1.6)
├── type-is@1.5.5 (mime-types@2.0.7)
└── accepts@1.1.4 (negotiator@0.4.9, mime-types@2.0.7)
-----> Caching node_modules directory for future builds
-----> Cleaning up node-gyp and npm artifacts
-----> No Procfile found; Adding npm start to new Procfile
-----> Building runtime environment
-----> Discovering process types
Procfile declares types -> web
-----> Releasing test ...
-----> Deploying test ...
=====> Application deployed:
http://test.dokku
To dokku@dokku:test
* [new branch] master -> master
$
http://test.dokku にアクセスすると、"Hello, World!" の画面が表示されました。
後始末
DigitalOcean では Droplet を停止していても課金されるようです。 使い終わったら管理画面から Snapshot を取って、Droplet を削除しておくとよさそうです。
今後やってみたいこと
- xip.io を使えば hosts を書かなくてもよくなるようです。
- vagrant-digitalocean を使うと Droplet 作成や ssh ログインが vagrant で出来るようになるので、便利そうです。
- 今回は dokku インストール済みのイメージを使いましたが、素の Ubuntu イメージを使って、dokku-alt を動かすこともできそうです。