Vagrantコマンドを仮想マシンの作成と状態の管理を中心に整理してみる

本記事では、Windows上のVirtualBoxを利用したVagrantについて、基本的な仮想マシンの作成手順や構成要素、そして仮想マシンの状態管理の観点を中心にコマンド構成などを見ていきます。

【目次】

[1]はじめに

前の記事『PC上の自分用Ubuntu日本語デスクトップ開発環境サービスを作る(Vagrant+VirtualBox)』で、Vagrantを利用して、開発環境が整った仮想マシンを必要な時だけ使うシナリオを書きました。引き続いて、こういった運用を行うためのVagrantの基礎知識を整理しておきたいと思います。

そこで本記事では、まず、Windows上のVirtualBoxを利用したVagrantについて、基本的な仮想マシンの作成手順や構成要素、そして仮想マシンの状態管理の観点を中心にコマンド構成などを見ていきます。

なお、本記事で動作確認した環境は以下の通りです。
  • ホストOS:Microsoft Windows 10 Pro 10.0/.18363 ビルド 18363
  • VirtualBox:6.1.16 r140961
  • Vagrant: 2.2.13

[2]仮想マシンの作成と構成要素

(1)基本的な仮想マシン作成の流れと構成要素

Vagrantは、BOX(仮想マシンの雛形となるもの)から必要なカスタマイズを行ってVirtualBoxの仮想マシンを作成することができます。

