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を使った実行環境の分散化といった話も現実味をおびてきました。
面白い時代になってきていますね。