職業プログラマ向け：Vagrantではじめる快適開発環境生活

## はじめに
いくつかのプロジェクトに参画していると、知らないうちに開発環境が散らかっていて困りませんか？
開発環境に直接DBを入れた結果、無限に捨てられない過去プロジェクトの何かが残り続けてしまったり。
apacheやnginxのバーチャルホストが無限に増えたり。

Vagrantで使い捨てVM開発環境を作ればそんなお悩みもさくっと解決です。

## Vagrant で VM 起動
例えば、ubuntu20.04 の VM を起動して利用するのであれば以下の手順となります

1 vagrant cloud で box ファイルを探す
2-a 任意のフォルダで vagrant init {box名} を実行して Vagrantfile を作成
2-b または、Vagrantfile の config.vm.box を編集 (config.vm.box = {box名})
3 vagrant up で起動

``` vagrant-init-up.cmd
# 初期化
vagrant init generic/ubuntu2004
# 起動
vagrant up
# ssh ログイン
vagrant ssh
```

![vagrant.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136165/3aad8d5f-272e-bd69-0106-bbbb51f7a8b1.png)

VirtualBox で VM を作ると初期化や設定がめんどくさかったのですが、そこを全て Vagrant が引き受けてくれている感じです。

また、同じOSのVMを何個も作る場合は、boxes/ フォルダにダウンロードされているためダウンロード処理も行われず高速でVMの起動ができるようになります。


## 設定ファイル(Vagrantfile)

vagrant init をすると ruby のファイルで大量に英文コメントが書かれた Vagrantfile が作成されますが、実際には init の引数で指定した box ファイルが指定されているだけです。
Vagrantfile の設定で、VM の ip address を変更したり、初回起動時に shell や ansible を動作させることもできます。
プロジェクトで必要な MySQL, JDK, ... といったアプリケーションやミドルウェアのインストールを行う様にしておくとよいでしょう。

(コードハイライトが効くように拡張子を .rbにしていますが、実際は拡張子なしのファイルになります)

* 説明コメントなし

``` Vagrantfile-no-comment.rb
# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|
  config.vm.box = "generic/ubuntu2004"
end

```

* 説明コメントあり

``` Vagrantfile.rb
# -*- mode: ruby -*-
# vi: set ft=ruby :

# All Vagrant configuration is done below. The "2" in Vagrant.configure
# configures the configuration version (we support older styles for
# backwards compatibility). Please don't change it unless you know what
# you're doing.
Vagrant.configure("2") do |config|
  # The most common configuration options are documented and commented below.
  # For a complete reference, please see the online documentation at
  # https://docs.vagrantup.com.

  # Every Vagrant development environment requires a box. You can search for
  # boxes at https://vagrantcloud.com/search.
  config.vm.box = "generic/ubuntu2004"

  # Disable automatic box update checking. If you disable this, then
  # boxes will only be checked for updates when the user runs
  # `vagrant box outdated`. This is not recommended.
  # config.vm.box_check_update = false

  # Create a forwarded port mapping which allows access to a specific port
  # within the machine from a port on the host machine. In the example below,
  # accessing "localhost:8080" will access port 80 on the guest machine.
  # NOTE: This will enable public access to the opened port
  # config.vm.network "forwarded_port", guest: 80, host: 8080

  # Create a forwarded port mapping which allows access to a specific port
  # within the machine from a port on the host machine and only allow access
  # via 127.0.0.1 to disable public access
  # config.vm.network "forwarded_port", guest: 80, host: 8080, host_ip: "127.0.0.1"

  # Create a private network, which allows host-only access to the machine
  # using a specific IP.
  # config.vm.network "private_network", ip: "192.168.33.10"

  # Create a public network, which generally matched to bridged network.
  # Bridged networks make the machine appear as another physical device on
  # your network.
  # config.vm.network "public_network"

  # Share an additional folder to the guest VM. The first argument is
  # the path on the host to the actual folder. The second argument is
  # the path on the guest to mount the folder. And the optional third
  # argument is a set of non-required options.
  # config.vm.synced_folder "../data", "/vagrant_data"

  # Provider-specific configuration so you can fine-tune various
  # backing providers for Vagrant. These expose provider-specific options.
  # Example for VirtualBox:
  #
  # config.vm.provider "virtualbox" do |vb|
  #   # Display the VirtualBox GUI when booting the machine
  #   vb.gui = true
  #
  #   # Customize the amount of memory on the VM:
  #   vb.memory = "1024"
  # end
  #
  # View the documentation for the provider you are using for more
  # information on available options.

  # Enable provisioning with a shell script. Additional provisioners such as
  # Puppet, Chef, Ansible, Salt, and Docker are also available. Please see the
  # documentation for more information about their specific syntax and use.
  # config.vm.provision "shell", inline: <<-SHELL
  #   apt-get update
  #   apt-get install -y apache2
  # SHELL
end
```


## 使用中の vm の共有

コマンドで、その時点の snapshot の box ファイルを作ることができます。
このファイルを boxファイルとして起動する Vagrantfile を作成することで vm を共有できます。

(保存)

```　package.cmd
# vm を止める
vagrant halt
# package.box ファイルを作る
vagrant package
```

(実行)

```
# package.box を自分の端末に登録
vagrant box add {任意のbox名} package.box

# 実行
vagrant init {任意のbox名}
vagrant up
```

## おわりに

サクッと共有できる開発環境を作るという点では Vagrant の出番はまだまだあるかと思い、よく分からなそうなところを簡単に書いてみました。導入の検討のきっかけになれば幸いです。

実際の導入については参考になる記事が多くあると思いますのでそちらをご参照ください。

[Vagrant入門から実践まで](https://qiita.com/daichi87gi/items/d5da33c76295ee32a735)