VirtualBoxとVagrantでワンタッチ仮想環境構築

VirtualBoxとVagrantでワンタッチ仮想環境構築

この記事では、仮想環境の作り方について学ぶことができます。Vagrantでの構築方法や設定が知りたい人は、目次からお好きな項目へ進んでください。初めての方は、仮想環境は何かについてから順に見ていきましょう。

この記事は以下のYoutubeビデオの参考情報にしています。英語でよければ、詳しく45分の講座を聞くことができます。

仮想環境について

仮想環境って何?

仮想環境とは、自分が普段使うパソコンの中にテスト用に別のオペレーティングシステムの環境を作ったものです。Windows on Windowsだったり、Linux on Windowsだったり、またその逆だったりします。

何かのソフトがちゃんと動かくどうか試したい、Linuxのシステムの勉強のために触ってみた、いろいろ目的はありますがちょっと試したいだけなんです。でも、もう1台パソコンなんてないし、そもそも環境構築するのは面倒です。普段がっつり使う環境でもないので、自分のパソコンにいろいろインストールしてごちゃごちゃにしたくない。それで、仮想にPCを1台パソコンの中に作って、OS入れて新規に環境を作るわけです。

だた、これ時間がかかるんですよね。専門的な知識も必要になるし、何より慣れている人でも面倒です。

仮想PCソフトについて

仮想PCソフトとは

OSが動くためには、ハードウェアが必要です。その上にWindowsなどのOSをインストールして使うわけです。仮想PCソフトはそのOSをホストとして、仮想ハードウェアを作って、その中にOSをインストールできちゃうソフトです。つまり、パソコンの中に仮想でいくつもパソコンを立ち上げられるわけです。

もちろん、リアルなハードウェアがどれだけの能力があるかによります。今あるリソースの一部を割いて仮想PCに割くわけなので、元のパソコンよりも遅くなりますし、メモリもある程度必要になります。なので、動かすためにはそれなりのハードウェアが必要です。

よく聞くのは以下の3つです。

他にも、Linuxのkvm、Zenなどいろいろあります。ここでは割愛しますので、詳しく知りたい方はリクエストしていただければ記事を書きます。

よくある仮想環境

仮想環境がよく使われるのは、LinuxにWEBサーバ(Apache)、データベース(mySQL)、PHPなどを使える環境を用意したもので頭文字をとってLAMPなどと言われます。WEBサイトの構築の勉強や、仕事のテスト環境などの用途が多いです。

とはいえ、仮想PCにLinuxをインストールして、各種設定をして、ソフトをインストールして、などとやっていると時間がいくらあっても足りません。そのため、ポンと環境を用意できるソフトがあります。

昔からの有名どころはXamppですね。こちらは、クロスプラットフォームでWindows、Mac、Linux関係なく使えます。Apacheが開発しているだけあり、WEBサーバはApache、データベースはmySQLの後継のMariaDB、そしてPHPとPerlが使える環境です。

最近の若い人は、もしかしたらMAMPの方がよく知っているかもしれませんね。Xamppとよく似ていますが、昔はMacユーザーがよく使っていて、Windowsユーザーには使いにくい代物でした。しかし、最近はクオリティが上がっていて、Windowsユーザーにも人気があります。フリーでも使えますが、有料のPro版だといくつも環境を変えて使えるので、便利です。また、Nginx、Python、Rubyなどに対応するのも人気の理由です。

ただ、どちらにしても、Linux上で動くいわゆる本番環境とはちょっと違うので、動作が微妙に異なったり、ファイルパスが異なったりしてしまいます。できたら、本番環境そっくりがいいですよね。そこで、登場するのがVagrantなのです。

Vagrantについて

Vagrantって何?

Vagrantはオープンソースの仮想環境の構築を自動化するソフトです。OSのインストールやネットワークや共有フォルダなど面倒な設定を自動化してくれます。

ただ、仮想環境を提供するソフトは別にインストールする必要があります。もともと、VirtualBoxのみしか対応していませんでしたが、今はvmwareやAmazonEC2なども操作できるようになっています。バージョン1.6以降ではDockerもネイティブサポートしているので、時間がない(環境構築は待ち時間が多いため)開発者たちには人気のソフトです。

Vagrantに必要なソフトウェア

