FM牛鍵屋本舗

プログラマ(弱)の日々精進系ブログ

VagrantのGetting Startを読んでみたよ!!

VagrantのGetting Startを読んでみたよ!!

諸元

なんか仮想化したいなーと思って。

序文

Vagrantは単一ワークフローで仮想マシン環境を構築・管理するツール。簡単なワークフローと自動化に注力してて、「僕の環境なら動くのに」という例のアレを過去の遺産にするよ。

仮想マシンの提供元としてVirtualBox(デフォルト)、VMWareAWSなどなどを選べるし、ShellScriptとかChefなどは仮想環境上で、自動的にソフトウェアのインストールや設定ができますよ、と。

他のツールとの比較

VS. CLIツール

仮想化ソフトウェアにもCLIツールは入ってるけど、それら自体に依存している。Vagrantも内部的にはそれらを使ってるけどね。 Vagrantとそれらの違いは、Vagrantはその上に一貫したワークフローとして構築されていること。ようするにアダプタというかFacadeになっているわけか。 仮想化ソフトウェアのバージョンごとの違いもVagrantが解決するよ。

VS. Docker

Vagrantは複数のプラットフォームにまたがって一貫した開発環境のワークフローを提供することに注力していて、Dockerは存在するコンテナ化システムの一貫した実行をコンテナ管理する。つまり、開発環境に注力しているのと、コンテナの実行に注力している違いがあるわけですね。たぶん。

コンテナは仮想マシンに比べて軽量で、開始と実行が速いよ。 Microserviceとかには向いてるね。

DockerもVagrantも選べるようにコミュニティが作ったライブラリを落とせるよ

VS. Terraform

どちらもHashiCorpが作っているけど、Terraformはインフラ構築。Infrastracture as a Code。

インストール

https://www.vagrantup.com/downloads.htmlから適したバイナリをダウンロードしてインストールしてね。 終わったらvagrantコマンドを打ってみて確認してね。 パスが通っていたらOKだよ。 システムのパッケージマネージャでインストールしないでね。

プロジェクトの設定

どんなVagrantプロジェクトでも一番最初にするのはVagrantfileの作成だよ。このファイルの目的は2つだよ。

  • vagrantのルートディレクトリを決めるためだよ
  • どんなソフトウェアをインストールするのか、どのようにそれにアクセスするのかなどの資産や(仮想)マシンの説明をするためだよ

適当なディレクトリを作って、vagrant initを実行しよう。 これでVagrantfileは作成されるよ。

Vagrantfileはバージョン管理下におけるから、だれの環境でも共通で使えるね。

ボックス

時間がかかって面倒くさい手段で最初から仮想環境を作る代わりに、Vagrant仮想マシンを高速でクローンするためのベースイメージを使うよ。それはboxとして知られていて、それを指定することがVagrantfile作成後の次のステップになるよ。

ボックスのインストール

vagrant box add hashicorp/precise64 これはCloud Box Catalogからのダウンロード。 ローカルやURLの指定も可能。

Vagrantfileにこんなふうに書いてもできるよ。

Vagrant.configure("2") do |config|
  config.vm.box = "hashicorp/precise64"
  config.vm.box_version = "1.1.0" # これはオプション
end

実行と接続

vagrant up

起動するけどUIはないよ。

起動する端末に接続するのは以下だよ。

vagrant ssh

同期されたフォルダー

Vagrantfileが配置されているフォルダと仮想環境の/vagrantが同期されているよ。

vagrant sshで接続すると/home/vagrantにいるけど、これとは違うよ。

供給

apacheでwebserverを立ててみよう。

まずShellScriptを作るです(bootstrap.sh)。

#!/usr/bin/env bash

apt-get update
apt-get install -y apache2
if ! [ -L /var/www ]; then
    rm -rf /var/www
    ln -fs /vagrant /var/www
fi

みればわかるけど、apacheいれて、ドキュメントルートを同期フォルダに変えているよ。

Vagrantfileを書き換えるよ。

Vagrant.configure("2") do |config|
  config.vm.box = "hashicorp/precise64"
  config.vm.provision :shell, path: "bootstrap.sh"
end

vagrantが起動していたらvagrant reload --provisionを実行するよ。 vagrant upでもいいけど、realoadのほうが速いよ。

まだネットワークの設定していないから、仮想環境内部から確認するよ

vagrant ssh
vagrant@precise64:~$ wget -qO- 127.0.0.1

ネットワーキング

ホスト側のポートフォワーディングで仮想端末に飛ばすよ。

Vagrantfileを書き換えるよ。

Vagrant.configure("2") do |config|
  config.vm.box = "hashicorp/precise64"
  config.vm.provision :shell, path: "bootstrap.sh"
  config.vm.network :forwarded_port, guest: 80, host: 4567
end

reloadupを使って更新するよ。

http://localhost:4567を開くと…わお。

他にも設定次第でIPを指定したりも出来るけど、別の説明箇所を見てほしいんだよ。。。

共有

Vagrant Shareと呼ばれる原始的な機能でこの環境を共有できるよ。

でも、商用レベルでは使えないから気をつけてね。

vagrant share

URLが表示されるんだけど、それを開くとさっきのapacheのページが表示されるよ。すごいね。

落とす

開発環境をクリーンする方法は3つあるよ。

  • vagrant suspend
    • 再起動
    • すごく速いよ
    • メモリもHDDも確保したままだよ
  • vagrant halt
    • 再起動
    • クリーンに停止するよ
    • ゲストマシーンはDISKスペースを確保しているよ
  • vagrant destroy
    • guest側のハードディスクも削除するよ
    • やっぱりvagrant upで起動するよ
    • 時間がかかるよ

再構築

vagrant up

仮想マシンの提供者

今までVirtualBoxでやってきたけど、upのオプションで仮想マシンの提供元を変えられるよ。

VMWare:

vagrant up --provider=vmware_fusion

AWS:

vagrant up --provider=aws