Windows 10 + VirtualBox + Vagrant + CentOS + Rails で、”Yay! You’re on Rails!”まで

# 環境構築後のバージョン情報

## ホスト OS 側
+ Windows 10 Home
+ Git Bash (git version 2.12.0.windows.1)
+ Vagrant 1.9.1
+ VirtualBox バージョン 5.1.14 r112924 (Qt5.6.2)

## ゲスト OS 側
+ CentOS Linux release 7.3.1611 (Core)
+ ruby 2.4.0p0 (2016-12-24 revision 57164) [x86_64-linux]
+ Rails 5.0.2

# Vargrant + CentOS7.3

## 必要なソフトのインストール

git、Vagrant、VirtualBox はそれぞれインストールしてください。

+ [Git for Windows](https://git-for-windows.github.io/)
+ [Vagrant by HashiCorp](https://www.vagrantup.com/)
+ [Oracle VM VirtualBox](https://www.virtualbox.org/)

## Vagrant の初期設定

MyCentOSRails フォルダに環境を構築する。
フォルダを作成し、Vagrantfile を作成する。

```shell-session
$ mkdir MyCentOSRails
$ cd MyCentOSRails
$ vagrant init bento/centos-7.3
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 の編集

固定 IP アドレスの設定を有効にする。
また、ネットワークを有効にするため、config.vm.provision にネットワークサービスの再起動を記述する。
編集後のファイルは以下のようになる。

```ruby:Vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :

# All Vagrant configuration is done below. The "2" in Vagrant.configure
# configures the configuration version (we support older styles for
# backwards compatibility). Please don't change it unless you know what
# you're doing.
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.3"

  # 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: 80, host: 8080

  # 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"

  # Share an additional folder to the guest VM. The first argument is
  # the path on the host to the actual folder. The second argument is
  # the path on the guest to mount the folder. And the optional third
  # argument is a set of non-required options.
  # config.vm.synced_folder "../data", "/vagrant_data"

  # Provider-specific configuration so you can fine-tune various
  # backing providers for Vagrant. These expose provider-specific options.
  # Example for VirtualBox:
  #
  # 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
  #
  # View the documentation for the provider you are using for more
  # information on available options.

  # Define a Vagrant Push strategy for pushing to Atlas. Other push strategies
  # such as FTP and Heroku are also available. See the documentation at
  # https://docs.vagrantup.com/v2/push/atlas.html for more information.
  # config.push.define "atlas" do |push|
  #   push.app = "YOUR_ATLAS_USERNAME/YOUR_APPLICATION_NAME"
  # end

  # Enable provisioning with a shell script. Additional provisioners such as
  # Puppet, Chef, Ansible, Salt, and Docker are also available. Please see the
  # documentation for more information about their specific syntax and use.
  config.vm.provision "shell", inline: <<-SHELL
    sudo systemctl restart network.service
  SHELL
end
```

## 仮想マシンの起動

```shell-session
$ vagrant up --provision
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'bento/centos-7.3'...
==> default: Matching MAC address for NAT networking...
==> default: Checking if box 'bento/centos-7.3' is up to date...
==> default: Setting the name of the VM: MyCentOSRails_default_1489019579135_82950
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
    default: Adapter 2: hostonly
==> 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: Warning: Remote connection disconnect. Retrying...
    default: Warning: Remote connection disconnect. Retrying...
    default: Warning: Remote connection disconnect. Retrying...
    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] GuestAdditions versions on your host (5.1.14) and guest (5.1.10) do not match.
Loaded plugins: fastestmirror
Determining fastest mirrors
 * base: ftp.jaist.ac.jp
 * extras: centosx4.centos.org
 * updates: ftp.iij.ad.jp
Package binutils-2.25.1-22.base.el7.x86_64 already installed and latest version
Package 1:make-3.82-23.el7.x86_64 already installed and latest version
Package 4:perl-5.16.3-291.el7.x86_64 already installed and latest version
Package bzip2-1.0.6-13.el7.x86_64 already installed and latest version
Resolving Dependencies
--> Running transaction check

...
...
...

Dependency Updated:
  glibc.x86_64 0:2.17-157.el7_3.1     glibc-common.x86_64 0:2.17-157.el7_3.1

Complete!
Copy iso file C:\Program Files\Oracle\VirtualBox\VBoxGuestAdditions.iso into the box /tmp/VBoxGuestAdditions.iso
mount: /dev/loop0 is write-protected, mounting read-only
Installing Virtualbox Guest Additions 5.1.14 - guest version is 5.1.10
Verifying archive integrity... All good.
Uncompressing VirtualBox 5.1.14 Guest Additions for Linux...........
VirtualBox Guest Additions installer
Removing installed version 5.1.10 of VirtualBox Guest Additions...
Copying additional installer modules ...
Installing additional modules ...
vboxadd.sh: Building Guest Additions kernel modules.
vboxadd.sh: You should restart your guest to make sure the new modules are actually used.
vboxadd.sh: Starting the VirtualBox Guest Additions.

Could not find the X.Org or XFree86 Window System, skipping.

==> default: Checking for guest additions in VM...
==> default: Configuring and enabling network interfaces...
==> default: Mounting shared folders...
    default: /vagrant => D:/vagrant/MyCentOSRails
==> default: Running provisioner: shell...
    default: Running: inline script

$
```

## 仮想マシンに接続

```shell-session
$ vagrant ssh
[vagrant@localhost ~]$
```

以下、コマンドプロンプトの```[vagrant@localhost ~]```は省略

# Ruby のインストール

## インストールされているバージョンの確認

```shell-session
$ ruby -v
-bash: ruby: command not found
```

この環境では、インストールされていない。
インストールされているバージョンが最新版でない場合は、

```shell-session
$ sudo yum remove ruby
```

で削除しておく。


## git のインストール

```shell-session
$ sudo yum install -y git
```
## rbenv のインストール

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

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

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

## rbenv の動作確認

```shell-session
$ rbenv -v
rbenv 1.1.0-2-g4f8925a
```

## 必要なパッケージのインストール

ruby のインストールに必要なパッケージをインストールする。

```shell-session
sudo yum install -y openssl-devel readline-devel zlib-devel
```

## ruby のインストール

インストールできる ruby のバージョンを確認する。

```shell-session
$ rbenv install -l
...
...
...
  2.3.1
  2.3.2
  2.3.3
  2.4.0-dev
  2.4.0-preview1
  2.4.0-preview2
  2.4.0-preview3
  2.4.0-rc1
  2.4.0
  2.5.0-dev
...
...
...
```

バージョンを指定して ruby をインストールする。

```shell-session
$ rbenv install 2.4.0
Downloading ruby-2.4.0.tar.bz2...
-> https://cache.ruby-lang.org/pub/ruby/2.4/ruby-2.4.0.tar.bz2
Installing ruby-2.4.0...
Installed ruby-2.4.0 to /home/vagrant/.rbenv/versions/2.4.0

$
```

インストールした ruby を反映させる。

```shell-session
$ rbenv rehash
```

```shell-session
$ rbenv global 2.4.0
```

ruby のバージョン確認

```shell-session
$ ruby -v
ruby 2.4.0p0 (2016-12-24 revision 57164) [x86_64-linux]
```

# Rails のインストール

## Rails のインストール

```shell-session
$ gem install rails
```

```shell-session
$ rails -v
Rails 5.0.2
```

## SQLite のインストール

```shell-session
$ sudo yum install -y sqlite-devel
```

## Node.jsのインストール

Railsでアプリケーションを動作させるため、Node.js をインストールする

```shell-session
$ sudo yum install -y epel-release
$ sudo yum install -y nodejs npm
```

# Ruby on Rails チュートリアル

[1.3 最初のアプリケーション](https://railstutorial.jp/chapters/beginning?version=5.0#sec-the_hello_application) の手順で、アプリケーションを作成する

```shell-session
$ cd
$ mkdir workspace
$ cd workspace
```

## 新規作成

```shell-session
$ rails new hello_app
```

## Bundler

```shell-session
$ cd hello_app
$ bundle install
Using rake 12.0.0
Using concurrent-ruby 1.0.5
Using i18n 0.8.1
Using minitest 5.10.1
Using thread_safe 0.3.6
Using builder 3.2.3
Using erubis 2.7.0
Using mini_portile2 2.1.0
Using rack 2.0.1
Using nio4r 2.0.0
Using websocket-extensions 0.1.2
Using mime-types-data 3.2016.0521
Using arel 7.1.4
Using byebug 9.0.6
Using coffee-script-source 1.12.2
Using execjs 2.7.0
Using method_source 0.8.2
Using thor 0.19.4
Using debug_inspector 0.0.2
Using ffi 1.9.18
Using multi_json 1.12.1
Using rb-fsevent 0.9.8
Using puma 3.7.1
Using bundler 1.14.6
Using sass 3.4.23
Using tilt 2.0.6
Using sqlite3 1.3.13
Using turbolinks-source 5.0.0
Using tzinfo 1.2.2
Using nokogiri 1.7.0.1
Using rack-test 0.6.3
Using sprockets 3.7.1
Using websocket-driver 0.6.5
Using mime-types 3.1
Using coffee-script 2.4.1
Using uglifier 3.1.5
Using rb-inotify 0.9.8
Using turbolinks 5.0.1
Using activesupport 5.0.2
Using loofah 2.0.3
Using mail 2.6.4
Using listen 3.0.8
Using rails-dom-testing 2.0.2
Using globalid 0.3.7
Using activemodel 5.0.2
Using jbuilder 2.6.3
Using spring 2.0.1
Using rails-html-sanitizer 1.0.3
Using activejob 5.0.2
Using activerecord 5.0.2
Using spring-watcher-listen 2.0.1
Using actionview 5.0.2
Using actionpack 5.0.2
Using actioncable 5.0.2
Using actionmailer 5.0.2
Using railties 5.0.2
Using sprockets-rails 3.2.0
Using coffee-rails 4.2.1
Using jquery-rails 4.2.2
Using web-console 3.4.0
Using rails 5.0.2
Using sass-rails 5.0.6
Bundle complete! 15 Gemfile dependencies, 62 gems now installed.
Use `bundle show [gemname]` to see where a bundled gem is installed.
$
```

## rails server の起動

```shell-session
$ rails server -b 0.0.0.0
```

## Yay! You’re on Rails!

ブラウザで、http://192.168.33.10:3000/ にアクセスする。
デフォルトのRailsページ が表示される。

![rails.jpg](https://qiita-image-store.s3.amazonaws.com/0/79874/63e6636b-637b-9e63-72fb-c72d66a60608.jpeg)

<br>
<br>

---
参考にしたサイト

+ [Vagrant box bento/centos-7.3 | Atlas by HashiCorp](https://atlas.hashicorp.com/bento/boxes/centos-7.3)
+ [ruby 2.3.1をCentOS7に導入する。 - Qiita](http://qiita.com/Fendo181/items/d14ebfb148223c8e5ecb)
+ [Windows10にVagrant + Virtualbox + CentOS7でRails の開発環境を構築する | 二兎を追ってみる](http://mokuo.yokohama/windows10-vagrant-virtualbox-rails/)
+ [rails serverコマンドでエラー発生 &#8211; Linuxプログラミング環境インストール物語](http://pcl.solima.net/archives/428)
+ [仮想サーバ上の WEBrick にローカルマシンから接続できない？！ - Rails つまみぐい](http://rails.hatenadiary.jp/entry/2016/06/24/210114)