Gitのコミット単位で動的にDockerイメージをデプロイするプロキシサーバpool

Gitのコミット単位で動的にDockerイメージをデプロイするプロキシサーバpoolというソフトウェアがあります。

poolとは

poolは、WebアプリとDockerfileをGitで管理している場合に、コミットidをサブドメインとして( http://<commit-id>.pool.dev/ )poolにアクセスするだけで、そのGitレポジトリのコミット時の状態でWebアプリのDockerイメージをデプロイし、Webアプリのポートへとリバースプロキシして、Webアプリのレスポンスを返します。もちろん、コミットidをキーに複数の状態にどんどんアクセスできます。(mod_mrubyのユースケースを調査していてたまたま見つけました)。

このpoolというソフトウェアはシンプルですが、ある種Dockerの差分管理やコンテナ型の利点をうまく利用していて、この構造を利用すると効率の良いDockerのデプロイ環境が構築できるように思いました。また、DockerとVagrantの利点もうまく組み合わせていて、このpool自体のデプロイも非常に簡単になっています。この辺りの設計の良さに関しては最後にまとめます。

例えば、poolで対象にするレポジトリをmod_mrubyにしていた場合、mod_mrubyのレポジトリにはDockerfileも置いてあって、ビルド後のDockerイメージは/mruby-helloにアクセスするとレスポンスが返るようにしています。

つまり、poolのREADMEの通り、例えば http://1d4980db6f9f90a3e4954b126044db623f498917.poo.dev/mruby-hello にアクセスすると、そのGitコミットID単位でDockerfileからDockerビルドして、動的にDockerのポートをプロキシサーバであるApacheが検出してそのポートにリバースプロキシしてくれます。

このpoolで動作しているリバースプロキシはApache+mod_mrubyで実装されていて、こういう動的なポート割り当てやDockerデプロイみたいな事をしたい場合は、mod_mrubyngx_mrubyは使いやすいと思います。ngx_mrubyもほとんど同様の事を実装できそうですね。

VagrantとDockerとGitの組み合わせを活かした設計

この設計の良い所は、

  • GitとDockerの差分管理を利用
  • 一旦Dockerデプロイされるとイメージの差分をキャッシュするので別コミットIDでのデプロイが高速
  • デプロイしたDockerイメージのサービスポートとドメインを動的に紐付ける(設定変更が不要)
  • Vagrantでpool自体を様々な環境に簡単にデプロイし、デプロイされた仮想マシン内でDockerのサービスを動的かつ高速にデプロイする(仮想マシンとコンテナの良さをうまく利用)

だと思います。

この設計をうまく使うと、VagrantとDockerの良さをうまく両立したWebシステムが作れそうですね。