Docker Hubがアナウンスされて以来、焦ってDockerを触っている@matsumotoryです。
今日は早速mod_mrubyとngx_mrubyをdocker buildに対応させました。これによって、Docker環境においてmod_mrubyを組み込んだApache httpdやngx_mrubyを組み込んだnginxを迅速かつ容易に連携させる事ができるようになります。
今日はその一例を紹介したいと思います。
「ウェブの歴史は人類の歴史の繰り返し」という観点から色々勉強しています。2014年までの人間とウェブの未来の旧ブログです。
Docker Hub公開のアナウンスがあったので、早速Docker HubとGitHubを連携させてmod_mrubyの実行環境をDockerイメージとして作った上で、それをMac上のVagrantで動くCoreOS内のDocker環境にデプロイしてみました。
本エントリではmod_mrubyとしていますがここは重要ではなく、自身が開発しているGitHubのアプリケーションに置き換えて読んで頂けると、便利さが見えてくるかと思います。
試してみると、非常に簡単にDockerイメージを作成できた上に、迅速にmod_mrubyの軽量な実行環境をデプロイできたので、その流れを簡単に紹介したいと思います。
OSvがとても面白いので色々いじっていると、結果的にmruby-simplehttpserverというWebサーバをmrubyで動かすためのmrubyモジュールができてしまいました。
これは、OSvのようにライブラリをがんがん入れられないような環境でも、とりあえずSocketとIOがあれば動くシンプルなWebサーバを動かすためのmrubyモジュールです。
そもそもOSvって何?という方はこの辺りを見るか、syuu1228さんに聞くのが良いと思います。簡単に言うと、これからの時代、ハイパーバイザにがんがん仮想マシンをデプロイする際に、その仮想マシンにリッチなOSがあまり必要ないケースって結構あって(例えばmemcachedだけが動いているVMとか)、OSvはそういう用途に省メモリかつCPUのオーバーヘッドを低減して高速に動作するまるでプロセスのように扱えるOSです。プロセスは言い過ぎましたが、仮想マシンにも関わらず起動はmruby使用の場合、1、2秒で起動するので非常に高速です。
で、通常はコアの上にJVMがのっていってその上にサーバ+アプリケーションが動く仕組みになっているのですが、そのJVMの部分を他のVM(言語処理系的な意味合いの)を載せ替える事もできて、そこにサクっとsyuu1228さんがmrubyのVMをのせるハックをして今では本家にもマージされ、コアの上でmrubyのVMを動くようにimageを作ればアプリケーションとしてmrubyで書いたコードが動くようになります。JVMもZFSも取り外しているのでかなり高速かつ軽量に動作します。
かといって、OSvはUbuntuとかそういうライブラリをどんどん入れられるようなリッチな環境ではないのですが、Javaアプリが動く程度にSocketやIO等は普通に動くのでそれにのみ依存したWeb機能を持ったmrubyアプリケーションサーバをつくろうと思った次第です。mruby-simplehttpserverを使えば、OSv上で動くmrubyでWebアプリケーションを容易に実装することができるようになりました。
このような特徴を持つOSvをうまく使えば、状態を持つデータはどこか別の場所に置いておいて、OSvやその上で動くアプリケーションをイミュータブルに動かしたりと、次の世代の使い捨てデプロイ手法を実現しやすくなるのではないでしょうか。そういう方向性でもOSvは興味深いOSだと思っています。
前置きが長くなりましたが、では実際に動かしてみましょう。
Trusterd(トラスタード)と呼んでいるmrubyで設定が書けるHTTP/2 Web Serverを、色々と勉強しながら実装しているのですが、それらに下記機能を試験的に追加しました。
これらの機能はまだ実装は甘く、性能・効率面はこれから詰めていきますが、一応動作するという事で簡単に紹介します。Trusterdの設定方法や簡単な紹介は、過去のエントリ「Trusterd: HTTP/2 Web Server scripting with mruby v0.0.1 リリースしました」を御覧ください