とりあえず、必要なのはVagrantとVirtualBoxなのですが、BashをWindowsで使えるようにしているととても便利なので、以下の3つのソフト全てをインストールすることをお勧めします。

Vagrant
VirtualBoxを少ないコマンドで触り効率的に仮想環境構築を自動化するソフト
https://www.vagrantup.com/downloads.html
※WindowsのハイパーVを切っておく
[設定]-[アプリ]-[アプリと機能]-[プログラムと機能(下の方にある)]-[Windowsの機能の有効化または無効化]

VirtualBox
仮想PCソフト。ホストOS上で仮想PCを作成し任意のOSをインストールして動かせる。
https://www.virtualbox.org/wiki/Downloads

Git for Windows
GitのコマンドをWindowsから使うためのソフトだが、中にBashが入っている。
BashがあるとLinuxっぽいコマンドをWindowsのコンソール上で使えるので便利。
https://gitforwindows.org/

Vagrantが正常に動いているかは、コマンドプロンプトまたはGitBashから「vagrant -v」コマンドを実行することで確認できます、バージョン情報が表示されれば準備OKです。初回は動くのに少し時間がかかるので、しばらく待ってください。コマンドがうまく動かない場合は、インストールがうまくいっていないか、パスが通っていない可能性があるので、アンインストールしてから再度インストールしてみてください。

Vagrantで使えるBoxを探す

box、つまり仮想PCファイルは自分で用意しても良いのですが、Vagrantのサイトでいろいろな人が作ったものが準備されています。

https://app.vagrantup.com/boxes/search
※VagrantのサイトからFindBoxのリンクをクリックしてもOK

ここで、好きな環境をキーワードを入れて検索します。例えば、CentOS、Ubuntu、PHP、Laravel、minimalなどです。誰かが用意してくれたboxがずらずらと出てきて、好きなものを選んで、その中の設定をvagrantにすれば利用できるというわけです。

その中にbentoプロジェクトというのがあって、様々なOSがインストールされただけの環境が用意されています。これは、特定のバージョンのOSのクリーンな環境が欲しいというときにとても便利です。

ちなみに、開発チーム内で環境を共有するには、最初に誰かが環境を作って、そのboxをみんなで共有する形になります。

Vagrantでワンタッチ環境構築

何を作っても良いのですが、例としてCentOS7.3の環境を作ってみましょう。

最小環境の立ち上げ

pwdコマンド、cdコマンド、mkdirコマンドを駆使して、Cドライブ直下にvmフォルダ、その下にtestフォルダを作ってみましょう。testフォルダは今から環境を準備するbox用のフォルダとします。Cドライブ直下のパスは「/c」です。環境はPC名がDESKTOP-XXXXXXXで、ログインユーザー名がuserです。

user@DESKTOP-XXXXXXX MINGW64 ~
$ pwd
/c/Users/user
user@DESKTOP-XXXXXXX MINGW64 /c
$ mkdir /c/vm
user@DESKTOP-XXXXXXX MINGW64 /c
$ mkdir /c/vm/test2
user@DESKTOP-XXXXXXX MINGW64 /c
$ cd /c/vm/test2
user@DESKTOP-XXXXXXX MINGW64 /c/vm/test2
$

次に、boxを指定して、設定ファイルを自動生成します。

user@DESKTOP-8TOQN1O MINGW64 /c/vm/test
$ 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.

user@DESKTOP-XXXXXXX MINGW64 /c/vm/test
$ ls
Vagrantfile

user@DESKTOP-XXXXXXX MINGW64 /c/vm/test
$

lsコマンドの結果からVagrantfileファイルが作成されているのが分かります。

今回使用したのはbentoプロジェクトの「centos-7.3」というboxです。以下のように表示されているので、表題の部分をそのまま使用するわけですね。

Vagrantfileファイルは、Vagrantが使用するboxの設定ファイルです。viコマンドで開いてみると分かりますが、中身はほとんどコメントでサンプル設定が記されています。実際の内容は上記の画像に記されている値のみです。

このファイルに、Virtualboxの設定や初期設定時には知らせたいコマンドなどを書き込んでいくと、ワンタッチで欲しい環境が手に入ります。OSのインストール画面をいちいち進めていく必要もありません。ダウンロード処理とコマンド処理などに時間はかかるものの、コマンドど一つで、環境が立ち上がります。

