Docker HubとGitHubを連携させてmod_mruby実行環境をDockerで簡単にデプロイ

Docker Hub公開のアナウンスがあったので、早速Docker HubとGitHubを連携させてmod_mrubyの実行環境をDockerイメージとして作った上で、それをMac上のVagrantで動くCoreOS内のDocker環境にデプロイしてみました。

本エントリではmod_mrubyとしていますがここは重要ではなく、自身が開発しているGitHubのアプリケーションに置き換えて読んで頂けると、便利さが見えてくるかと思います。

試してみると、非常に簡単にDockerイメージを作成できた上に、迅速にmod_mrubyの軽量な実行環境をデプロイできたので、その流れを簡単に紹介したいと思います。

Docker Hubにアカウントを作ってGitHubのレポジトリを登録する

Docker Hubにアカウントを作ると、GitHubのレポジトリをDocker Hubに紐付ける事ができます。すると、紐付けたGitHubのレポジトリに新しいcommitがあると、自動的にDocker Hubでもビルドが走るようになります。その際にDocker HubはGitHubのレポジトリのルートにあるDockerfileを参考にするので、GitHubレポジトリにDockerfileを置いておきましょう。

例えばmod_mrubyの場合は以下のようなDockerfileを置いておくことで、mod_mruby実行環境であるDockerイメージを作るようにします。

[program lang=’bash’ escaped=’true’]

#
# Dockerfile for mod_mruby on ubuntu 14.04 64bit
#

#
# Building
#   docker build -t matsumotory:mod_mruby .
#
# Runing
#   docker run -d -p 10080:80 matsumotory:mod_mruby
#
# Access
#   curl http://127.0.0.1:10080/mruby
#

FROM stackbrew/ubuntu:14.04
MAINTAINER matsumotory

RUN apt-get -y update
RUN apt-get -y install sudo openssh-server
RUN apt-get -y install git
RUN apt-get -y install curl
RUN apt-get -y install apache2 apache2-dev apache2-utils
RUN apt-get -y install rake
RUN apt-get -y install ruby2.0 ruby2.0-dev
RUN apt-get -y install bison
RUN apt-get -y install libcurl4-openssl-dev
RUN apt-get -y install libhiredis-dev
RUN apt-get -y install libmarkdown2-dev
RUN apt-get -y install libcap-dev
RUN apt-get -y install libcgroup-dev

RUN cd /usr/local/src/ && git clone git://github.com/matsumoto-r/mod_mruby.git
RUN cd /usr/local/src/mod_mruby && sh build.sh && make install
RUN echo "" >> /etc/apache2/mods-enabled/mruby.load
RUN echo "  mrubyHandlerMiddleCode 'Apache.echo \"hello mod_mruby world.\"" >> /etc/apache2/mods-enabled/mruby.load
RUN echo "" >> /etc/apache2/mods-enabled/mruby.load
RUN service apache2 restart && curl http://127.0.0.1/mruby

EXPOSE 80
env APACHE_RUN_USER www-data
env APACHE_RUN_GROUP www-data
env APACHE_PID_FILE /var/run/apache2.pid
env APACHE_RUN_DIR /var/run/apache2
env APACHE_LOCK_DIR /var/lock/apache2
env APACHE_LOG_DIR /var/log/apache2
env LANG C

CMD ["/usr/sbin/apache2", "-D", "FOREGROUND"]

[/program]

これによって、GitHubのmod_mrubyレポジトリを更新すると、その都度Docker Hub上で上記のDockerfileが実行され、Docker Hub上で作られたDockerイメージがDockerレジストリに登録されていきます。

mod_mrubyの場合は以下のようなコマンドでDockerイメージが取得できるようになります。matsumotoryはDocker Hubのアカウント名、mod-mrubyはGitHubのmod_mrubyレポジトリを紐付けた際に、_が-に自動的に置き換わって生成されます。

[program lang=’bash’ escaped=’true’]

docker pull matsumotory/mod-mruby

[/program]

Mac上のVagrant環境にCoreOSをインストールする

Mac上に既にVagrantの環境があることを前提に話を進めます。DockerをMac上でも手軽に使うには、Vagrant+CoreOSを使うのが個人的には好きです。CoreOSのインストールは非常に簡単で、以下のようにCoreOSのGitHubレポジトリをcloneしてvagrant upすれば良いだけです。

[program lang=’bash’ escaped=’true’]

git clone https://github.com/coreos/coreos-vagrant.git
cd coreos-vagrant
vagrant up
vagrant ssh

Last login: Thu Jun 12 13:10:51 2014 from 10.0.2.2
CoreOS (alpha)
core@core-01 ~ $ docker -v
Docker version 1.0.0, build 63fe64c

[/program]

このように、vagrant sshでCoreOSに入ると既にDocker環境が存在しversionも1.0.0がインストールされているので、余計な設定をすることなく最新のDockerを使う事ができます。

Docker Hubで自動で作られたmod_mrubyのDockerイメージを落としてきて起動させる

Docker環境を手に入れたら、後はCoreOS上でDocker Hubで自動的に作られているmod_mrubyのイメージをダウンロードしてきて起動させます。pullのコマンドはDocker Hubのレポジトリの右上辺りに「Pull this repository」明記されています。mod_mrubyの場合は以下のようなコマンドですので、是非試してみてください。

[program lang=’bash’ escaped=’true’]

docker pull matsumotory/mod-mruby
docker run -d -p 10080:80 matsumotory/mod-mruby

[/program]

すると、mod_mruby環境がインストールされたubuntu14.04環境のApache httpdが起動しますので、curlでアクセスしてみると、

[program lang=’bash’ escaped=’true’]

curl http://127.0.0.1:10080/mruby
hello mod_mruby world.

[/program]

このように最新のmod_mrubyが動きました。

まとめ

以上のように、GitHubで開発しているアプリケーションに対して予め上記のようなDockerfileを作っておくことで、自動的にDocker Hubと連携してそのアプリケーションの最新の軽量な実行環境であるDockerイメージが作成・公開され、Docker環境で簡単に使用することができます。GitHubのレポジトリに更新があると、都度それを検知してDockerイメージも更新してくれるため、常にGitHubに追随して新しいDockerイメージが作られるのも安心です。

GitHubでアプリケーションを開発していくと、同時にそのアプリケーションの軽量な実行環境がDocker Hubで作成・配布されるようになったので、今後はデプロイもDockerが動く環境であればどこでも簡単にできるようになり、環境がコンテナベースであることもあって非常に高速・軽量にデプロイできるようになっていくでしょう。それによって、状態を持つデータと、このような状態を持たない軽量な実行環境を明確に分離していけば、どんどん使い捨てのインフラ構築がやりやすくなる、あるいは、実行環境の高速なデプロイとアプリケーションの分散化が可能になっていくのではないかと思います。状態を持たないアプリケーションの軽量な実行環境は原理的に静的ファイルのように扱えるので、P2Pを使った実行環境の分散化といった話も現実味をおびてきました。

面白い時代になってきていますね。