ikemonn's blog

技術ネタをちょこちょこと

【Vagrant】実践Vagrantを読んだ際のメモ

実践 Vagrant

実践 Vagrant

Vagrantについて改めて勉強したくて上記の本を読んだ。

そこで覚えておきたいことをメモしたので公開する。

ボックス追加から起動まで

# ボックス追加
$ vagrant box add precise64 http://files.vagrantup.com/precise64.box

# ボックス初期化
$ vagrant init precise64

# 起動
$ vagrant up

.vagrant/以下はGit管理しない

→上記ディレクトリはゲストマシンのIDやロック、設定などが保存されているため、他のマシンに持って行くとまずい。

コマンドたち

vagrantの状態を知る

# vagrantマシンの状態を知る
$ vagrant status

サスペンドする

現在の動作状況を保存した後、マシンが停止する。 そのマシンは、停止した時の状態から、後々リジュームできる。 その時点のスナップショットを取ることと同じ。あとでそのマシンをリジュームすると、サスペンドされた瞬間に実行しようとしていた命令から実行を始める。

メリット:仕事の再開が早くでき、中断したところから仕事を始めることができる。

デメリット:ゲストマシンがそのまま残るので、HDD容量が取られる

$ vagrant suspend

# suspend状態のvagrantを起動する(suspendでない場合はエラー)
$ vagrant resume 

# suspend状態でも、halt状態等でもvagrantを起動する
$ vagrant up

停止する

シャットダウンする。その後は電源ボタンを推すのと同様に、通常のブートアップのプロセスを踏んで再起動する。

メリット:CPUやRAMといったホスト側のリソースを消費しない

デメリット:作業再開の時にWebサーバやDBの起動をしないといけない。HDDの容量を食う。

$ vagrant halt

破棄

マシンはシャットダウンされ、HDDや状態の管理ファイルが削除される。 共有フォルダ外で作成されたすべてのファイルやフォルダも失われる。

メリット:ホストマシンがvagrantが実行されたことなどなかったかのような状態に戻る。

デメリット:作業再開をするためにvagrant upした際、ゲストマシンのインポートと設定を最初からやり直す必要があること。

$ vagrant destroy

# 確認の要求をスキップするには
$ vagrant destroy --force

プロビジョニングについて

プロビジョニングとは

開発環境の生成プロセスの一部として、自動的にソフトウェアをインストールする方法。 vagrantは自動的なプロビジョニングをサポートしており、設定されたプロビジョナを

shellを使ってプロビジョニングする

# 下記を追加
config.vm.provision "shell", path: "provision.sh"

プロビジョニングは複数設定することが可能なので、hoge.shの後にchefを実行してfuga.shを実行するということもできる。

特定のプロビジョナを実行する

# vagrant upやvagrant reloadの時にだけ特定のプロビジョナを実行することも可
vagrant up --provision-with=chef

プロビジョニングしない

一時的にプロビジョニングを無効にできる

$ vagrant up --no-provision

ポートフォワーディングについて

  • 注意:VirtualBoxを使っている場合、Vagrantはホスト上の1024未満のポートへフォワードすることができない。(443を使いたいときなど)

使用方法

# hostの8080を使って、guestの80にアクセスできるようになる
config.vm.network "forwarded_port", guest: 80, host: 8080

設定を反映させるときには、

$ vagrant reload 
or
$ vagrant up

ポートの衝突と修正

同じポートを使用して、ポートが衝突した時に自動的に衝突を回避できる。 auto_correct: trueを追加する。

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

デフォルトでは2200~2250の間で修正用のポートを選択するが、この範囲もカスタマイズできる。

config.vm.usable_port_range = (2200..2250)

ホストのみネットワーク