その間、自分は別の作業をできるのでかなり時間の節約できます。

では、立ち上げてみます。以下のコマンドを実行すると立ち上がります。初回はダウンロードや設定処理が走るので、しばらく待つ必要があります。もし、カスペルスキーなどのきつめのセキュリティソフトを入れている場合、Vagrantの通信許可が必要な場合があるので、エラーで止まってしまう場合はセキュリティソフトを疑ってください。

ちなみに、起動や終了などのコマンドはVagrantfileがあるディレクトリで行う必要があります。

user@DESKTOP-XXXXXXX MINGW64 /c/vm/test
$ vagrant up
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' version '201708.22.0' is up to date...
==> default: Setting the name of the VM: test2_default_1609069534257_2685
==> 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: Warning: Connection reset. Retrying...
    default: Warning: Remote connection disconnect. Retrying...
    default: Warning: Connection aborted. 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: 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: 5.1.26
    default: VirtualBox Version: 6.1
==> default: Mounting shared folders...
    default: /vagrant => C:/vm/test2

user@DESKTOP-XXXXXXX MINGW64 /c/vm/test
$

次のプロンプトが表示されたら、仮想PCは立ち上がっています。ただ、標準設定ではGUIはオフになっており、NAT接続になっているので以下のコマンドで、接続します。

user@DESKTOP-XXXXXXX MINGW64 /c/vm/test
$ vagrant ssh
[vagrant@localhost ~]$

上のようにプロンプトが変われば、sshでCentOS7.3の仮想PCに接続されています。vagrantユーザーでパスワードもvagrantです。rootのパスワードもvagrantになっています。

次に、仮想PCの終了方法です。Linux上からシャットダウンコマンドを投げても良いのですが、Vagrantから終了する方法を示します。以下のように、ssh接続を切断してから、終了させます。

[vagrant@localhost ~]$ exit
logout
Connection to 127.0.0.1 closed.

user@DESKTOP-XXXXXXX MINGW64 /c/vm/test
$ vagrant halt
==> default: Attempting graceful shutdown of VM...

user@DESKTOP-XXXXXXX MINGW64 /c/vm/test
$

プロンプトが表示されたら、シャットダウン完了です。

Vagrantfileの基本設定

ここまでの状態では、ホストPC下からのNAT接続なので、2222ポートのポートフォーワーディング以外はホストからの接続はできず、LAN内からは一切接続できません。そのため、仮想PCのネットワークの設定が必要です。

また、メモリが1024MBしか割り当てられておらずとても遅いので、もっとメモリを割り当てたい人もいるでしょう。そのあたりの設定を軽く説明したいと思います。

ポート転送

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

ホストコンピューターのローカルIPアドレス、または127.0.0.1にアクセスした際に、指定のポートをゲストコンピューターのポートに転送します。

上記の例だと、ホストの8080番にアクセスすると、ゲストの80番に接続されます。例えば、ゲストでApacheを80番で立ち上げている場合、ブラウザに「http://127.0.0.1:8080/」を入力するとApacheのWelcomeページへアクセスできます。

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

上記のようにホストIPをローカルホストのIPアドレスのみに制限すると、ホストのローカルIPアドレスからはアクセスできなくなります。

ホストPCのみアクセスを許可

config.vm.network "private_network", ip: "192.168.33.10"

上記のように設定すると、そのIPアドレスがゲストPCに設定されます。しかし、そのIPアドレスにアクセスできるのはホストPCのみです。LAN内の他のPCからのアクセスはできません。

これがいわゆる、VirtualBoxの設定のNAT接続です。

ホストPCと同じようにLAN内のPCとして認識させる

config.vm.network "public_network"

上記のように設定すると、ホストPCと同じレベルで認識されて、LAN内にDHCPサーバがあればホストPCの同じようにIPアドレスを取得できます。または、IPアドレスを固定で設定すればLAN内のPCからアクセスが可能になります。

config.vm.network "public_network", ip: "192.168.0.10"

固定でIPアドレスを割り当てたい場合は、上記のようにIPアドレスを指定することもできます。

こちらは、VirtualBoxの設定でいうところのブリッジ接続です。

ホストとゲスト間の共有フォルダ

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

上記のように設定すると、共有フォルダとしてホストPCの任意のフォルダがゲストPCにマウントされます。

