VirtualBoxとVagrantでDocker環境構築

VirtualBox、Vagrantを使ってDocker環境がさくっと作れたので共有します。
※Windows10で検証しています。

# 使用バージョン
- Oracle VM VirtualBox：　6.0.10
- Vagrant： 2.2.5

※自分の環境で使っていたバージョンです。最新版では試せていません。

# VirtualBoxのインストール
以下のサイトからインストーラーをダウンロードしてインストールします。(インストール済みの場合は省略可)
対象バージョンの「Windows hosts」をクリックするとダウンロードが開始されます。
https://www.virtualbox.org/wiki/Downloads


# Vagrantのインストール
以下のサイトからインストーラーをダウンロードしてインストールします。(インストール済みの場合は省略可)
「DOWNLOAD <バージョン>」をクリックするとダウンロードが開始されます。
https://www.vagrantup.com/


# VagrantでDocker環境作成
以下の手順を順次実施し、Linux仮想環境を作成、ログインします。
※手順はvagrantを使ったことがない人用に細かく書いています。
※手順内容は以下のフォルダ構成を作成し、下記のVagrantfileで`vagrant up`するだけです。

```text:フォルダ構成
handson　(任意の場所に作成)
　└ share　(作成した仮想マシンと共有されるフォルダ)
　└ Vagrantfile
```

1. 任意の場所に新規にフォルダを作成。(フォルダ名は任意。例：handson)
2. コマンドプロンプトを起動し、カレントフォルダを1で作成したフォルダに移動
3. `vagrant init`を実行。
4. 3によって作成されるVagrantfileをエディタで開き、下記のVagrantfileの内容に書き換え保存して閉じる。
5. `mkdir share`を実行し、Vagrantfileと同じ場所にshareフォルダを新規作成。
6. `vagrant up`を実行し、ゲストマシンが起動するまで待つ。
7. `vagrant status`で状態確認。　(runningになっていることを確認)
8. `vagrant ssh`を実行し、ゲストマシンにログイン。
9. `docker version`や`docker info`を実行し、Dockerコマンドがインストールされていることを確認。

※2はファイルエクスプローラーのアドレスバーをクリックしてcmdを実行で、移動した状態で起動できます。
※コマンドプロンプトではなく、git bashなどを使用しても大丈夫です。

```ruby:Vagrantfile
Vagrant.configure("2") do |config|
  config.vm.box = "centos/7"
  config.vm.hostname = "handson"
  config.vm.network "private_network", ip: "192.168.10.10"
  config.vm.synced_folder "./share", "/home/vagrant/ws", mount_options: ['dmode=755','fmode=644']
  config.vm.provider "virtualbox" do |v|
    v.name = "handson"
    v.memory = 4096
    v.cpus = 2
  end
  config.vm.provision "docker"
  config.vm.provision "shell", inline: <<-SHELL
    # インストール済みのパッケージをアップデート
    yum update -y
    # yum のリポジトリ追加
    yum install epel-release -y
    # マニュアルページ、vim、gitを追加
    yum install man-pages.noarch man-pages-ja.noarch vim-enhanced git -y
    # docker-composeインストール
    curl -L "https://github.com/docker/compose/releases/download/1.25.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
    chmod +x /usr/local/bin/docker-compose
    # docker-compose補完機能インストール
    curl -L https://raw.githubusercontent.com/docker/compose/1.25.0/contrib/completion/bash/docker-compose -o /etc/bash_completion.d/docker-compose
  SHELL
end
```

VagrantにはDocker用のProvisionerがあるので、それを利用しています。
今回はインストールのみに使用していますが、イメージのビルドやプル、起動などもできるようです。
参考：[Docker Provisioner](https://www.vagrantup.com/docs/provisioning/docker.html)

おまけでshellでコマンドを実行してdocker-composeもインストールしています。
docker-composeのバージョンについては[Releases docker/compose (GitHub)](https://github.com/docker/compose/releases)で確認できます。
参考：[Docker Compose](https://docs.docker.com/compose/)、[Docker Compose 日本語](https://matsuand.github.io/docs.docker.jp.onthefly/compose/)

yumでインストールしている内容はご自由にどうぞ。

# 補足：よく使うVagrant コマンド
環境構築にVagrantを使用しているため、よく使うコマンド一覧を補足として載せておきます。

```
$ vagrant init
　現在のディレクトリをVagrant環境になるように初期化。(Vagrantfileの作成)
$ vagrant up
　Vagrantfileに従ってゲストマシンを作成および構成、起動。
$ vagrant status
　ゲストマシンの状態確認。
$ vagrant ssh
　実行中のゲストマシンにSSH接続。
$ vagrant halt
　稼働中のゲストマシンをシャットダウン。
$ vagrant reload
　再起動(haltした後に、upするのと同等)。
$ vagrant destroy
　実行中のゲストマシンを停止し、作成されたすべてのリソースを破棄。
$ vagrant plugin list
　インストールされたプラグインとバージョンを表示
$ vagrant plugin update [<name>]
　インストールされているプラグインの更新。(制約がある場合は制約優先)
$ vagrant plugin install <name> [<name2> <name3> ...]
　プラグインのインストール。(インストール済みの場合は更新)
$vagrant plugin uninstall <name> [<name2> <name3> ...]
　プラグインのアンインストール。依存関係もアンインストールする。
```

参考：[Command-Line Interface](https://www.vagrantup.com/docs/cli/)

#おわり
VirtualBox、Vagrantでさくっと環境構築できました。
Windowsの場合、頑張ってWindows(Hyper-V)でやろうとするより、
Linux環境を作った方が比較的簡単なのでおすすめです。

ただし、今回の方法では、一般ユーザがdockerグループに入ってしまいます。
([Dockerでユーザーをdockerグループに追加することの危険性を理解しよう](https://qiita.com/matyapiro31/items/3e6398ce737e2cdb5a22))
勉強用または開発用の環境と割り切って使用するのが良いかと思います。

ちなみに、[bento/amazonlinux-2](https://app.vagrantup.com/bento/boxes/amazonlinux-2)で試してみたら
以下のようなエラーメッセージが表示されインストールに失敗しました。
Docker用のProvisionerをサポートしていないboxもあるようです。

```
ERROR: Unsupported distribution 'amzn'
```

今回は以上です。