OrchardにDockerアプリケーションをデプロイ
Orchardは,Docker as a ServiceなDocker専用のホスティングサービス.[DigitalOcean]()のように時間単位の課金で利用できる.DigitalOceanより若干高いが,512MB RAM/20GB SSDであれば,1時間1円/月1000円程度で利用できる.
同様のサービスには,StackDockがある.またDockerをサポートしているプラットフォームとしては,Google Compute EngineやDigitalOceanなどがある.これと比較してOrchardがよいと感じた理由は以下.
- シンプル.専用のコマンドラインラッパーを使って,いつも通りのDockerコマンドをローカルから発行するだけでbuild/runが実行できる(StackDockはWebコンソールにDockerfileを書く).
- Figのサポート/開発を行っており,将来的に複数のDockerのコンテナ間のリンクなどがやりやすくなりそう.
ということで,実際にサンプルアプリケーションをデプロイしてみた.サンプルコードは全て以下にある.
準備
OSX上で行う.まず,Dockerのインストール.
$ brew update
$ brew tap homebrew/binary
$ brew install docker
次に,Dockerのデーモンを動かすために,VirtualBoxとboot2dockerのインストール.
$ brew tap phinze/homebrew-cask
$ brew cask install virtualbox
$ brew install boot2docker
boot2dockerを立ち上げて,Docker hostの環境変数を設定する.
$ boot2docker init
$ boot2docker up
$ export DOCKER_HOST=tcp://localhost:4243
ローカルで,アプリケーションの実行確認をする場合は,up
する前に,boot2docker-vmのPort forwardingの設定をしておく.
$ VBoxManage modifyvm "boot2docker-vm" --natpf1 "tcp-port3000,tcp,,3000,,3000"
最後に,Orchardでアカウントを作成し,Orchardのコマンドラインツールをインストールする.
$ curl -L https://github.com/orchardup/go-orchard/releases/download/2.0.5/darwin > /usr/local/bin/orchard
$ chmod +x /usr/local/bin/orchard
準備(Railsアプリケーション)
今回は,サンプルアプリケーションとして,mkwiatkowski/todo-rails4-angularjsを利用する(これは,Rails4でAngularJSを使ってみたというサンプルプロジェクト).
$ git clone https://github.com/mkwiatkowski/todo-rails4-angularjs
このアプリケーションは,DBにPostgresqlを使っている.Postgresqlコンテナを立ててそれと連携するため,以下のようにconfig/database.yml
を記述する.
development:
adapter: postgresql
template: template0
encoding: unicode
database: todo_rails4_angularjs_development
pool: 5
username: docker
password: docker
host: <%= ENV.fetch('DB_PORT_5432_TCP_ADDR') %>
port: <%= ENV.fetch('DB_PORT_5432_TCP_PORT') %>
Dockerのコンテナ間のリンクについては,“Dockerコンテナ間のlink,database.ymlの書き方”に書いた.
最後に,rbdockを使ってRailsアプリケーション用のDockerfileを作成する(rbdockについては,“rbdockというRuby/Rails/Sinatra用のDockerfileを生成するgemをつくった”に書いた).
$ gem install rbdock
$ rbdock 2.0.0-p247 --app todo-rails4-angularjs
このようなDockerfileが生成される.
後は,イメージをビルドしておく.
$ docker build -t tcnksm/rails .
ローカルでの開発
デプロイする前にローカルで動作確認をする.
まず,Postgresqlコンテナには,orchardが提供している[orchard/postgresql]()を使う.これをpgという名前で立ち上げる.
$ docker run -d -p 5432:5432 -e POSTGRESQL_USER=docker -e POSTGRESQL_PASS=docker -name pg orchardup/postgresql
次に,上の準備で作成したRailsコンテナを立ち上げる.
$ docker run -i -p 3000:3000 -link pg:db -name web -t tcnksm/rails 'rake db:create && rake db:migrate && rails s'
http://localhost:3000/にアクセスすれば,実行が確認できる.
ローカルでの開発では,ONBUILDやVolumeを使ってイメージにアプリケーションをマウントして開発すれば,リアルタイムに更新が確認できて便利.また,Vagrant share的なこともできる.その辺りは以下に書いた.
Orchardへのデプロイ
開発が完了したら,実際にOrchardにアプリケーションをデプロイしてみる.まず,作成したアカウントでログインする.
$ orchard hosts create
Orchard username:
Password:
すると専用のホストが作成される.課金はここから始まる.
次に,Postgresqlコンテナを起動する.
$ orchard docker run -d -p 5432:5432 -e POSTGRESQL_USER=docker -e POSTGRESQL_PASS=docker -name pg orchardup/postgresql
そして,Railsイメージをビルドして起動する(イメージをdocker.ioに上げてある場合はbuildは必要ない).
$ orchard docker build -t tcnksm/rails .
$ orchard docker run -i -p 3000:3000 -link pg:db -name web -t tcnksm/rails 'rake db:create && rake db:migrate && rails s'
起動ホストは以下で確認できる.
$ orchard hosts
NAME SIZE IP
default 512M 162.243.93.47
http://162.243.93.47:3000/にアクセスする.
ホストを削除したい場合は,以下のようにする.課金はこれで終了する.
$ orchard hosts rm
以上.
雑感
上で示したように,ローカルでの環境と全く同じコマンドをorchard
コマンドを介して発行するだけで利用できる.素晴らしい.とてもシンプル.
Figも試したい.また今作っている自分のアプリケーションも実際にデプロイして運用していきたい.