仮想化、いいですよね。特に色んな環境を1つのマシンで開発してる人は便利だと思います。
そこで、今回はWeb系の視点から、Dockerを主に使っている人がVagrantとの違いに触れながら「なぜDockerを選んでVagrantを使わないのか」ということについて書きたいと思います。
Docker と Vagrant の違い
さんざんあちこちで書かれていることなのですが、Vagrantはカーネルも含めて仮想機械を自動構築するのに対して、DockerはカーネルなどのOSの共通部分を、ホストのものをそのまま使うという点で違っています。
すごくざっくりとした絵で厳密さを排しているので、あくまでイメージとして捉えてください。
イメージとしては、
Docker
- マイクロサービスなイメージ
- 1プロセス1コンテナが基本
- コンテナ同士がやり取りしてサービスを作り上げる
Vagrant
- 1台のサーバーで運用しているようなイメージ
- LAMPを入れて動かす
- 内部で完結している
という勝手な印象がそれぞれにあります。(実際、こういう使い方が筆者が関わった環境では多かったです)
注意してほしいのが、DockerとVagrantは上のように仮想化したいレイヤーが違うので、Vagrantの上でDocker立てて環境構築、というのは可能です。実際、この手法はホストOSの影響を受けないようにしつつ、Dockerで各プロセスをマイクロサービス化したい場合に使われます(VMによっては不可能な場合もあります)。
DockerとVagrantを比較した雑感
をつらつらと書いていこうかなと。
Vagrant重たい
Vagrantは普通のOSを仮想環境上で動かします。当然、間に挟まる層もシミュレーションされるプログラムも増えるので重くなります。実際、vagrant up
はダウンロード時のサイズがDockerコンテナと比べて大きく、動作も重いです。
それに対し、Dockerは共通部分はできるだけホストOSの機能を使うようにすることでコンテナのサイズを小さくし、素早く起動・削除ができるようになっています。Vagrantより気軽にぽこぽこ立てられるイメージです。
DockerだとWindowsでつらい
Dockerはカーネル部分をホストOSに依存します。その結果、Windowsではうまく動かない場面がいくつか出てきます(参考: WindowsとDockerは食い合わせが悪い)。
それに対し、Vagrantは完全にOSをシミュレーションするのでWindowsとMac間でも大きな修正なく動いたりと、DockerよりはWindowsでうまく動くケースが多かったです。
Dockerは割と環境を汚す
Docker使えば環境汚さないとかって言いますが、Docker立ち上げるとポート使ったり不要になったコンテナが残りっぱなしになったりと割と環境を汚します。環境をできるだけ汚さないようにしたいのならばVagrantの方に軍配が上がります。
ちなみに、Docker使いながら環境汚したくなければVagrantの上にDockerを立てればいいです。
さいごに
どちらも用途的にはちょっと違うんですが、仮想化したいという時に用いられるものではあります。下にそれぞれのシチュエーションについて書いてみました。
Dockerのみを使う
- 素早く簡単に環境を立てたり壊したりしたい
- Vagrantが重くて辛い
- マイクロサービス開発
Vagrantのみを使う
- オンプレシングルサーバー向けに開発
- いろいろインストールして安定して使える環境がほしい
- ホストOSの影響をできるだけ受けたくない
DockerとVagrantを併用する
- WindowsやMacなどの複数の環境でマイクロサービスを開発したい
という感じです。まる。