Help us understand the problem. What is going on with this article?

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

More than 5 years have passed since last update.

最近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ファイル参照

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

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

Vagrant インストール

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

http://www.vagrantup.com/

$ 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を直接触ることもできます。

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

progrium/dokku

DockerとdokkuをMacにインストールして自分をHeroku化した

Vagrantでdokkuを動かす

dokku + VirtualBoxで自分のHerokuを作る

Inside Dokku in 5 minutes

muran001
2014年6月から大手SIerに見切りをつけてWeb系のエンジニアとして活動してます。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした