Vagrant + VirtualBox で開発環境の構築｜既存のRailsプロジェクト + Mysql + Apatch

# はじめに
先日、自身で初めてvagrantで環境構築する機会がありました。
備忘録も兼ねて一連の流れを自分なりにまとめてみました。
併せて専門用語やつまづきそうな箇所の説明も載せました。
似たような環境で、開発環境を構築する方の参考になれば幸いです。

# 仮想マシンスペック
- OS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:　 CentOS release 7.1

- DB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:　mysql Ver 14.14 Distrib 5.5.41, for Linux (x86\_64) using readline 5.1

- Webサーバーソフト&nbsp;&nbsp;:　Apache/2.2.15 (Unix)

- Ruby&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:　ruby 2.1.5p273 [x86\_64]


ローカルOSはWidnowsです。


■目次

■□■□■□■□■□■□■

… 1\. 環境構築まえの準備

… 2\. 仮想マシンの作成

… 3\. 必要な関連ソフト及びRubyインストール | 開発環境の作成

… 4\. Mysql, Apatchインストール | 開発環境の作成

… 5\. Railsインストール | 開発環境の作成

… 6\. Railsの起動

■□■□■□■□■□■□■

# ■ 1.環境構築まえの準備

## Vagrant, Virtual boxとは ...
|ソフト名|役割|
|---|---|
|Vagrant|仮想マシンの停止・起動などを簡単に管理できる 「コマンドラインツール」
|Virtural box|仮想マシンを作る「仮想化ソフト」

つまり Vagrant を使えば、仮想マシンを **簡易にコマンド操作** できるようになります。

## ▼ Vagrant + Virtual box のインストール

まず次のサイトから、必要なソフトをダウンロードします。
・Vagtant　　&nbsp;&nbsp;&nbsp;https://www.vagrantup.com/
・VirtualBox 　 https://www.virtualbox.org/

インストールはインストーラーに従うだけで完了します。

## ▼ インストールされたか確認
次のコマンドを入力してください。

```terminal
$ vagrant -v
Vagrant 1.9.1
```

無事バージョンが返ってこればインストールは完了です。

## ▼ Vagrant 操作用のディレクトリを作成

次に CentOS インストール用ディレクトリを作成し、作成先のディレクトリへ移動しましょう。

```terminal
$ mkdir workspace
$ cd workspace
```

