Windows10でVirtualBox+Vagrant+CentOS7の仮想マシンを作る

#この記事について
この記事は自分が昨年ブログ記事にしたものを工程を再確認しつつ再編集したものです。
ひとまず、標準的な組み合わせのVirtualBoxとVagrantで仮想マシンを起動するまでを記事にします。

#前提条件
- ホストOSはWindows10
- VirtualBoxで仮想化
- ゲストOSはCentOS7
- Windows10標準のHyper-Vは無効

#VirtualBoxのインストール
VirtualBoxは仮想マシンを手軽に作成できるソフトです。
利用の前提条件として、「**Windows10標準のHyper-Vと共存できない**」という特徴があります。すでにHyper-Vを有効にしている場合には、無効にしておく必要があります。

まずはこれを[ダウンロード](https://www.virtualbox.org/wiki/Downloads)してインストールします。インストーラーを起動して、任意（仮想マシンのイメージは巨大になりがちなのでCドライブ以外にした方が良いです）の場所を指定します。
インストール完了後にすぐに設定を変更するので、完了したら起動するにチェックを入れておきます。

インストールが完了してVirtualBoxが起動したら、ファイル＞環境設定＞一般から、「デフォルトの仮想マシンフォルダー」を変更しておきます。既定ではuserフォルダ内になっていますので、変更しないと危険です。

実際のマシンの作成はVagrantにお任せするので、これでVirtualBoxのGUIを終了させて次の作業に移ります。

#Vagrantのインストール
Vagrantは仮想マシンをDockerでいうコンテナのように扱うことを可能にするツールです。
環境の構築手順や設定を様々なローカル環境でも共通化できるため、開発・テストの環境の管理で特に威力を発揮します。
テストを繰り返し行ったあとにクリーンな環境に戻したり、新しい条件を追加した別の環境を作ってテストをする、などの場合に、負担を大幅に削減できます。

インストールは、個人的には初期設定も肩代わりしてくれる[Scoopでインストールする](https://qiita.com/talesleaves/items/0880bf31359715035a3c)のがおすすめです。
インストーラーを[ダウンロード](https://www.vagrantup.com/downloads.html)してインストールする場合も同じですが、Vagrantのインストール中は**フリーズしたかと思うくらい反応がなくなることがある**ことに留意してください。コーヒーでも飲みつつ待ちましょう。

インストーラーからインストールした場合には、Vagrantのデータの保存場所を任意に作成して、VAGRANT_HOMEとして環境変数に設定しておきます。既定ではVirtualBoxと同様にuserフォルダに仮想マシンのベースイメージを含んだ諸々のデータを格納してしまいます。
Scoopによるインストールの場合は、`Scoopのインストールフォルダ\apps\vagrant\.vagrant.d`が規定となるので、通常は変更の必要はありません[^1]。
[^1]: Scoopをcドライブにインストールしていないならば

インストールとVAGRANT_HOMEの設定が完了したら、一度Windowsを再起動します。

#テスト代わりに仮想マシンを起動する
ここではテストとして、ひとまず何もインストールされていない空のCentOSマシンを起動させます。
Scoopを利用している場合も含め、操作にはPowerShellを使うのがおすすめです。

```powershell:直接入力
#空フォルダ（"プロジェクトフォルダ"になる）を作成して移動
>md \path_to_dir\any_name
>cd \path_to_dir\any_name

#Vagrantのプロジェクトフォルダの初期化
>vagrant init centos/7
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant

#起動
>vagrant up
#ログが表示されます

#状態の確認
>vagrant status
Current machine states:

default                   running (virtualbox)#defaultというマシンがVirtualBox上で起動中

#sshログイン
> vagrant ssh
[vagrant@localhost ~]$ exit
logout
Connection to 127.0.0.1 closed.

#仮想マシンの停止
>vagrant halt
==> default: Attempting graceful shutdown of VM...

#仮想マシンの廃棄
>vagrant destroy
    default: Are you sure you want to destroy the 'default' VM? [y/N] y
==> default: Destroying VM and associated drives...
```
上記の流れでひとまずの動作確認が終了です。
各コマンドの意味は以降で説明していきます。

#Vagrantの基本コマンド
##vagrant init <Box名>
`vagrant init <Box名>`は、Box名で指定された仮想マシンのベースとなる"Box"のイメージ指定して、設定となるVagrantfileのテンプレートを生成します。

"Box"はVagrantの仮想マシンの最小限のイメージで、[公式のBoxカタログ](https://app.vagrantup.com/boxes/search)から見つけることができます。
カタログに登録されているBoxは多種多様ですが、登録されているBoxそのものはVagrantの開発元であるHashiCorpが管理しているわけではありません。そのため、その管理者やBoxの内容、更新履歴はきちんと確認するする必要があります。
OSやアプリケーションの開発元のコミュニティが管理しているBoxを利用するのが無難です。
上記の例では、CentOSのコミュニティが登録しているCentOS7のBoxを指定しています。

##vagrant up
`vagrant up`は現在のプロジェクトフォルダ内のVagrantfileの設定に従って、仮想マシンを起動させます。
初回の起動時にはBoxのダウンロードやアプリケーションの展開が行われるため若干の時間がかかりますが、2回目以降の起動は短時間になります。

##vagrant ssh
`vagrant ssh`は、Vagrantが提供するクライアントから作成したマシンへsshでログインします。
initを実行しただけの状態でも、ログインできる状態になっています[^2]。
[^2]: Vagrantのsshは少々遅いので実際の運用には別途クライアントを用意した方が良いです

##vagrant halt
`vagrant halt`は仮想マシンをシャットダウンします。

##vagrant destroy
`vagrant destroy`は現在のプロジェクトフォルダで管理される仮想マシンを廃棄します[^3]。
[^3]: 実体はVirtualBoxの仮想マシンフォルダの中にある
ベースになっているBoxやVagrantfileはVagrantのフォルダやプロジェクトフォルダやに残りますので、再度`vagrant up`を実行するとマシンを再作成できます。
-fオプションで廃棄の確認をしないようにすることができます。

`vagrant up`と`vagrant destroy`で何度でも環境を作り直すことができることがVagrantの強みです。

#まとめ
以下が、最低限の仮想マシンを起動できるまでの手順となります。

- VirtualBoxをダウンロードしてインストール、「デフォルトの仮想マシンフォルダー」をCドライブ以外の任意のフォルダーに変更しておく
- Vagrantをインストールして、環境変数VAGRANT_HOMEにCドライブ以外の任意のフォルダーを指定して[^4]再起動
[^4]: **Cドライブ以外にインストールされたScoop**によるインストールならデフォルトでもOK
- 任意の作業フォルダ（プロジェクトフォルダ）で`vagrant init <Box名>`を実行して仮想マシンを起動できる状態にする
- `vagrant up`で起動
- `vagrant ssh`でログインして作業可能


こうしてみると、意外と簡単に仮想マシンを構築できることがわかります。
しかしながら、仮想マシンを実際に利用しやすい状態にするためには、Vagrantfileへの設定の追加が必要です。
別記事で、[Vagrantfileの設定項目の概要と、CentOS7にDockerとMysql8のコンテナを展開する例](https://qiita.com/talesleaves/items/a2e809d7f752b6ee14c9)を書きたいと思います。