開発室ブログ

Vagrant VurtualBox 開発環境

Windows7だけど、今更ながらVirtualBox+Vagrant環境を始めてみた

今回も開発環境のおはなしです。

開発環境っていうのは、基本的に「外部に公開しない」「他人にも見せる必要もない」サーバであるわけで、 「ローカル(PC)に構築された環境」であることがベターだと思います。
私の場合、ノマドワーキングを意識して、長らく個人的に開発用のVPSを借り、Pleskをインストールし、そこにドメイン充てて使ってたりしていたわけですが、それって、、、

  • 結局、全然ノマドしない
  • いくらPleskとはいえ、設定が面倒
  • ライセンス費用の無駄
  • 諸々セキュリティを考慮しなければならない
  • そういう時代じゃない
  • プロジェクトごとにOSを切り替えることが出来ない

という事に気づいて・・・いました。

メインPCがWindows10に更新になった暁には、ローカルにDockerを導入して、開発環境としてゴリゴリ使う~とか考えていたんですが、 諸事情あり、あと半年はwindows7機を引っ張ることになりそうなので、「ローカル開発環境」の構築を再考することにしたのです。

まぁ、表題のVirtuialBox + Vagrant一択になりますよね・・・
借りてるVPSのOSは現在CentOS7ですが、Ubuntuで開発してみたい気になったこともあり、「ローカル開発環境」を構築することにしました。

インストール

早速「windows7 virtualbox vagrant」でググってインストールを開始しました。

VirtualBoxVagrant

ググった結果、windows機の場合、この2つのバージョンの組み合わせで「動いたり動かなかったりする」とか、いきなりネガティブな情報が・・・
色々事例を見た結果、「VirtualBox 5.1.18 + Vagrant 1.9.6」での動作報告がありましたので、この組み合わせを目指すことにします。

VirtualBoxは現在5.2系がStableなので、

Download_Old_Builds_5_1 – Oracle VM VirtualBox

こちらからDL。

Vagrantも現在2.0系がStableなので、

Vagrant v1.9.6 Binaries | HashiCorp Releases

こちらからDL。

あ、VirtualBoxVagrantがどういった類のソフトウェアなのかを説明してませんでしたね。。。

  • VirtualBox = お使いのコンピュータの中に別なOSをインストールして動かす為のソフト(仮想化)
  • Vagrant = VirtualBoxで使う仮想環境の情報をファイルにして保存しておき、仮想環境の構築から設定を自動化するためのソフト

です。ザックリ。

VirtualBox – Wikipedia
Vagrant (ソフトウェア) – Wikipedia

インストール自体はなんて事ないです。 VirtualBoxの方は、仮想のUSBコントローラやネットワークカードがPCにインストールされる為、下記のような警告が出ますが全て「インストール」で問題ないです。

f:id:ajdev:20171020123426j:plain

Cygwin

これは、インストールしなくても仮想環境の動作には影響ないのですが、PCのターミナルソフトから仮想環境に直接sshでログインするためにインストールしました。 直接ログインできない~場合は、TeraTerm等のターミナルエミュレーターでローカルのホストを指定して接続しなければなりません。

個人的には、それはそれで構わないのですが、 例えばnode.js等の開発で、簡易サーバで開発をすすめる際、サーバを立ち上げるとコンソールの入力がロックされてしまいますので、 モジュールを追加したい時や、パスを確認したい時等、いちいちサーバを落とさないとなりません。
ある程度アプリが出来上がるまではタスクランナーで持続化~とかしませんし。

モジュールやコンポーネントが増えてくるとコンパイルにも時間がかかりますので、複数コンソールを立ち上げておくことになるのですが、同じエミュレータで複数立ち上げると混乱しますので、私の場合、サーバの立ち上げをcmd(コマンドプロンプト)で、その他の作業をTeraTermで~とかしてます。

インストール

Windows7へのインストール方法は、、、諸説あるのですが、私の場合は普通に

Cygwin Installation

上記からDLした.exeファイルを実行し、Install from Internetでインストール出来ました。

f:id:ajdev:20171020130617j:plain

パスを通す

インストール方法をググった結果、「Windows7上のPATH環境変数にcygwin1.dllへのパスを通しておく」とか・・・
Windows環境変数なんてあるのか?」くらいの感じでしたけど、やっておきます。

設定する窓をだすには、
「Homeボタン(クリック)→コンピュータ(右クリック)→プロパティ(クリック)→システムの詳細設定(クリック)→「詳細設定」タブ」 です。
(コントロールパネルから行くのが正しい道筋だと思いますが、コンパネは人によりレイアウトが違ったりしますので・・・)

f:id:ajdev:20171020132804j:plain