# ■ 2.仮想マシンの作成
Virtual box を使用して、仮想マシンを起動するためには OS イメージファイル(※ boxファイル)が必要です。
※ 今回の OS イメージファイルは、Chef 社で用意されている「[bento](https://github.com/chef/bento)」を使用しました。
## ▼ OS インストール

仮想マシンへ CentOS 7.1 をインストールします。
初期設定を行うために、次のコマンドを実行します。

```terminal
$ vagrant init bento/centos-7.1
```

実行すると「Vagrantfile」という初期設定ファイルが作成されます。

```terminal
$ ls
Vagrantfile
```

## ▼ 初期設定ファイル（Vagrantfile）の書き換え

次の２箇所の設定を書き換えます。
1. ネットワーク
2. 共有フォルダ

### ▽ 1.ネットワーク
ローカルホスト（作業しているPC）から仮想マシン上の Rasil サーバーへ接続できるようにネットワーク設定を変更します。
Vagrantfile を好みのテキストエディタで開いてください。

▶︎ workspace / Vagrantfile

```ruby
Vagrant.configure(2) do |config|
 # The most common configuration options are documented and commented below.
 # For a complete reference, please see the online documentation at
 # https://docs.vagrantup.com.
 # Every Vagrant development environment requires a box. You can search for
 # boxes at https://atlas.hashicorp.com/search.
 config.vm.box = "bento/centos-7.1"
 # Disable automatic box update checking. If you disable this, then
 # boxes will only be checked for updates when the user runs
 # `vagrant box outdated`. This is not recommended.
 # config.vm.box_check_update = false

 # Create a forwarded port mapping which allows access to a specific port
 # within the machine from a port on the host machine. In the example below,
 # accessing "localhost:8080" will access port 80 on the guest machine.



 # コメント(#)を外してポート番号を書き換える。
 config.vm.network "forwarded_port", guest: 3000, host: 3000 



 # Create a private network, which allows host-only access to the machine
 # using a specific IP.
 # config.vm.network "private_network", ip: "192.168.33.10"

 # Create a public network, which generally matched to bridged network.
 # Bridged networks make the machine appear as another physical device on
 # your network.
 # config.vm.network "public_network"

```

この設定でブラウザから仮想マシンに接続する接続先が `http://localhost:3000` になります。

ここで一度 Vagrant を使って、仮想マシンを起動できるか確認してみましょう。

```terminal
$ vagrant up
```

vagrantコマンド | 参考 

|コマンド|役割|
|---|---|
|vagrant up|Vagrantfileに基づいて仮想サーバーを起動|
|vagrant ssh|仮想サーバーに接続され、コマンド操作できるようになる|
|vagrant halt|仮想サーバーを停止|
|vagrant reload|Vagrantfileの設定を反映させる（ vagrant halt + vagrant up ）|
|vagrant destroy|仮想サーバーを消去|

### ▽ 2.共有フォルダ
#### 共有フォルダ機能とは ...
Vagrant には、ローカルと仮想マシン間のファイルを同期する機能があります。
この機能により、仮想マシン上にわざわざリモート接続（vagrant ssh）してファイルを編集する必要がなくなります。
つまり、ローカルファイルを編集するだけで、自動的に仮想マシン上のファイルに反映できます。

#### デフォルのフォルダ共有場所
|場所|ディレクトリ|
|---|---|
|**ローカル側**|./workspace|
|**仮想マシン側**&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|/home/vagrant|

別のフォルダ場所を共有したい場合は、Vagrantfile の次の箇所を変更します。

`config.vm.synced\_folder “ローカルのフォルダ場所”, “仮想マシン上のフォルダ場所”`

今回は以下の場所を共有しました。

▶︎ workspace / Vagrantfile

```ruby
Vagrant.configure(2) do |config|
 # other config here

 config.vm.synced_folder "./workspace", "/home/vagrant/rials_projects"
end
```

この設定を反映させるために仮想マシン側で不足しているものがあるので、次の作業（■ 3.Ruby及び...）に行く前にインストールします。

右のエラーが出るため。「yum update→カーネルアップデート→ VitualBox GuestAddition 破損」

```terminal
# ローカル
$ vagrant ssh

# 仮想マシン
$ sudo yum install kernel-devel
$ sudo yum install gcc make
$ exit

# ローカル
$ vagrant plugin install vagrant-vbguest
$ vagrant vbguest
```

ファイル共有できているか確認。

```terminal
$ vgrant ssh
$ cd /rails_projects/
$ ls
Vagrantfile
```

ここまでで仮想マシンの基本的な設定は完了です !

以降は、必要なソフトウェア類をインストールしていきます。

# ■ 3.必要な関連ソフト及びRuby インストール | 開発環境の作成

## ▼ 必要な関連ソフトのインストール
yumを最新化して諸々のパッケージをまとめてインストール。

```terminal
$ vagrant ssh
$ sudo yum update
$ sudo yum install -y gcc-c++ patch readline readline-devel zlib zlib-devel libyaml-devel libffi-devel openssl-devel make bzip2 autoconf automake libtool bison nodejs git vi
```

## ▼ Git インストールされたか確認

```terminal
$ git --version
ruby  git version 2.2.2
```

## ▼ rbenv のインストールと初期化

 rbenv をインストールし、初期化を行います。

```terminal
$ git clone git://github.com/sstephenson/rbenv.git ~/.rbenv
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
$ . ~/.bashrc
```

## ▼ ruby-build のインストール

```terminal
$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
$ cd ~/.rbenv/plugins/ruby-build
$ sudo ./install.sh
```

インストールされると、次のコマンドでインストール可能な ruby のバージョンを表示できます。

```terminal
$ rbenv install -l
```

## ▼ Rubyのインストール

```terminal
$ rbenv install 2.1.5
$ rbenv global 2.1.5
$ rbenv rehash
```

インストールされたか確認。

```terminal
$ ruby -v
ruby 2.1.5
```

# ■ 4.Mysql, Apache インストール | 開発環境の作成

## ▼ Mysqlのインストールと初期設定
次のコマンドで Mysql の Yum レポジトリを追加。

```terminal
$ yum localinstall http://dev.mysql.com/get/mysql57-community-release-el6-7.noarch.rpm
```

インストールできたか確認。

```terminal
$ yum repolist all | grep mysql

mysql-connectors-community/x86\_64 MySQL Connectors Community 有効:

mysql-connectors-community-source MySQL Connectors Community - So 無効

mysql-tools-community/x86\_64 MySQL Tools Community 有効:

mysql-tools-community-source MySQL Tools Community - Source 無効

mysql55-community/x86\_64 MySQL 5.5 Community Server 無効

mysql55-community-source MySQL 5.5 Community Server - So 無効 \<---注目

mysql56-community/x86\_64 MySQL 5.6 Community Server 無効   

mysql56-community-source MySQL 5.6 Community Server - So 無効

mysql57-community/x86\_64 MySQL 5.7 Community Server 有効:    \<---注目

mysql57-community-source MySQL 5.7 Community Server - So 無効
```

上記の例では、5.7が有効、5.5が無効になっています。

バージョンの切り替えには Yum の設定変更用の yum-utils パッケージが必要なので、インストールします。

```terminal
# yum-utilsがインストールされているか確認
$ yum list installed | grep yum-utils            

# 入ってなければyum-utilsをインストールする
$ yum -y install yum-utils                       

# 5.7を無効に設定
$ yum-config-manager --disable mysql57-community 

# 5.5を有効に設定
$ yum-config-manager --enable mysql55-community  
```

設定できているか再確認します。
5.5が有効になっていれば大丈夫です。

公式リポジトリにある、mysql-community-server パッケージをインストールします。
Mysql のバージョンが5.5になっているのを確認。

```terminal
$ yum info mysql-community-server

...(略)...

Name : mysql-community-server

Arch : x86\_64

Version : 5.5.62

Release : 2.el6

Size : 38 M

Repo : mysql55-community

Summary : A very fast and reliable SQL database server

URL : http://www.mysql.com/

License : Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved. Under GPLv2 license as

: shown in the Description field.

Description : The MySQL(TM) software delivers a very fast, multi-threaded, multi-user,

...(略)...
```

インストールします。

```terminal
$ yum -y install mysql-community-server
```

インストールしたらバージョンを確認。

```terminal
$ mysql --version
mysql Ver 14.14 Distrib 5.5.62, for Linux (x86\_64) using readline 5.1
```

root やセキュリティの設定を一括で行います。

```terminal
$ sudo mysql_secure_installation
```

root で入れるか試します。

```terminal
$ mysql -u root -p
```

## ▼ Apache のインストール
yum でインストールできる Apache のバージョンを確認。

```terminal
$ yum list | grep httpd
```

Apache のインストール。

```terminal
$ sudo yum install -y httpd
```

インストールされたバージョンを確認。

```terminal
$ httpd -v
Server version: Apache/2.2.15 (Unix)
Server built:   Jun 19 2018 15:45:13
```

起動と自動起動設定。

```terminal
$ sudo /etc/init.d/httpd start
$ sudo chkconfig httpd on
```

# ■ 5.Rails インストール | 開発環境の作成

## ▼ bundlerのインストール

```terminal
$ gem install bundler 
# バージョンを指定する場合は 「gem install bundler -v '~\>1'」のようにオプションを指定。
```

インストールできたか確認。

```terminal
$ bundler -v
Bundler version 1.17.3
```

## ▼ Rails + その他のライブラリをインストール

bundler を使って、gemfile に記載された諸々のライブラリ(指定バージョンの Rails を含む)をインストール。

```terminal
$ bundle install --path=~/vendor/bundle 
```

「--path=vendor/bundle」ではないことに注意。
フォルダ共有機能で設定しているディレクトリ(--vendor/bundle)にbundle installしようとするとエラーが出る。
[参考記事](https://innossh.hatenablog.com/entry/2015/06/10/195623)

「rails コマンド」をつかえるように、グローバルに rails をインストール。

```terminal
$ gem install rails 
# バージョンを指定する場合は 「gem install rails -v '5.2.4'」のようにオプションを指定。
```

# ■ 6. Rails の起動

## ▼ vagrant に設定を反映

vagrant に設定を反映するために、以下を実行します。

```terminal
# 停止
$ vagrant halt

# 立ち上げ
$ vagrant up

# 仮想マシンへ入る
$ vagrant ssh
```

仮想マシン上のデータベースに migration ファイルの設定を反映させます。

```terminal
$ rails db:migrate
```

rails server の起動。

```terminal
$ rails server -b 0.0.0.0 
```

「-b 0.0.0.0」オプション（全てのIPアドレスからアクセス可）は、ブラウザからアクセスできるように指定。
rails server のみだとIPアドレスが 127.0.0.1 に指定され、localhost なので 外部から（仮想環境の外から）はアクセスできません。
[参考記事](https://qiita.com/Masato338/items/f162394fbc37fc490dfb)

ブラウザで http://localhost:3000/ にアクセス。

お疲れ様でした！

# まとめ

以上、開発環境構築の手順（初めてVagrantを使う方に向けて）でした。

ミスがあった場合は忌避なく指摘をいただけると幸いです。

見て下さり、ありがとうございました。

# 参考書籍
[独習Ruby on Rails](https://www.amazon.co.jp/dp/B07QW41QCM/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)