個人開発環境をvagrantで建てるべきか、dockerで建てるべきか

  • 255
    いいね
  • 4
    コメント

ローカルPCに個人開発環境を建てたいけど、母艦は汚したくないものです。

そうすると、だいたいの場合vagrant(virtualbox)dockerかの2択になると思います。
この使い分けにいつも迷うのでどうするべきかの指針を考えてみました。

お断り: 以下は個人の見解であって、所属先の見解ではありません。

vagrant

カーネルに依存する操作を行いたい場合

dockerの場合、いじれるカーネルパラメータが限られています。
特定バージョンのカーネルの環境を用意する必要がある場合や、カーネルパラメータに特殊な設定が必要な環境では仮想マシンの方である必要があります。

内部で生成されたデータの保全を行いたい場合

dockerの場合、ふとした操作(docker killdocker builddocker rm(i)など)でデータコンテナの中身が消えてしまうことがあります。
仮想マシンのイメージであれば、内部に生成・保存したデータは確実に保存されます。

環境丸ごとを他者に配布したい場合

パッケージやその設定、データ投入済みの環境が丸ごと保存されますので、環境を他者に丸ごと渡すのが楽です。

ansibleなどのプロビジョニングツールと連携したい場合

ansiblechefなどのプロビジョニングツールとの連携がしやすいので、プロビジョニングツールを使いたい場合に適しています。

ゲストOSにLinux以外を使う場合

dockerだと不可能か、一般には難しいと思われます。

ファイル共有に高速性を求める場合 (Macホストの場合)

vagrantにもdockerにもホストOS側のファイルをマウントする仕組みがありますが、macホストの場合dockerのファイル共有は非常に遅いです。
あまりにも遅いのでvagrantに置き換えたら10倍くらい早くなったこともあります。

特にAPIサーバを立てる場合、大量のリクエストを発行しますので、開発サーバであったとしてもレイテンシーの低さが重要になります。
最近のdocker for macでは多少のチューニングは入ってるみたいですが、それでもまだ遅いです。

使用するコンポーネントが多数の場合

dockerでいうところのコンテナが多数に渡ると、管理が複雑になります。
複雑さはdocker-compose で解決できますが、起動が速いというメリットは失われます。(多数のコンテナを順次起動していく必要があるので。)

バッチジョブを実行したい場合

dockerは1コンテナ = 1プロセスが原則なので、cronで定期バッチを実行させる場合や、workerデーモンを待機させるときにそれらをどこに立てるかが問題になることがあります。
supervisordコンテナを立ててその配下に置くという手もありますが、コンテナであることのメリットは消えるでしょう。

docker

イメージサイズを抑えたい場合

Alpine Linuxベースのコンテナを選べば数10M 〜 数100Mに抑えることができます。
vagrantの場合イメージサイズは最低でも数Gレベルになります。

メモリサイズを抑えたい場合

不要なプロセスが立ち上がらない分メモリ使用量を抑えることができます。

vagrantの場合仮想マシンに割り当てる数Gレベルのメモリが必要ですし、それら全てが常に使われるというわけではありません。
複数環境を立てるとその無駄は無視できないレベルになります。(特に、メモリに限りがあるラップトップでは。)

起動・停止を繰り返す場合

コンテナ数が少なければ起動・停止が一瞬で完了するので、何度も起動・停止を繰り返すCI・ユニットテストの実行環境に適しています。

ホストOSにLinuxを使っている場合

Hypervisorのレイヤーが必要ないので、オーバヘッドが抑えられます。

使用するコンポーネントが少数の場合

docker-composeを使えば簡単にコンテナ間をつなぐことができます。

使い捨ての環境を作りたい場合

とりあえずお試しで使ってみたいコンポーネントがある時はdockerコマンド一発で既存イメージをpullできますし、すぐに破棄できます。

コンテナ内にデータを持つ必要が無い場合

万が一データを保存しても次回起動時に廃棄されるので、不要にデータを保存してしまうコードを発見・排除することができます。

環境構築のメタ情報をgitで管理したい場合

「環境構築のメタ情報」とはDockerfileファイルであったり、docker-compose.yamlファイルのことです。基本的に小サイズのテキストファイルですのでgitで管理するのに適しています。

vagrantではプロビジョニングツールと連携したとしても、最初のベースイメージは巨大バイナリファイルになるので、gitで管理するのは難しいと思います。(初期イメージだけはAtlasにホスティングするという手はありますが。)

以上になります。
ご意見や誤りの指摘があればコメント欄でお知らせください。