おお~確かに「環境変数(N)」っていうボタンが有りました(笑)

クリックすると、、、

f:id:ajdev:20171020134142j:plain

「ユーザー環境変数」の方の「Path」が既に・・・ 私の場合、

C:\Ruby23-x64\bin;C:\Program Files\Microsoft VS Code\bin

などとなっておりましたので、ここにcygwin1.dllへのパスを追記して保存。

C:\Ruby23-x64\bin;C:\Program Files\Microsoft VS Code\bin;C:\cygwin64\bin

あれ?特に再起動とかは求められないんですね・・・

Vagrant Boxの追加

Boxとは、、、各OSやミドルウェアがセットになったパッケージのことです。
下記に様々な種類のBoxがリストアップされています。

A list of base boxes for Vagrant – Vagrantbox.es

今回はCentOS7.1を追加してみます(Ubuntuじゃなかったのかよ・・・)。

Box追加方法

C:¥Users¥{User Name}> vagrant box add {任意の名前} {boxファイルURL}

今回の場合はこうなりました。

C:¥Users¥{User Name}> vagrant box add CentOS71 https://github.com/holms/vagrant-centos7-box/releases/download/7.1.1503.001/CentOS-7.1.1503-x86_64-netboot.box

仮想環境作成

選んだOSがCentOS7.1ですので、CentOS71というフォルダをC:¥Users¥{User Name}に作成し、

C:¥Users¥{User Name}> mkdir CentOS71 

中に移動し、

C:¥Users¥{User Name}> cd CentOS71

Vagrantを初期化。

C:¥Users¥{User Name}¥CentOS71> vagrant init CentOS71

初期化完了後、CentOS71フォルダの中を覗くとVagrantfileというファイルが生成されています。

仮想環境の設定ファイルのようなものですね。
意図するように動作させる為にこれを編集します。
言うまでもありませんがTeraPadサクラエディタ等のテキストエディタを使用して下さい(「メモ帳」は使わないように!)

IPアドレス付与とポートフォワード

仮想環境へローカルのIPアドレスでアクセスできるように、

||Vagrantfile|| 例)

# config.vm.network "private_network", ip: "192.168.33.10"
↓
config.vm.network "private_network", ip: "192.168.1.2"

と、デフォルトの設定を書き換えます(PCのIPアドレスが192.168.1.2だった場合)。
そしてポートフォワードのルールを決めます。

||Vagrantfile|| 例)

# config.vm.network "forwarded_port", guest: 80, host: 8080, host_ip: "127.0.0.1"
↓
config.vm.network "forwarded_port", guest: 80, host: 8080, host_ip: "192.168.1.2"
config.vm.network "forwarded_port", guest: 443, host: 8443, host_ip: "192.168.1.2"

これで、とりあえず、http://192.168.1.2:8080で仮想環境のWEBサーバにアクセス出来るようになります。

ディレクトリ共有

ディレクトリ共有とは、仮想環境とPC上のディレクトリ(フォルダ)を同期する~といった感じになります。
これによって、Windows上でファイルの変更を行うと即座に仮想サーバにも反映されますので、ファイル/ディレクトリの上げ下げにSSHFTPコマンドを使わなくて済むようになります。
正しくは「同期」じゃなくて「マウント」か「シンボリックリンク」なんでしょうけど・・・次にシンボリックリンクの話題がでてきますので、ここでは「同期」とします。

||Vagrantfile||

# config.vm.synced_folder "../data", "/vagrant_data"
 ↓
config.vm.synced_folder "C:¥Users¥{User Name}/repos/someproject", "/var/www/vhosts/someproject"

と書き換えれば、PCのC:¥Users¥{User Name}/repos/someprojectと仮想サーバの/var/www/vhosts/someprojectが同期されます。

仮想環境起動

やっと起動です(笑)

C:¥Users¥{User Name}¥CentOS71に移動した状態で、

C:¥Users¥{User Name}¥CentOS71> vagrant up

で起動開始します。
因みに、シャットダウンは、

C:¥Users¥{User Name}¥CentOS71> vagrant halt

とします。

MacTypeにやられる・・・

あっさり起動した体で書いてますが、私の環境の場合、下記のようなエラーが出て起動しませんでした・・・

There was an error while executing `VBoxManage`, a CLI used by Vagrantfor controlling VirtualBox. The command and stderr is shown below.
Command: ["startvm", "3b5f9a50-f8a3-4eae-aa90-XXXXXXXXXXXX", "--type", "headless"]
Stderr: VBoxManage.exe: error: The virtual machine 'CentOS71_default_1507104357057_5955' has terminated unexpectedly during startup with exit code -1073741819 (
0xc0000005).  More details may be available in 'C:\Users\{User Name}\VirtualBox VMs\CentOS71_default_1507104357057_5955\Logs\VBoxHardening.log'
VBoxManage.exe: error: Details: code E_FAIL (0x80004005), component MachineWrap, interface IMachine

