Docker for Macで開発環境がほんとに早くなったのか？（心の中のモヤ×100がモヤ×99になった）

## 背景
開発環境をVirtualBox上から、Dockerコンテナを使ったものに作り変える機会を頂いて、得た知識をすこしでも共有するために社内勉強会や外部でも発表する機会があったのですが、毎回『Dockerだと(VitualBoxを使う場合と比較して動作が)早い』という自分の言葉に、後ろめたい気持ちを隠せずにいました。  
案の定、勉強会ではそのあたりを突っ込まれ、  

**・ω・**  

ってなるわけです。(そして苦し紛れにわけのわからないことを答える...)

というわけで、今回は少しそのあたりを調べてみようと思いまして、この記事を書いてます。 
タイトルにも書いているのですが、内容的はモヤ×5がモヤ×4くらいになったような感じです。 
むしろわからないとこが増えた気がしますが、少し前進ということでモヤ-1してみました。  

結果、Dockerコンテナの恩恵というよりもどうやら仮想マシンの特徴の違いで早くなったのかなと理解しております。 
そうなった経緯をだらだら書いていきます〜 

## コンテナ型の仮想化
dockerはコンテナ型の仮想化を行うツールです。
ホストOS上で名前空間を作って論理的にOSを分割し、仮想的にOSを作ります。
そのため、ホストOSが持っているネットワークインターフェース等を共有します。
さらにOSはすでに起動しているので起動にかかる時間がありません。
リソースも共有できるので動作も軽くなります。  

もう少し詳しく調べると  
dockerはホストOSのファイルシステム上に作成されたひとつのディレクトリの中に、独自のファイルシステムを作成してchrootというコマンドを使ってプロセスから参照できるルートディレクトリを変更することで、実現されているみたいです。

ホストOSのプロセスとコンテナの中で実行されているプロセスは同じものだけど、chrootでルートディレクトリを特定のディレクトリに閉じ込めている感じ  
言いたいことは、少し特殊なプロセスがホストOS上に走ってるだけなんだよということです。  

## Macでdockerを使うということ
> ホストOS上で名前空間を作って論理的にOSを分割し、仮想的にOSを作ります。

問題はこれですよ。  
MacOSX上でcentosとかubuntuとかのコンテナ動いちゃってるんです。  

どどどどどどどどどうゆうこと?  

正確にはカーネルを共有しているということなので調べてみると、MacOS XはXNU、ubuntu、centosはLinux kernelとやはり異なっています。
じゃあ動作しないのではないかな？と思ったのですが、裏で仮想マシンを立ててlinuxを動かしているようです。

MacでDockerを使う場合には、2016/8/27時点で2種類の方法がありますが  

* [Docker Toolbox](https://docs.docker.com/engine/installation/mac/#docker-toolbox)
* [Docker for Mac](https://docs.docker.com/engine/installation/mac/#docker-for-mac)

docker for macのケースの話をします。  

## そもそも仮想マシンはなんなのか？
仮想マシンは、

> 物理的なコンピュータを分割し、その中で独立したOSを持って動作する論理的なコンピュータ
> 仮想マシンを作るには仮想マシンソフトウェアが必要

ということです。  
仮想マシンソフトウェアにも種類があるようで主に3種類  

* ファームウェア型(LPAR, vPars)
* アプリケーション型(VMwarePlayer, VirtualBox)
* ハイパーバイザ型(Hyper-V, Xen, bHyve)

とわかれているそうです。   

この3つの違いはゲストOSをどのように乗せるかで大きく分類されているようです。
今回の話に関係あるのは **アプリケーション型** と **ハイパーバイザ型** なのでファームウェア型には触れずに2つの説明をざっくりします。  

### アプリケーション型
Webアプリケーションエンジニアだと最も馴染みがあるのはこちらでしょうか
実際に僕が所属するプロジェクトでも開発環境ではVirtualBoxを使用してました。

ゲストOSはこんな感じで動作します。  

![スクリーンショット 2016-08-27 20.28.43.png](https://qiita-image-store.s3.amazonaws.com/0/74197/416effaa-75e3-c909-8f0c-8bfcfbb3612f.png "スクリーンショット 2016-08-27 20.28.43.png")

ホストOSのアプリケーションとして動作している仮想マシンソフトウェアの上にゲストOSが乗っかっている状態です。    
ハードウェアへのアクセスはホストOS経由で行います。  

#### 長所
インストールの手軽さ  

#### 短所
ゲストOSの処理とホストOSの処理両方にリソースが必要なので、処理速度が遅くなってしまうという点です。  

### ハイパーバイザ型
あまり聞いたことがないのですが、調べてみると、こちらも知らず知らずに使っているみたいです。
AWSのEC2ではXenというハイパーバイザ型の仮想化ソフトウェアを利用しているそうです。

そんなハイパーバイザ型、ゲストOSはこんな感じで動いています。

![スクリーンショット 2016-08-27 20.29.03.png](https://qiita-image-store.s3.amazonaws.com/0/74197/0a24137f-bb34-c021-2bac-24412caa6a69.png "スクリーンショット 2016-08-27 20.29.03.png")

ハードウェアの上に仮想化ソフトウェアが直接動作しています。
ゲストOSと並列して管理OSも乗っかっているという形のようです。  

### 長所
ホストOSを介さずに直接ハードウェアの上に乗ってるため、動作速度の低下をおさえることができます。

### 短所
導入に時間がかかりそう...(http://qiita.com/dumpty-alma@github/items/9540529cbda70520d8f1)

## 早くなった訳
Docker for Macがハイパーバイザ型の仮想化を利用しているようです。
Yosemiteの時に導入されたHypervisor.frameworkを使って実装されている[xhyve](https://github.com/mist64/xhyve)というツールをバックエンドで利用しているようです。  
「早くなった」と感じた要因は

* ホスト型からハイパーバイザ型へ変わったことによってリソースを効率良く使えることになった動作速度の向上

なんじゃないかなと...
まだもやっと感は残るのですが、少し前進?

## 参考
1. PIDネームスペース(http://d.hatena.ne.jp/NeoCat/20081119/1227068137)
1. chroot(http://wa3.i-3-i.info/word13814.html)
1. Docker実践活用ガイド(http://amzn.to/2bopBCr)
1. 仮想マシンとは(https://thinkit.co.jp/free/tech/26/1/1.html)
1. ec2(https://en.wikipedia.org/wiki/Amazon_Elastic_Compute_Cloud)
2. OS X(https://en.wikipedia.org/wiki/OS_X)
3. ubuntu(https://en.wikipedia.org/wiki/Ubuntu_(operating_system))
4. cent os(https://en.wikipedia.org/wiki/CentOS)
1. xhyve(https://github.com/mist64/xhyve)
1. Hypervisor.framework(http://ascii.jp/elem/000/001/043/1043010/index-3.html)