2018-07-10_Vagrantを使ってLinux開発環境を用意しよう

このページで分かること

  • vagrantでの仮想環境の作り方

VirtualBoxを使って仮想環境を作っていましたが毎度OSのインストールから設定を実施していくのが非常に手間でVagrantを使うことにしました。

環境

  • ホスト: Windows10Pro v1803
  • ゲスト: Ubuntu 16.04
  • Vagrant 2.1.2
  • VirtualBox 5.2.12

そもそもVagrantってなに?

VirtualBoxのラッパーツール。Boxと呼ばれるゲストマシンが仮想化された状態を管理できます。 外部公開されているboxを使うこともできますし自作することもできます。公開されているBoxをベースにすればコマンドを数回叩くだけでubuntuやcentosを立ち上げることができます。またもう一つの利点としてはBoxの設定をVagrantfileと呼ばれる設定ファイルに保持しています。Vagrantfileはただのテキストファイルなのでgitなどで管理も可能です。設定を共通化して複数の仮想マシンを建てる事ができるのと、どういった設定(例えば割り振りIP)かをいちいちログインしなくても確認できるのが便利です。

作業の流れ

  1. Vagrantのインストール
  2. VagrantFileの生成
  3. boxの起動
  4. boxの終了
  5. boxの破棄

1. Vagrantのインストール

Vagrant by HashiCorpからホストOSにあったものとをダウンロードしてインストールしてください。 ウィザードはデフォルトのまま次へで問題ないです。

2. VagrantFileの生成

下記コマンドでカレントディレクトリにVagrantFileが生成されます。 VagrantFileに設定を書き込む事で仮想環境のOSの種類を指定したり、ネットワークの設定を行う事ができます。

1
$ vagrant init

設定値について

config.vm.boxで指定するOSはDiscover Vagrant Boxes - Vagrant Cloudにて公開されています。 ubuntuやcentosなど有名なものは一通り揃っている印象ですね。 その他のオプションは設定例を載せておきます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|
  ##c 作成するboxのOS
  config.vm.box = "ubuntu/xenial64"

  ##c 仮想環境のホスト名
  config.vm.hostname = "tubuntu"

  ##c ネットワーク関係

  ##c publicnetworkをdhcpでブリッジ接続(ホストと同じネットワークに所属させる)
  config.vm.network :public_network, :bridge => "Intel(R) 82579LM Gigabit Network Connection"

  ##c ゲストポート3000 を ホストポート 3000にフォワーディング
  config.vm.network "forwarded_port", guest: 3000, host: 3000

  ##c プライベートのネットワーク設定
  #config.vm.network "private_network", ip: "192.168.33.10"

  ##c 共有フォルダ設定(デフォルトがONになるのでとりあえず特別な設定はなし)
  ##c デフォルトは "./" "/vagrant" (vagrantupしたディレクトリを/vagrantと共有)
  # config.vm.synced_folder "../data", "/vagrant_data"

  ##c VirualBoxの設定
  ##c vb.nameはVirtualBox上のマシン名
  config.vm.provider "virtualbox" do |vb|
    vb.gui = false
    vb.memory = "1024"
    vb.name = "tbuntu"
  end

  ##c 初回のvagrant up時に1回だけstatup.shを実行
  config.vm.provision "shell", :path => "startup.sh"
end

provisionで使っているstart.shも参考までに載せておきます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
#!/bin/bash

## リポジトリを理研に変更
sudo sed -i.bak -e "s%http://[^ ]\+%http://ftp.riken.go.jp/Linux/ubuntu/%g" /etc/apt/sources.list
sudo apt update > /dev/null 2>&1

## avahi-daemon
sudo apt install -y avahi-daemon > /dev/null 2>&1

## タイムゾーンをasia/tokyoへ変更
sudo timedatectl set-timezone Asia/Tokyo


## エンコーディングをutf-8 jajp
sudo apt -y install language-pack-ja-base language-pack-ja > /dev/null 2>&1
sudo localectl set-locale LANG=ja_JP.UTF-8 LANGUAGE="ja_JP:ja"

3. boxの起動

VagrantFileを生成したディレクトリで下記コマンドを実行することでboxを起動できます。 config.vm.boxで指定したboxが初起動の場合はダウンロードが始まるのでしばらく時間がかかります(これがbase-box) 一度ダウンロードされたbase-boxは%HOMEPATH%\.vagrant.d\boxes(c:\User\${user_name}.vagrant.d\boxes)に保存され同じboxを使用する場合は次回up時はダウンロードは発生しません。

1
vagrant up

起動が完了後sshで接続が可能です。msys2経由では問題なくログインできました。 コマンドプロンプトだとsscクライアントが入ってないから上手くいかないかもしれません。

1
vagrant ssh

4. boxの終了

boxの終了は下記コマンドで実施します。box自体は削除されません。

1
vagrant halt

5. boxの破棄

box自体不要になった場合は破棄することができます。boxは破棄されますがbase-boxは破棄されないので次回up時にダウンロードから始まる事はないです。

1
vagrant destroy

備考

vagrant up時のログ(正常起動)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
$c vagrant.exe up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'ubuntu/xenial64'...
==> default: Matching MAC address for NAT networking...
==> default: Checking if box 'ubuntu/xenial64' is up to date...
==> default: A newer version of the box 'ubuntu/xenial64' for provider 'virtualbox' is
==> default: available! You currently have version '20180705.0.0'. The latest is version
==> default: '20180706.0.0'. Run `vagrant box update` to update.
==> default: Setting the name of the VM: tbuntu
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
    default: Adapter 2: bridged
==> default: Forwarding ports...
    default: 3000 (guest) => 3000 (host) (adapter 1)
    default: 22 (guest) => 2222 (host) (adapter 1)
==> default: Running 'pre-boot' VM customizations...
==> 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:
    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.34
    default: VirtualBox Version: 5.2
==> default: Setting hostname...
==> default: Configuring and enabling network interfaces...
==> default: Mounting shared folders...
    default: /vagrant => C:/Users/winu/vagrant/testubuntu
==> default: Running provisioner: shell...
    default: Running: C:/Users/winu/AppData/Local/Temp/vagrant-shell20180710-7212-a3l6ry.sh
$c

vagrant destroy時のログ(正常)

1
2
3
4
5
$c vagrant destroy
    default: Are you sure you want to destroy the 'default' VM? [y/N] y
==> default: Forcing shutdown of VM...
==> default: Destroying VM and associated drives...
$c