Vagrant + Virtualboxで仮想環境構築

※2016年11月に、別のブログで書いた記事を移行したものです。

---

Vagrantは、VirtualBoxと合わせて、コマンドだけで簡単に仮想環境を立ち上げたり潰したりすることができるツールです。
今回は、Windows上でCentOS7の環境を構築したいと思います。コマンドプロンプトを使えば良いですが、ここではGit Bushを使っています。

## VirtualBoxのインストール
[Downloads – Oracle VM VirtualBox](https://www.virtualbox.org/wiki/Downloads)

## Vagrantのインストール
[Download - Vagrant by HashiCorp](https://www.vagrantup.com/downloads.html)

## Boxのダウンロード
Boxファイルとは、仮想環境の元になるファイルのこと。
[https://github.com/CommanderK5/packer-centos-template/releases/download/0.7.2/vagrant-centos-7.2.box](http://www.vagrantbox.es/)から、好きなOSをダウンロードする。
今回は、CentOS 7.2を選択する。
Git Bush（もしくはコマンドプロンプトなど）を立ち上げ、以下のコマンドを実行する。

    $ vagrant box add CentOS72 https://github.com/CommanderK5/packer-centos-template/releases/download/0.7.2/vagrant-centos-7.2.box
    ==> box: Box file was not detected as metadata. Adding it directly...
    ==> box: Adding box 'CentOS72' (v0) for provider:
        box: Downloading: https://github.com/CommanderK5/packer-centos-template/releases/download/0.7.2/vagrant-centos-7.2.box
        box:
    ==> box: Successfully added box 'CentOS72' (v0) for 'virtualbox'!

以下のコマンドで確認できる。

    $ vagrant box list
    CentOS72 (virtualbox, 0)

## 仮想マシンの起動

好きなディレクトリに移動し、Vagrantfile（Vagrantの設定ファイル）を作成する。
好みの問題だが、プロジェクトごとに環境を用意すると管理しやすいので、"c\Project\プロジェクト名"などのディレクトリを作り、その中でVagrantfileを作成すると良い。

    $ cd /c/Projects
    $ mkdir [プロジェクト名]
    $ cd [プロジェクト名]
    $ vagrant init CentOS72
    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.

Vagrantfileが作成されている

    $ dir
    Vagrantfile

仮想マシン起動する

    $ vagrant up
    Bringing machine 'default' up with 'virtualbox' provider...
    ==> default: Importing base box 'CentOS72'...
    ==> default: Matching MAC address for NAT networking...
    ==> default: Setting the name of the VM: gtd_console_default_1478779101548_74836
    ==> default: Clearing any previously set network interfaces...
    ==> default: Preparing network interfaces based on configuration...
        default: Adapter 1: nat
    ==> default: Forwarding ports...
        default: 22 (guest) => 2222 (host) (adapter 1)
    ==> default: Booting VM...
    ==> default: Waiting for machine to boot. This may take a few minutes...
        default: SSH address: 127.0.0.1:2222
        default: SSH username: vagrant
        default: SSH auth method: private key
        default:
        default: Vagrant insecure key detected. Vagrant will automatically replace
        default: this with a newly generated keypair for better security.
        default:
        default: Inserting generated public key within guest...
        default: Removing insecure key from the guest if it's present...
        default: Key inserted! Disconnecting and reconnecting using new SSH key...
    ==> default: Machine booted and ready!
    ==> default: Checking for guest additions in VM...
        default: The guest additions on this VM do not match the installed version of
        default: VirtualBox! In most cases this is fine, but in rare cases it can
        default: prevent things such as shared folders from working properly. If you see
        default: shared folder errors, please make sure the guest additions within the
        default: virtual machine match the version of VirtualBox you have installed on
        default: your host and reload your VM.
        default:
        default: Guest Additions Version: 4.3.30
        default: VirtualBox Version: 5.1
    ==> default: Mounting shared folders...
        default: /vagrant => C:/Projects/gtd_console

Git Bashの場合、以下のコマンドでログインできる。コマンドプロンプトの場合、SSH接続は対応していないので、TeraTermなどを使ってログインする。

    $ vagrant ssh
    [vagrant@localhost ~]$

## Vagrantfileの設定
仮想マシンの設定をする。

#### ポートを開ける
例えば、Railsなら3000、Jenkinsなら8080を使う。
以下を、Vagrantfileに追記

    config.vm.network "forwarded_port", guest: 3000, host: 3000
    config.vm.network "forwarded_port", guest: 8080, host: 8080

コメントアウトされている部分を参考にできる。

    # config.vm.network "forwarded_port", guest: 80, host: 8080

### メモリとCPU数を指定
以下の部分のコメントアウトを外して、仮想マシンにメモリを割り当てる。

      # config.vm.provider "virtualbox" do |vb|
      #   # Display the VirtualBox GUI when booting the machine
      #   vb.gui = true
      #
      #   # Customize the amount of memory on the VM:
      #   vb.memory = "1024"
      # end

      config.vm.provider "virtualbox" do |vb|
      #   # Display the VirtualBox GUI when booting the machine
      #   vb.gui = true
      #
      #   # Customize the amount of memory on the VM:
        vb.memory = "2048"
        vb.cpus = 2
      end
**参考**
[Configuration - VirtualBox Provider - Vagrant by HashiCorp](https://www.vagrantup.com/docs/virtualbox/configuration.html)

### 共有フォルダを指定
以下をコメントアウトして設定することで、ゲストOSとホストOSでフォルダを共有することができる。

      # config.vm.synced_folder "../data", "/vagrant_data"

今回は、以下のように指定する。

      config.vm.synced_folder "./data", "/home/vagrant/data"

## CentOS7のタイムゾーン設定

    $ timedatectl list-timezones | grep tokyo
    $ timedatectl list-timezones | grep Tokyo
    Asia/Tokyo
    $ sudo timedatectl set-timezone Asia/Tokyo
    $ timedatectl
          Local time: Thu 2016-11-17 23:33:07 JST
      Universal time: Thu 2016-11-17 14:33:07 UTC
            RTC time: Thu 2016-11-17 23:33:07
           Time zone: Asia/Tokyo (JST, +0900)
         NTP enabled: n/a
    NTP synchronized: no
     RTC in local TZ: yes
**参考**
[Windows上でVirtualBox+Vagrant+CentOSによる仮想環境構築 - Qiita](http://qiita.com/hiroyasu55/items/11a4c996b0c62450940f)

## 補足

**VirtualBoxを見てみると**
プロジェクト名_default_1478779101548_74836 という名前で仮想マシンができている。
Vagrantが、VirtualBoxでの仮想マシンの作成・起動・停止などを代行してくれているということだろう。