開発環境をVagrantからdockerに移行してみた
Editor's Notes
- みなさん、webアプリ開発していたことありますか?
一般的には、Ruby on railsやexpressなど、フレームワークを用いて開発することが多いと思います。
- でも開発するときに色々なミドルウェアが必要になると思います。例えばRuby on railsの場合、フロントエンドではruby, postgresql、webサーバであるnginx、最近ではフロントエンドの部分にnodejsやgulpを用いてコンパイルしたりします。
- じゃあ仮想マシン使ってみようと考えます。最近だと開発環境にvagrantを使っている人が多いと思います。これはvagrantfileと呼ばれるものを用いて仮想マシンを作成し、環境を構築します。チーム間での共有がすぐにできるので便利です。
- でもvagrantを使っていても問題があります。それは色々遅いことです。例えば起動が遅く、OSのimageをダウンロードするのに時間がかかります。そして共通の設定を作るためにshellscriptやansibleを用いたりもしますが、これも時間がかかります。
- じゃあ最近聞くdockerはどうなんだろうと思って使ってみました。dockerはコンテナとよばれるものを用いて仮想環境を構築します。最近ではdocker for macやdocker for windowsと呼ばれるものが公開され、簡単に実行することができるようになりました。
- 内部構造を比較すると、ゲストOSが存在しません。dockerはvagrantと違ってrailsだったらrailsコンテナ、mysqlだったらmysqlコンテナと役割ごとに分離して実行します。その役割ごとにimage(vagrantでいうbox)を作成します。
- じゃあそのdockerのimageはどうなっているかというと、ベースとなるOSのイメージを元に作成していきます。例えばdebianのOSを元に、imageを追加していきます。imageを作成するごとにレイヤーがどんどんつらなっていき、実行時にはこのレイヤーが並列にダウンロードされていきます。
- イメージを作成するためには、Dockerfileと呼ばれるものを先に作成します。これを用いてビルドしたものをdocker imageのクラウドサービスにアップロードします。つまりvagrantのansibleやshellscriptがこの時点で実行されるため、そのぶん実行時にかかる時間が減ります。
- 実際に比較してみると、このようになっています。dockerは最も小さいもので20MBしかないため、イメージのダウンロードが速く、実行も速いです。