beta

開発環境はHomebrew?docker?仮想マシン?使ってみて感じたそれぞれのメリット・デメリット

ここ数年、ローカル開発環境を試行錯誤で試してきて感じたメリット、デメリットを、動作の軽快さや本番サーバーの再現性などいくつかの項目に分けて検証してみました。

公開日:2019年12月10日

Homebrew

Linux向けのLinuxbrewが本家のHomebrewにマージされたことにより、MacでもLinuxでもWindows(Windows Subsystem for Linux)でも使える万能ツールになったHomebrew。

構築した開発環境は、ローカル環境の「ネイティブ」として動作します。

メリット = 情報量が多い&マシン環境を汚さない

日本では特にWeb系の開発者の間に人気のため、Homebrew関連の日本語情報はかなり豊富です。基本的な使い方からちょっとしたエラー対応まで、検索すれば大抵の情報が出てくるので、開発環境の構築としては敷居が低めです。

また、Homebrewは、専用のディレクトリでシステムを構築しているため、マシン本体の環境を汚さずにサンドボックス的に使えるのも大きなメリット。それでいてネイティブと同じように使えるので、利便性はかなり高いと言えます。

デメリット = ビルドがやや遅い

Homebrewは、各OS版のアプリケーションを一からビルドするため、インストールする際のビルド時間が結構かかります。この点は、ビルド済みのイメージを引っ張ってくるDockerと比べてモノになりません。

Docker

モダンな環境というとイメージだったDockerも、もはや定番化した感があるくらい当たり前になりました。

構築した開発環境は、コンテナ技術を使って、ローカル環境の「プロセス」として動作します。

メリット = 軽量さと手軽さ

コンテナ化技術によって、OSイメージをベースにしているため、ほぼほぼ仮想マシンのように使えるのに、マシンから見たらただのプロセスなので、マシンへの負荷が圧倒的に低いの大きなメリット。複数のコンテナを立ち上げていても、メモリやストレージの圧迫を避けられるため、動作は軽快です。

また、docker hubなどでビルド済みのdockermイメージが大量に公開されているため、「docker pull」でイメージをダウンロードすればすぐに使える手軽さも◎。OSに関する知識が少なくても使えるのも大きなメリットです。

公開環境との同一性という点でもdockerは優れていて、ローカルと本番で同じコンテナを使えば、本番とほぼ同じ環境の開発環境を手軽に素早く構築できます。

仮想マシン(Vagrant)

ローカルマシンの中にサーバーを立てられるVirtualboxやVM wareなどの仮想マシン。仮想マシンを使ってコマンドラインから簡単に構築ができるVagrantも人気です。

構築した開発環境は、ローカル環境の「リソース」として動作します。

メリット = 複数サーバーの連動も再現できる

仮想マシンの良いところは、複数のサーバーを用意できるところです。例えば、本番が、

  • フロントサーバー (Web)
  • バックエンドサーバー (API)
  • データベースサーバー(DB)

といった構成だった場合でも、開発環境に仮想マシンなら全く同じようにマシンを立てて使うことができるため、本番サーバーの再現性が高くなります。このあたりは、Homebrewやdockerでは再現ができないところで、仮想マシンならではメリットと言えます。

デメリット = リソースを食う&たまに壊れる

仮想マシンは、ローカルマシンの中で仮想的にサーバーを立ち上げているので、開発マシンのリソースをバンバン食っていきます。

例えば、2 CPU、2GBメモリの仮想マシンを4台同時に立ち上げたら、メモリは開発マシンの実メモリを最大で8GB分圧迫します。この辺りは、ネイティブ化させるHomebrewやプロセス化させるdockerに軍配が上がります。サーバーの中でそれぞれ環境を構築するため、環境構築に時間がかかるのもデメリットでしょう。

また、仮想マシンのデータは専用のディスクイメージで保存されるため、壊れると復元が困難です。しかも、予期せずイメージが壊れることもあるため、壊れた時の被害が大きくなります。

比較表

比較したそれぞれの項目を表にまとめてみました。

項目 動作 リソースの消費 手軽さ 構築時間 本番環境の再現性
Homebrew ネイティブ 少ない ×
Docker プロセス 少ない
仮想マシン リソース 多い × ×
  • Homebrew = 手軽・軽量
  • Docker = 手軽・軽量・再現性比較的高い
  • 仮想マシン = 重量計・再現性高い

という感じでしょうか。


それぞれメリット・デメリットがあるので、これが正解というのはないと思います。

最近では、本番環境がサーバーレスということもあるので、本番環境の再現性が重要になることがないという方もいるでしょうし、開発環境に望むものはそれぞれ違うので、自分にあった環境を探す感じでしょうか。

筆者自身は、最近は本番環境はほぼサーバーレス化しているので、アプリ系はHomebrew、DBなどのサーバー系はDockerを使っています。

Author

Koji Kadoma
Member of codit.work

新着ノート

新着コード