随分前に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
是非お試し下さい。