人間とウェブの未来

「ウェブの歴史は人類の歴史の繰り返し」という観点から色々勉強しています。

独自でngx_mrubyのDockerイメージを作る方法

随分前にngx_mrubyをDocker対応していたのですが、最近になってより使いやすくなったので、ngx_mrubyをDockerで使う方法を簡単に紹介します。

使い方

matsumoto-r/docker-ngx_mruby · GitHub

上記にngx_mrubyをDockerで使ったサンプルを公開しておきました。本記事を読んだ上で、開発の参考にしてみてください。

ngx_mrubyをDockerで使う流れは、基本的に以下のようになります。

Docker Hubのイメージを使う

Docker Hubにはngx_mrubyの公式のイメージを公開しています。このイメージはONBUILDをサポートしており、公式イメージであるmatsumotory/ngx-mrubyを任意のDockerfileからFROMによって参照した際に、そのDockerfileビルド時に以下のコマンドを自動で実行する仕組みになっています。

ADD docker/hook /usr/local/nginx/hook
ADD docker/conf /usr/local/nginx/conf
ADD docker/conf/nginx.conf /usr/local/nginx/conf/nginx.conf

ファイルを適切に配置する

上記の仕様により、まずはcurrent_dirの中で、以下のようなDockerfileを作ります。

  • current_dir/Dockerfile
FROM matsumotory/ngx-mruby:latest
MAINTAINER matsumotory

続いて、docker build時に実行されるコマンドで配置されるファイル群をcurrent_dir内に配置します。シンプルな例としては、

  • current_dir/docker/conf/nginx.conf
user daemon;
daemon off;
master_process off;
worker_processes 1;
error_log stderr;

events {
    worker_connections 1024;
}

http {
    server {
        listen 80;

        location /mruby-hello {
            mruby_content_handler_code 'Nginx.echo "server ip: #{Nginx::Connection.new.local_ip}: hello ngx_mruby world."';
        }

        location /mruby-test {
            mruby_content_handler /usr/local/nginx/hook/test.rb;
        }

        location / {
            resolver 8.8.8.8;
            mruby_set_code $backend '["blog.matsumoto-r.jp", "hb.matsumoto-r.jp"][rand(2)]';
            proxy_pass http://$backend;
        }
    }
}

また、この設定から読まれるhook/test.rbファイルを以下のように配置します。

  • current_dir/docker/hook/test.rb
Nginx.echo "This is test for ngx_mruby"

基本的にはこれだけでOKです。また、nginx.conf内で別のconfをinculudeする場合などは、current_dir/docker/conf/内にconfファイルを置いて、それをnginx.confでincludeするように設定を書いて下さい。current_dir/docker/conf/はまるごとDockerイメージ内にコピーされます。(Docker Hubのイメージを使う項目参照)

ビルドして実行

├── docker
│   ├── conf
│   │   └── nginx.conf
│   └── hook
│       └── test.rb
├── Dockerfile

上記のようにファイルを配置したらビルドして実行してみましょう。

cd current_dir/
sudo docker build -t local/docker-ngx_mruby .
sudo docker run -p 80:80 -t local/docker-ngx_mruby

予めmatsumotory/ngx-mrubyのイメージをダウンロードいていれば、一瞬でビルドは終わるはずです。

この状態でngx_mrubyにアクセスしてみましょう。

$ curl http://127.0.0.1/mruby-hello
server ip: 172.17.0.200: hello ngx_mruby world.
$ curl http://127.0.0.1/mruby-test
This is test for ngx_mruby
$ curl http://127.0.0.1/  | grep -i "<title>"
        <title>人間とウェブの未来</title>

簡単ですね!

まとめ

以上のように、ngx_mrubyをDockerで簡単に利用する方法を紹介しました。

今回作ったようなcurrent_dirを例えばGitHub上のレポジトリとして公開して、DockerHubと連携して自動でDockerイメージを作成するようにすれば、より簡単に自分だけのngx_mrubyイメージを開発・公開することができるでしょう。

また、様々な用途、プロキシやアクセス制御等でイメージを作っておくことで、簡単に用途事にデプロイできるでしょう。

ngx_mrubyをDockerで使った例としては、nagachikaさんが先日公開したブログが非常に参考になるかと思います。

docker-registry に認証/アクセス制限を追加する nginx-docker-registry を公開しました - PB memo

是非お試し下さい。