Windows7だけど、今更ながらVirtualBox+Vagrant環境を始めてみた
今回も開発環境のおはなしです。
開発環境っていうのは、基本的に「外部に公開しない」「他人にも見せる必要もない」サーバであるわけで、 「ローカル(PC)に構築された環境」であることがベターだと思います。
私の場合、ノマドワーキングを意識して、長らく個人的に開発用のVPSを借り、Plesk
をインストールし、そこにドメイン充てて使ってたりしていたわけですが、それって、、、
- 結局、全然ノマドしない
- いくら
Plesk
とはいえ、設定が面倒 - ライセンス費用の無駄
- 諸々セキュリティを考慮しなければならない
- そういう時代じゃない
- プロジェクトごとにOSを切り替えることが出来ない
という事に気づいて・・・いました。
メインPCがWindows10に更新になった暁には、ローカルにDocker
を導入して、開発環境としてゴリゴリ使う~とか考えていたんですが、 諸事情あり、あと半年はwindows7機を引っ張ることになりそうなので、「ローカル開発環境」の構築を再考することにしたのです。
まぁ、表題のVirtuialBox
+ Vagrant
一択になりますよね・・・
借りてるVPS
のOSは現在CentOS7
ですが、Ubuntu
で開発してみたい気になったこともあり、「ローカル開発環境」を構築することにしました。
インストール
早速「windows7 virtualbox vagrant」でググってインストールを開始しました。
VirtualBoxとVagrant
ググった結果、windows機の場合、この2つのバージョンの組み合わせで「動いたり動かなかったりする」とか、いきなりネガティブな情報が・・・
色々事例を見た結果、「VirtualBox 5.1.18 + Vagrant 1.9.6」での動作報告がありましたので、この組み合わせを目指すことにします。
VirtualBoxは現在5.2系がStableなので、
こちらからDL。
Vagrantも現在2.0系がStableなので、
こちらからDL。
あ、VirtualBoxとVagrantがどういった類のソフトウェアなのかを説明してませんでしたね。。。
- VirtualBox = お使いのコンピュータの中に別なOSをインストールして動かす為のソフト(仮想化)
- Vagrant = VirtualBoxで使う仮想環境の情報をファイルにして保存しておき、仮想環境の構築から設定を自動化するためのソフト
です。ザックリ。
インストール自体はなんて事ないです。 VirtualBoxの方は、仮想のUSBコントローラやネットワークカードがPCにインストールされる為、下記のような警告が出ますが全て「インストール」で問題ないです。
Cygwin
これは、インストールしなくても仮想環境の動作には影響ないのですが、PCのターミナルソフトから仮想環境に直接sshでログインするためにインストールしました。 直接ログインできない~場合は、TeraTerm
等のターミナルエミュレーターでローカルのホストを指定して接続しなければなりません。
個人的には、それはそれで構わないのですが、 例えばnode.js
等の開発で、簡易サーバで開発をすすめる際、サーバを立ち上げるとコンソールの入力がロックされてしまいますので、 モジュールを追加したい時や、パスを確認したい時等、いちいちサーバを落とさないとなりません。
ある程度アプリが出来上がるまではタスクランナーで持続化~とかしませんし。
モジュールやコンポーネントが増えてくるとコンパイルにも時間がかかりますので、複数コンソールを立ち上げておくことになるのですが、同じエミュレータで複数立ち上げると混乱しますので、私の場合、サーバの立ち上げをcmd
(コマンドプロンプト)で、その他の作業をTeraTerm
で~とかしてます。
インストール
Windows7へのインストール方法は、、、諸説あるのですが、私の場合は普通に
上記からDLした.exe
ファイルを実行し、Install from Internet
でインストール出来ました。
パスを通す
インストール方法をググった結果、「Windows7上のPATH環境変数にcygwin1.dllへのパスを通しておく」とか・・・
「Windowsに環境変数なんてあるのか?」くらいの感じでしたけど、やっておきます。
設定する窓をだすには、
「Homeボタン(クリック)→コンピュータ(右クリック)→プロパティ(クリック)→システムの詳細設定(クリック)→「詳細設定」タブ」 です。
(コントロールパネルから行くのが正しい道筋だと思いますが、コンパネは人によりレイアウトが違ったりしますので・・・)
おお~確かに「環境変数(N)」っていうボタンが有りました(笑)
クリックすると、、、
「ユーザー環境変数」の方の「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がリストアップされています。
今回は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上でファイルの変更を行うと即座に仮想サーバにも反映されますので、ファイル/ディレクトリの上げ下げにSSHやFTPコマンドを使わなくて済むようになります。
正しくは「同期」じゃなくて「マウント」か「シンボリックリンク」なんでしょうけど・・・次にシンボリックリンクの話題がでてきますので、ここでは「同期」とします。
||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
数時間ググりながら格闘した結果、、、って、見出しに書いてるのですが、「MacType」というソフトが邪魔してることが判明しました。
Windows7を初めて使い始めた時、モニタも新調したせいか、どうにもフォントが汚い・・・と感じまして、
未だに「windows7 フォント」でググろうとすると、
とかサジェストされますで(笑)気になっている方も多いのではないかと思います・・・
自宅ではMacbookを使用しているせいもあり、この「汚さ」が許せなく、解決方法をさがしたところ、
Windowsのフォントレンダリングを改善してくれるソフト、
を発見し、以来数年間愛用させていただいてました。
(こいつかぁ~犯人は・・・)
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な模様です。 エラーメッセージによれば、「シンボリックリンクを貼れない」とのこと。
必死でググった結果、 windowsのcmd
を「管理者権限」で立ち上げ、
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は使わない」が私たちの方向性の一つですので、それを遵守するのにも必要なイベントなのではなかったのか。と、自己保身しています。