ホストとゲストだけからなるプライベートなネットワークを構築する。これは、独自のIPアドレス空間をもっているため、ホストのみのネットワークで動作するゲストマシンは自分自身のIPアドレスを持つ。 Vagrantはゲストマシンに静的なIPを割り当てることで、ホストのみのネットワークをサポートする。 Vagrantはホストのみのネットワークの生成処理を行い、ゲストマシンが指定したIPを受け取れるようにする。 そしてゲストマシンにはそのIPを使って直接アクセスできるようになる。 ゲストマシンの全てのポートに直接アクセスできるのは、ポートフォワーディングに比べて優位な点である。

長所、短所

「ホストのみの」という文字通り、このネットワークにはホストマシンとゲストマシンしかアクセスできない。 例えばローカルネットワーク上にある、マシンなどホストの外のマシン群はゲストに割り当てられた静的なIPアドレスへアクセス出来ない。

使用方法

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

ホストのIPアドレスは、常に割り当てられた静的なIPアドレスの最後のオクテットを1にしたものになる。であるので、上記のIPのホスト側は192.168.33.1になる。

ボックスについて

ボックスのフォーマット

ボックスファイルのフォーマットは単なるtarファイルにすぎない。gzipで圧縮されていることもある。.boxという拡張子はボックスが他の用途ではなく、Vagrantで使われるものだということ示すために付けられているもので、将来的にVagrantが下位のフォーマットを変更することになっても対応できる柔軟性をもたらすためのもの。 VirtualBox用のボックスファイルの内容は、VirtualBox仮想マシンのエクスポートの出力にすぎない。

Vagrantを使用しない基本的なボックスの管理

Vagrantはボックスをユーザごとに管理する。ボックスを管理するコマンドは全てのVagrantの環境に影響する。

ボックスは、Vagrantの中で論理名にマップされる。この名前はユーザが自由につけることができる。この論理名はVagrantfile中のconfig.vm.boxの設定とマシンを構成するのに使われる実際のボックスとをマッピングする。 なので、ボックスには好きな名前が付けられるが、その名前は起動したいVagrantfileの名前と一致しなければならない。 論理名がなければボックスファイルにはユニークな識別子がないことになる。ボックスは単なるファイルにすぎないのでわかり易い名前をつけることが重要。 全てのボックスの管理は vagrant boxコマンドを通じて行う。

# box追加
$ vagrant box add precise64 http://files.vagrantup.com/precise64.box

追加されたボックスは自分のVagrant環境のどこからでも使えるようになる。

# インストールしたbox list
$ vagrant box list

ボックスは数百Mb〜数Gbあるので、使わなくなったものは削除する。 ボックスが使われるのは、最初のクローン時だけなので、そのボックスから生成された環境があっても削除できる。

$ vagrant box remove precise64 virtualbox

ボックスのパッケージし直し

$ vagrant box repackage

既存環境からの新しいボックスの生成

プロビジョニングに時間がかかる場合に、最初からソフトウェアをプリインストールしたボックスを作っておくと便利。

$ vagrant package

packageとrepackageの違い

  • package その時点で動作しているVagrantの環境を再利用可能なボックスにパッケージ化するもの。 オリジナルのボックスに対してソフトウェアの追加や設定が行われて修正されている動作中のVagrantの環境を、他のユーザが利用できるボックスにパッケージ化する用途に使われる。

  • repackage 以前にaddされたボックスを、ボックスファイルへとパッケージしなおして配布できるようにする。動作中のVagrantの環境はこのボックスファイルに反映されない。 以前にvagrant box addで追加したボックスから、もう一度ボックスファイルを取り出す場合に使用する。

ボックスの配布方法

# パッケージ化
$ vagrant package

# この際、基本的にはVagrantfileのあるディレクトリにpackage.boxが出力されるのでそれを配布

ボックスをもらった後に立ち上げる方法

# boxの追加
$ vagrant box add BOX_NAME ./package.box

# boxが追加されたことを確認
$ vagrant box list
BOX_NAME (virtualbox)

# Vagrantfileの下記の値を追加したBox名(BOX_NAME)に変更する
config.vm.box = "BOX_NAME"

参考

実践 Vagrant

実践 Vagrant