f:id:ajdev:20171020190739j:plain

数時間ググりながら格闘した結果、、、って、見出しに書いてるのですが、MacTypeというソフトが邪魔してることが判明しました。

Windows7を初めて使い始めた時、モニタも新調したせいか、どうにもフォントが汚い・・・と感じまして、

未だにwindows7 フォント」でググろうとすると、

とかサジェストされますで(笑)気になっている方も多いのではないかと思います・・・
自宅ではMacbookを使用しているせいもあり、この「汚さ」が許せなく、解決方法をさがしたところ、
Windowsのフォントレンダリングを改善してくれるソフト、

MacType – The way texts should be

を発見し、以来数年間愛用させていただいてました。
(こいつかぁ~犯人は・・・)

MacTypeには「除外サービス」という設定があり、Vagrantを除外して起動したところ・・・無事起動しました。

が、PCを再起動後はまた同じエラーで起動しなくなりましたので、仕方なくMacTypeを諦めます(T_T)

msconfig.exe

で、WindowsのサービスからMacTypeを外し、再起動後もう一度、

C:¥Users¥{User Name}¥CentOS71> vagrant up

で、起動しました。

起動後はMacTypeを立ち上げても問題ないので、共存出来ないわけではないのですが、起動状態を確認するのも面倒なので、「さようならMacType」しました。

シンボリックリンクが貼れない

早速、起動した仮想環境のCentOSにnode.js等をインストールして

AngularのチュートリアルTour of Heroes を始めようと息巻いたのですが、、、

$ npm install

でコケる・・・

どうやらTypescriptのインストールのところでNGな模様です。 エラーメッセージによれば、「シンボリックリンクを貼れない」とのこと。

必死でググった結果、 windowscmdを「管理者権限」で立ち上げ、

fsutil behavior set SymlinkEvaluation L2L:1 R2R:1 L2R:1 R2L:1

とタイプ。 そして、先程のVagrantfileに、
|| Vagrantfile||

config.vm.provider "virtualbox" do |v|
v.customize ["setextradata", :id, "VBoxInternal2/SharedFoldersEnableSymlinksCreate/var/www/vhosts/someproject", "1"]
end

と追記して(~/var/www/vhosts/someprojectシンボリックリンク作成を許可するディレクトリ)、

C:¥Users¥{User Name}¥CentOS71> vagrant reload

仮想環境を再起動。

$ npm install

が完走しました!

(因みにnpm install時、シンボリックリンクを貼らないでインストールするオプション--no-bin-linksというのもあるのですが、 インストールが完走しても、コンパイル(トランスパイル)時にTypescript周りでエラーになってしまいました・・・)

SSH

Cygwinのインストール」の項で「PCのターミナルソフトから仮想環境に直接sshでログインする」と申しましたので、その方法を。 Cygwinをインストールしておくと、

C:¥Users¥{User Name}¥CentOS71> vagrant ssh

で仮想環境にログイン出来ます(パスワード等は求められません)

ターミナルエミュレーターでログインする場合は(公式によると)、

host: 192.168.1.2
port: 2222(Vagrantfileのポートフォワード設定による)
user:vagrant
pasdword:vagrant

SSHログイン可能。
因みに、

$ su
> pasdword: vagrant

でrootになれますし、
そもそも、

user:root
pasdword:vagrant

でもログイン可能でした。

hostsの書き換え

折角ホンモノのサーバに近似な環境が出来上がったのでIPアドレスではなく、ドメインでアクセスしたい~と考えるのはもちろん、 VirtualHostで複数環境を同時に構築~という状況を可能にする為、PCのhostsファイルを使って、(PCからは)ドメインでアクセスできるようにします。
hostsファイルは「管理者権限」で「メモ帳」を立ち上げてから開きます(管理者権限でなければ上書きできません)。
(hostsファイルの場所は、Windows7の場合C:\Windows\System32\drivers\etc\hostsになります)

||hosts|| 例)

192.168.1.2 www.example.com
192.168.1.2 subdomain.example.com
192.168.1.2 example.net

等と列記して、VirtualHostに対応させます。

所感

インターネット越しのアクセスを捨ててローカルに回帰した結果、少なくてもファイルアップの手間分だけは開発速度が向上したと思います(笑)
実際は、半日掛かりで構築しましたので、その時間が勿体無い・・・という、後ろめたさもあります・・・ しかし、FTPは使わない」が私たちの方向性の一つですので、それを遵守するのにも必要なイベントなのではなかったのか。と、自己保身しています。

RecentPost