BOXは自分で作らなくても、様々なBOXが公開されているVagrant Cloud box catalog(https://app.vagrantup.com/boxes/search)から目的のBOXを探して利用することが出来ます。

そして、どのBOXを利用し、どのようなカスタマイズを行って仮想マシンを作成するかの設定は、Vagrantfileという名前のファイルに記述します。このVagrantfileがあるディレクトリをプロジェクトディレクトリということにします。

プロジェクトディレクトリ内で、vagrant upコマンドを実行すると、Vagrantfileの内容に従ってVirtualBoxの仮想マシンが作成されます。

簡単ですが、これらの関係を図にしてみました。


以下は、典型的な仮想マシンを新規作成する手順です。
  1. プロジェクトディレクトリを新規作成します。
  2. プロジェクトディレクトリ内にVagrantfileを作成します。
    • vagrant init コマンドなどを利用してVagrantfileを作成して、必要に応じて編集します。
  3. プロジェクトディレクトリ内でvagrant upコマンドを実行すると、VirtualBoxの仮想マシンが作成されます。

(2)プロジェクトディレクトリ

  • Vagrantfileがあるディレクトリが、プロジェクトディレクトリ(Vagrant環境のルートディレクトリ)です。
    • 鶏と卵の関係と同じようなものですが、新規に作成する場合は、ディレクトリを作成して、そこにVagrantfileを置きます。
  • プロジェクトディレクトリは任意の場所に、お好みの名前で作ることが出来ます。
    • 但し、ディレクトリ名は、作成するVirtualBoxの仮想マシン名の先頭に利用されますので、利用用途に応じた名前にするのがよいと思います。(VirtualBoxの仮想マシン一覧で確認できます。)
  • vagrant upをはじめとするVagrantの仮想マシン管理関連のコマンドは、(基本的には)このプロジェクトディレクトリをカレントディレクトリとして実行します。
  • プロジェクトディレクトリ内に、Vagrantが管理するBOXやVirtualBoxの仮想マシンイメージが配置されるわけではありません。
    • Vagrantが管理するBOX関連などのファイルは、(ユーザフォルダ)\.vagrant.dの下にあります。(但し、環境変数VAGRANT_HOMEで変更できるようです。)
    • VirtualBoxの仮想マシンは、環境設定画面の一般タブにある「デフォルトの仮想マシンフォルダー」で指定する場所にあります。デフォルトは「(ユーザフォルダ)\VirtualBox VMs」だと思います。
  • プロジェクトディレクトリは、ゲストマシンの/vagrantディレクトリと共有されます。
    • これにより、プロジェクトディレクトリとゲストマシンでファイルのやり取りなどを簡単に行うことが出来ます。
    • VirtualBoxの仮想マシンの設定画面/共有フォルダ―の項目でも設定されていることが確認できると思います。

(3)Vagrantfileと vagrant init コマンド

Vagrantfileは、大雑把に言えば以下の内容を記述したテキストファイルです。
  • (必須)元にするBOXの指定
    • config.vm.box
  • (オプション)ネットワークや共有フォルダの設定など
    • config.vm.networkやconfig.vm.synced_folderなど
  • (オプション)仮想マシンリソースなどの設定
    • config.vm.provider
    • VirtualBoxの仮想マシンの設定画面の内容と考えると分かりやすいと思います。CPU、メモリ、ディスプレイなどを設定できます。
  • (オプション)プロビジョニング
    • config.vm.provision
    • 仮想マシン作成時などに、仮想マシンに対してソフトウェアのインストールや構成の変更を自動的に行うための仕組みがあります。例えば、シェルスクリプトを使ってインストール作業を行ったり、ホストPCのファイルをゲストOSへアップロードしたりできます。ChefやAnsibleも利用できます。
    • デフォルトでは、最初のvagrant upコマンド実行時(仮想マシンの作成時)のみ実行されます。それ以外で実行する場合は、明示的に --provision フラグを指定するか、vagrant provisionコマンドを利用する必要があります。
これらは以下のような書式で記載します。
Vagrant.configure("2") do |config|
  # 元にするBOXの指定
  config.vm.box = "元にするBOX名"

  # ネットワークの設定
  # config.vm.network …

  # 共有フォルダの設定
  # config.vm.synced_folder …

  # 仮想マシンの設定
  # config.vm.provider "virtualbox" do |vb|
  #   # 例:メモリの設定
  #   vb.memory = "1024"
  # end

  # プロビジョニングの設定例
  # config.vm.provision "shell", inline: <<-SHELL
  #   apt-get update
  # SHELL
end

なお、#はコメントです。
Vagrantfileの仕様は、Ruby言語の文法に依存していますが、これを気にする必要はほとんどなくて、単に設定ファイルの仕様として考えてよいと思います。

Vagrantfileを作成する簡単な方法は、vagrant initコマンドを利用してVagrantfileの雛形を作成し、設定したい項目を埋めていく方法だと思います。
但し、vagrant initコマンドを利用しなくても、要件を満たしたVagrantfileであれば自作でもコピーでも、作成方法は問いません。

vagrant init コマンド

vagrant init [name [url]]

実行するとカレントディレクトリにVagrantfileが作成されます。
なお、第1引数のnameに元にするBOX名を指定すると、Vagrantfileのconfig.vm.boxにnameが設定されます。第2引数のurlは省略可能ですが、指定するとVagrantfileのconfig.vm.box_urlにurlが設定されます。

少なくとも、第1引数のnameを指定してconfig.vm.boxが設定されていれば、vagrant upコマンドを実行するだけで仮想マシンを作成することができます。

公式ドキュメントはこちらです。
Vagrantfileやプロビジョニングに関しては、別記事で書きたいと思います。

(参考)
Vagrantfileの仮想マシンの設定項目については、記事『Vagrantfileの仮想マシン設定項目とVirtualBoxの設定画面の対応』を参考にしてください。


[3]仮想マシンの状態遷移

(1)概要

簡単ですが、仮想マシンの状態と、状態を遷移させるコマンドの関係を図にしてみました。



これらの仮想マシンの状態は、vagrant statusコマンドで確認できます。

上図の、各丸四角は仮想マシンの状態を表し、英語表記はvagrant statusコマンドで表示される状態名で、日本語名はVirtualBoxで表示される状態名です。
また、矢印にあるup,halt,destroyなどは、状態を変化させるvagrantのコマンドです。

(2)vagrant status コマンド

vagrant status

仮想マシンの現在の状態(not created、running、saved、poweroff)を表示すると同時に、次にどのようなコマンドが実行できるかを例示してくれます。

例えば、paweroff状態の仮想マシンに対してコマンドを実行すると、以下のように表示されます。
Current machine states:

default                   poweroff (virtualbox)

The VM is powered off. To restart the VM, simply run `vagrant up`

(3)状態:not created

  • Vagrantfileはあるけど、VirtualBoxの仮想マシンが無い状態です。
    • vagrant initは行ったけど仮想マシンを作成していない(vagrant upを一度も行っていない)、または、仮想マシンをvagrant destroyで破棄した状態です。
  • VirtualBoxの仮想マシン一覧には(仮想マシンが無いため)表示されません。
  • 次の状態へ移行できます。
    • running(実行中)
      • vagrant up:仮想マシンを作成して起動します。
  • なお、ディレクトリにVagrantfileが無く、かつ、仮想マシンが無い状態でvagrant statusを実行すると、not createdではなく、(Vagrantの管理外なので)ガイドメッセージが表示されます。

(4)状態:running(実行中)

  • vagrant up により、仮想マシンが実行されている状態です。
  • VirtualBoxの仮想マシン一覧には「実行中」と表示されます。
  • 次の状態へ移行できます。
    • saved(保存)
      • vagrant suspend:一時停止します。
    • poweroff(電源オフ)
      • vagrant halt:シャットダウンします。
    • not created
      • vagrant destroy:仮想マシンを破棄します。
    • running(実行中)
      • vagrant reload:仮想マシンを再起動します。

(5)状態:saved(保存)

  • 仮想マシンの状態をローカルディスクに保存して一時停止した状態です。vagrant upにより停止時点から実行再開ができます。
    • 仮想マシンの状態を保存するため、ホストマシンのディスクを消費しますが、ホストマシンのRAMまたはCPUサイクルを消費しません。
  • VirtualBoxの仮想マシン一覧には「保存」と表示されます。
  • 次の状態へ移行できます。vagrant upとreloadの違いに注意が必要です。
    • running(実行中)
      • vagrant resume:一時停止した後から実行再開します。
      • vagrant up:一時停止した後から実行再開します。(resumeとほぼ同じ動作です。)
      • vagrant reload:一時停止状態を破棄して再起動します。
  • poweroff(電源オフ)
    • vagrant halt:保存した仮想マシンの状態を破棄してシャットダウン状態になります。
  • not created
    • vagrant destroy:仮想マシンを破棄します。

(6)状態:poweroff(電源オフ)

  • 仮想マシンがシャットダウンした状態です。
  • VirtualBoxの仮想マシン一覧には「電源オフ」と表示されます。
  • 次の状態へ移行できます。
    • running(実行中)
      • vagrant up:システムを起動します。
      • vagrant reload:システムを起動します。
    • not created
      • vagrant destroy:仮想マシンを破棄します。

[4]仮想マシンの状態を変更するコマンド

以下のコマンドはプロジェクトディレクトリ内で実行します。

(1)vagrant up コマンド

vagrant up

仮想マシンを「running(実行中)」状態にします。
ざっくり言えば、仮想マシンを起動して使える状態にしてくれます。

vagrant upを実行する時、もしVirtualBoxの仮想マシンが無ければ(not created状態)、仮想マシンをVagrantfileの内容にしたがって作成して起動します。
つまり、最初に vagrant upコマンドを実行するときにVirtualBoxの仮想マシンが作成されます。
2回目以降のvagrant upコマンドの実行では、作成済の仮想マシンを起動します。

どちらにしても、vagrant upコマンドが仮想マシンを起動するとき、Vagrantfileの設定内容を反映して起動してくれます。
これにより、例えば、最初はVagrantfileの仮想マシンのメモリ(vb.memory)を”1024”に設定して仮想マシンを作成しても、後に値を”4096”に変更してvagrant upコマンドで起動すると、仮想マシンのメモリは4096MBで起動します。

但し、Vagrantfileのプロビジョニングの設定(config.vm.provision)は扱いが異なります。
config.vm.provisionの内容は、通常、仮想マシンを新規作成する時のみ実行されます。
(より正確には、仮想マシン作成時ではなく、プロビジョニングを実行するタイミングの初回のみ実行するという事ではないかと思います。)

一般に、config.vm.provisionに記載する内容は、仮想マシンへソフトウェアのインストールするなどの環境構築処理が多いと思いますので、仮想マシン作成時以外は実行したくない内容が多いと思います。
このため、vagrant upコマンドも、デフォルトでは仮想マシン作成時(最初のvagrant upコマンド実行時)のみ、config.vm.provisionの内容を実行します。

もし、2回目以降のvagrant upコマンドでも config.vm.provision の内容を強制的に実行したい場合は、--provision フラグを付けて vagrant up コマンドを実行します。

逆に、config.vm.provision の内容を実行したくない場合は、--no-provision フラグを付けて vagrant up コマンドを実行します。

ここで注意が必要なのは、仮想マシン作成時(最初のvagrant upコマンド実行時)に、--no-provisionフラグをつけて仮想マシンを作成しても、2回目以降に --no-provisionフラグ無しでvagrant upコマンドを実行したタイミングでconfig.vm.provision の内容が実行されるようです。(またはsaved(保存)状態から resume を実行したときも同様のようです。)

(2)vagrant halt コマンド

vagrant halt

仮想マシンをシャットダウンして「saved(保存)」状態にします。

(注意)
「saved(保存)」状態の仮想マシンに対してvagrant haltを実行すると、vagrant suspend実行時の保存情報は破棄されます。
これは、強制的にシャットダウン(vagrant halt)して「poweroff(電源オフ)」状態にするのと同様と思います。

(3)vagrant suspend コマンド

vagrant suspend

「running(実行中)」の仮想マシンを「saved(保存)」状態にします。

(4)vagrant resume コマンド

vagrant resume

「saved(保存)」状態の仮想マシンを「running(実行中)」にします。

--provisionフラグを指定すると、Vagrantfileのプロビジョニングの設定(config.vm.provision)を強制的に再実行できます。

なお、「saved(保存)」状態の間にVagrantfileの設定を変更しても、resumeコマンドで再開するときに変更した値が反映されるわけではありません。(例えば、メモリの値を変更してresumeコマンドを実行しても、メモリの値は変更されません。メモリの値を変更するには再起動(vagrant upが実行されること)が必要です。)

(5)vagrant reload コマンド

vagrant reload

仮想マシンを再起動します。
これは、vagrant haltの後、vagrant upを実行するのと同じです。

--provisionフラグを指定すると、プロビジョナーを強制的に再実行できます。

(注意)
「saved(保存)」状態の仮想マシンに対してvagrant reloadを実行すると、vagrant suspend実行時の保存情報は破棄して再起動します。
これは、強制的にシャットダウン(vagrant halt)して「poweroff(電源オフ)」状態にした後にvagrant upで起動するのと同じと思います。

コメント

このブログの人気の投稿

VirtualBoxのスナップショット機能

Google Document AIで画像から表形式データを抽出する(Vision API OCRとの違い)

Ubuntu/Colab環境でPDFファイルのページを画像化する(pdf2image、pdftoppm、pdftocairo)