config.vm.synced_folder "./html", "/var/www/html"

上記のように設定した場合、Vagrantfileのあるディレクトリのhtmlフォルダが、「/var/www/html」としてマウントされます。この時、Vagrantはフォルダを作ってくれないので、あらかじめ自分でフォルダを作成しておくことが必要です。

GUIを有効にする

config.vm.provider "virtualbox" do |vb|
  vb.gui = true
end

上記のように設定すると、Vagrant経由で仮想PCが立ち上がると、VirtualBoxの画面が立ち上がります。Windowsの環境などを使う場合は良いかもしれません。Linuxの場合はRDPを入れた方がスマートかもしれません。

メモリ割り当てを変更

config.vm.provider "virtualbox" do |vb|
  vb.memory = "2048"
end

上記のように設定すると、MB単位でメモリの割り当てを変更できます。私は遅いのは嫌なので、大体2048か4096くらいを指定しますが、ホストPCにどれだけメモリの余裕があるかによります。

GUI設定などと同時に含める時は、真ん中の行だけ追加してあげればOKです。

プロセッサ数を指定

config.vm.provider "virtualbox" do |vb|
  vb.cpus = "4"
end

上記のように設定すると、プロセッサ数が4に変更されます。最近のLinuxは重いので2以上に指定している方がいいかもしれません。

起動後の初期設定で走らせたいコマンドを指定

config.vm.provision "shell", inline: <<-SHELL
  yum update
  yum -y install httpd
SHELL

上記のように設定すると、初回設定時に処理が実行される。Vagrantfileファイルに最初から書かれているコマンドはubuntu用なので、Linux用のコマンドに置き換えればよい。

プロビジョニング処理を無理やり走らせたい場合は、以下のコマンドを実行する。

user@DESKTOP-XXXXXXX MINGW64 /c/vm/test
$ vagrant provision

なお、プロビジョニングの処理は基本的に初回のみなので、毎度編集していじるというわけではなく、Vagrantfileの内容だけ渡せば環境が整うように記述していればベスト。そうでなければ、プロビジョニングはせずに、boxファイルを渡すという方法でもよい。

Vagrantの基本コマンド

Vagrantファイルの作成

$ vagrant init

起動

$ vagrant up

シャットダウン

$ vagrant halt

SSHログイン

$ vagrant ssh

仮想マシンの一時停止

$ vagrant suspend

仮想マシンの一時停止から復帰 

$ vagrant resume

仮想マシンの再起動 (≒ halt & up) 

$ vagrant reload

仮想マシンの削除(VirtualBoxに登録した仮想マシン)

$ vagrant destroy

バージョン情報を確認

$ vagrant -v
または
$ vagrant --version

box一覧

### 構文 vagrant box list [options]
$ vagrant box list

box追加

### 構文 vagrant box add [options] <name, url, or path> <url>
$ vagrant box add ghfdjk/centos7
### URLからboxを追加(sampleというbox名(任意)とboxファイルのURLを指定)
$ vagrant box add sample https://atlas.hashicorp.com/ghfdjk/boxes/centos7/versions/1.1/providers/virtualbox.box
### ローカルのboxファイルを追加
$ vagrant box add sample package.box

box削除

### 構文 vagrant box remove <name>
$ vagrant box remove mackerel/centos7

仮想マシン状態確認

### 構文 vagrant status [name]
$ vagrant status

仮想マシンの状態確認(詳細)

### 構文 vagrant status [id]
$ vagrant global-status

接続情報表示

### 構文 vagrant ssh-config [options] [name]
$ vagrant ssh-config

boxのパッケージ化(現在の仮想PCのboxファイル作成)

$ vagrant package box名

まとめ

VagrantはWindowsでもLinuxでもMacでも使えるのでとても便利だし、環境構築をお手軽にするにはとても良い。ただ、気づかないうちにBoxがどんどん増えて行ってHDDを圧迫することもあるので注意が必要です。

この記事を元に多くの人が手軽にLinuxがUbuntuを触ってくれたら日本のエンジニアの未来は少し明るくなるかもしれないですね。現状ではGoogleで探して情報が見つからなければあきらめる人が多いように思います。英語で探せばたくさん見つかるし、見つからなければ試したらよいと思います。