VirtualBox+Vagrantで楽々Docker環境構築（Windows）

# はじめに
## なぜVirtualBox+Vagrantで環境構築するのか
Windows上でDockerを構築する際、[Docker Toolbox](https://www.docker.com/products/docker-toolbox)を一般的に使用します。そこで、ざっくり私的感覚で比較してみました。

|      |Docker Toolbox   |VirtualBox+Vagrant    |
|:-----|:----------------|:------------------|
| 長所 |インストール・初期設定が楽|プロキシ設定が容易、設定を共有（再配布）できる|
| 短所 | プロキシ設定がしづらい | インストールが面倒 |

### ■ Docker Toolbox
- 中身はVirtualBoxで起動している。
- インストーラでVirtualBoxやDockerをまとめてインストールしてくれてポチポチ設定すればいいのでインストールが楽でよい。
- VagrantのようにゲストOSに共通する設定ファイル(Vagrantfile)がなく、また細かい設定がしづらい（例えばプロキシ設定等）。

※Docker Toolboxでのプロキシ設定について
https://github.com/docker/toolbox/issues/102
http://qiita.com/heppoko_dev/items/d7aa33336998dc742ac0
http://qiita.com/ll_kuma_ll/items/09dd29377cc0a3d61d99

### ■ VirtualBox+Vagrant
- VirtualBox、Vagrantを個別にインストールしなければならないのでインストールが面倒。またDockerも別途準備しなければならない。ただDockerインストールに関してはVagrantfileに初期インストール設定を追記、再利用等すればインストールの効率化はできる。
- Docker Toolboxと比較してブラックボックスが少ないところとVituralBoxゲストOSの設定が一元管理・細かい設定が簡単にできるところがよい。
- VirtualBox+VagrantはDocker用途以外の環境構築でも使用できるのがよい。

### 結論
VagrantfileにDockerインストール設定や各種設定(プロキシ等)を用意しておけば、VitualBox、Vagrantのインストールのみで環境が構築できるし、他者のマシンでも同環境を構築しやすいといった利点が大きいため個人的にVirtualBox+Vagrantで構築する方をお勧めします。

# 構築手順
ではさっそく、VirtualBox+Vagrantで構築していきます。
ここでは、事前にDockerのインストールをはじめ、いくつかの設定が用意されているVagrantfileを使用して構築していきます。以降に書かれている内容は[私のGitHubリポジトリのReadme](https://github.com/sesela/vagrant-ubuntu-for-docker)に少し説明を加えた内容を記載しております。

## 1. VirtualBoxのインストール
VitualBoxを既にインストールしている場合は読み飛ばしてください。
[VitualBox本家サイト](https://www.virtualbox.org/wiki/Downloads)からWindows版をダウンロードしインストールします。

## 2. Vagrantのインストール
Vagrantを既にインストールしている場合は読み飛ばしてください。
[Vagrant本家サイト](https://www.vagrantup.com/downloads.html)からWindows版をダウンロードしインストールします。

## 3. Vagrantのプロキシの設定
プロキシを介してVagrantを使う場合はシステム環境変数に下記を追加します。
OSの環境変数に下記のように設定してください。

| 変数名     |値   |
|:-----|:----------------|
| HTTP_PROXY |http://<プロキシサーバ名>:<ポート番号>|
| HTTPS_PROXY |http://<プロキシサーバ名>:<ポート番号>|

【例】ホスト:proxy.mytest.co.jp、ポート:8080の場合
![proxy_env.png](https://qiita-image-store.s3.amazonaws.com/0/61752/be8045cd-bc86-48c9-2faa-c8cec847a156.png)


## 4. Vagrantのプラグインをインストール

### 4-1. vagrant-vbguestをインストール
仮想マシンのカーネルを新しくする度に Guest Additions を手動で再インストールする必要がありますが、vagrant-vbguestプラグインをインストールすることでその煩わしさを取り払ってくれます。便利プラグインなのでインストールすることをお勧めします。

 下記コマンドを実行します。

```bat:コマンドプロンプト
vagrant plugin install vagrant-vbguest
```

※詳細について知りたい方はこちらを参照
http://blog.amedama.jp/entry/2015/08/19/204044
https://github.com/dotless-de/vagrant-vbguest

### 4-2. vagrant-proxyconfをインストール
プロキシを介している場合はインストールしてださい。
このvagrant-proxyconfプラグインを利用すると、ゲストOSの以下の機能に対して Proxy の設定を自動的に行ってくれます。

- 多くのプログラムがサポートしているhttp_proxyなどの環境変数
- Chef provisioners
- Apt
- Docker
- Git
- npm
- PEAR
- Yum
- Subversion

 下記コマンドを実行します。

```bat:コマンドプロンプト
vagrant plugin install vagrant-proxyconf
```

※詳細について知りたい方はこちらを参照
http://weblabo.oscasierra.net/vagrant-proxyconf/
https://github.com/tmatilai/vagrant-proxyconf

## 5. Vagrantfileの取得
事前に私の方でVagranfileを作成しており、GitHubリポジトリに格納しています。
データを格納したいフォルダで下記コマンドを実行してVagrantfileを取得してください。

```bat:コマンドプロンプト
cd <適当なフォルダ>
git clone https://github.com/sesela/vagrant-ubuntu-for-docker.git
```

※下記サイトからzipでダウンロードし、Vagrantfileのみを配置してもOKです。
https://github.com/sesela/vagrant-ubuntu-for-docker

## 6. Vagrantfileの修正


### 6-1. proxyとvbguestの設定
- プロキシを介している場合、上記のようにプロキシ情報を設定してください。
- プロキシを介していない場合、プロキシのプラグインをインストールしていなければ修正の必要ないです。プラグインをインストールしている場合は「config.proxy.enabled  = false」にしてください。
- vbguestを上記のように設定してください。


```text:Vagrantfile
  ...
Vagrant.configure("2") do |config|

  if Vagrant.has_plugin?("vagrant-proxyconf")
    config.proxy.enabled  = true  # => true; all applications enabled, false; all applications disabled
    config.proxy.http     = "http://<プロキシホスト名>:<プロキシポート>"
    config.proxy.https    = "http://<プロキシホスト名>:<プロキシポート>"
    config.proxy.no_proxy = "localhost,127.0.0.1"
  end

  if Vagrant.has_plugin?("vagrant-vbguest")
    # set auto_update to false, if you do NOT want to check the correct
    config.vbguest.auto_update = true
  end

  # The most common configuration options are documented and commented below.
  ...
```

### 6-2. その他設定
特に設定する必要はありませんが、
ポートフォワードを設定したい、IPアドレスを変更したい場合は想定する環境に合わせて設定してください。
また、Windowsで起動することを想定しているため`Encoding.default_external = 'SJIS'`と設定しています。エンコードでエラーが発生する場合はコメントアウトなり対応するエンコードに設定してください。

## 7. ゲストOS起動
Vagrantfileの配置されているフォルダで下記コマンドを実行します。

```bat:コマンドプロンプト
vagrant up
```

※初回起動時はprovisionが起動されdocker,docker-compose等がインストールされます。

## 8. ゲストOSへログイン
ターミナル(TeraTerm、PuTTY等)を使ってVagrantfileで設定したIP（デフォルト: 192.168.33.10）へSSHでログインできます。
※ ID / PW : vagrant / vagrant

ゲストOSログイン後、下記コマンドでゲストOS上のDockerが起動されていることを確認できます。

```bash
sudo service docker status
```

```bash
docker-compose -version
```


## 9. ゲストOS停止
Vagrantfileの配置されているフォルダで下記コマンドを実行します。

```bat:コマンドプロンプト
vagrant halt
```


# 参照
[VirtualBox+VagrantでUbuntu環境構築](http://qiita.com/mikoski01/items/366cb9a90b7381a03db0)
[VirtualBox+VagrantでCentOS7環境構築](http://qiita.com/mikoski01/items/c3984901c22a7736d726)


以上。