Vagrant搭建虚拟环境

Vagrant 是基于 VirtualBox 虚拟机的,通俗的讲,就是用虚拟机的环境运行本地的代码。代码可以在本地直接编辑和调试,你可以在本地浏览器里查看运行中 Web 应用。而这套虚拟机是可以直接导入到其他电脑上的使用的,这样团队其他成员省去了配置时间,更能保证开发环境和生产环境的统一。

Vagrant的强大在于是一个镜像,配置完以后镜像可以放到任何地方去,真正做到了一劳永逸了。

Vagrant的官方网站: http://www.vagrantup.com/

Vagrant镜像

1.安装Virtualbox

下载地址:https://www.virtualbox.org/wiki/Downloads

修改配置虚拟机安装路径

2.安装Vagrant

下载地址:https://www.vagrantup.com/downloads.html

更改vagrant配置文件的位置

C:\Users\user_name\.vagrant.d移动到新的位置,新建环境变量VAGRANT_HOME,并指向新路径

3.初始化虚拟机

3.1 在线方式

1
2
3
4
5
6
7
8
#添加镜像
$ vagrant box add debian https://dl.dropboxusercontent.com/u/3523744/boxes/debian-8.1-amd64-lxc-puppet/debian-8.1-lxc-puppet.box

#初始化
$ vagrant init debian

#启动
$ vagrant up

3.2 本地方式

CentOS 7 box地址:https://app.vagrantup.com/centos/boxes/7/versions/1902.01

由于在vagrant box hub上下载box速度很慢,这里提前下载好centos 7 boxes,保存于H:\vagrant\box_files文件夹下,注意:目录结构保持与我的一致。
下载方法是box地址+提供商名字(用迅雷下载比较快)
如:https://app.vagrantup.com/centos/boxes/7/versions/1902.01/providers/virtualbox.box

CentOS-7-x86_64-Vagrant-1902_01.VirtualBox.json文件内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
"name": "centos/7",
"versions": [
{
"version": "1902.01",
"providers": [
{
"name": "virtualbox",
"url": "file://H:/vagrant/box_files/CentOS-7-x86_64-Vagrant-1902_01.VirtualBox.box"
}
]
}
]
}

添加镜像

1
2
3
4
5
6
7
8
$ cd H:/vagrant/box_files

#执行以下命令
$ vagrant box add CentOS-7-x86_64-Vagrant-1902_01.VirtualBox.json

#删除box模板
$ vagrant box remove centos/7

3.3 启动一个虚拟机

1
2
3
4
5
$ mkdir -p H:/vagrant/box_files/test
$ cd H:/vagrant/box_files/test

#初始化,生成vagrantfile
$ vagrant init centos/7

修改Vagrantfile配置,并准备系统配置脚本,注意virtualbox的网段在192.168.56.1

Vagrntfile文件内容如下:

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
# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.require_version ">= 1.6.0"

#virtualbox虚拟机网段是192.168.56.1
boxes = [
{
:name => "test",
:eth1 => "192.168.56.100",
:mem => "2048",
:cpu => "2"
}
]

Vagrant.configure(2) do |config|
config.vm.box = "centos/7"
config.vbguest.auto_update = false
config.vbguest.no_remote = true

boxes.each do |opts|
config.vm.define opts[:name] do |config|
config.vm.hostname = opts[:name]
config.vm.provider "vmware_fusion" do |v|
v.vmx["memsize"] = opts[:mem]
v.vmx["numvcpus"] = opts[:cpu]
end

config.vm.provider "virtualbox" do |vb|
vb.name = "lab-#{config.vm.hostname}"
vb.customize ["modifyvm", :id, "--memory", opts[:mem]]
vb.customize ["modifyvm", :id, "--cpus", opts[:cpu]]
end

config.vm.provider :libvirt do |lv|
lv.host = "lab-#{config.vm.hostname}"
end

config.vm.network :private_network, ip: opts[:eth1]
end
end

# 禁用vagrant的默认共享目录
# config.vm.synced_folder ".", "/vagrant", disabled:true
# config.vm.synced_folder "../public", "/opt", mount_options:["dmode=777","fmode=666"]
config.vm.provision "shell", privileged: true, path: "./setup.sh"
end

setup.sh文件内容如下:

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
#/bin/sh

# Delta RPMs disabled because /usr/bin/applydeltarpm not installed.
sudo yum install -y deltarpm

# 设置时区
timedatectl set-timezone Asia/Shanghai

# 关闭防护墙及selinux
sed -i '/SELINUX/s/enforcing/disabled/g' /etc/selinux/config
setenforce 0
systemctl stop firewalld.service
systemctl disable firewalld.service

# 允许密码登录
sed -i '/^PasswordAuthentication no/s/no/yes/g' /etc/ssh/sshd_config
systemctl restart sshd.service

# install some tools
sudo yum install -y git vim gcc glibc-static telnet bridge-utils net-tools

# install docker
## step 1: 安装必要的一些系统工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
## Step 2: 添加软件源信息
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
## Step 3: 更新并安装 Docker-CE
sudo yum makecache fast
sudo yum -y install docker-ce
## 镜像加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://c8x7u9xt.mirror.aliyuncs.com"]
}
EOF

# start docker service
sudo usermod -aG docker vagrant
sudo systemctl start docker
sudo systemctl enable docker

# install docker-compose
curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

安装vagrant-vbguest插件

1
2
$ vagrant plugin install vagrant-vbguest
$ vagrant vbguest

安装vagrant-vbguest插件用于文件夹共享

启动虚拟机

1
$ vagrant up

3.4 vagrant ssh登录虚拟机

虚拟机安装好后,默认已经创建了vagrant用户,密码是vagrant,root用户的默认密码也是vagrant。
在命令行下执行vagrant.exe ssh,将以vagrant用户登录虚拟机。也可以用Secure CRT、xshell等工具连接登录。

1
2
3
4
5
6
#SSH登录
$ vagrant ssh #ssh的后面可以跟你的title来连接不同的vm主机

#默认账号密码
vagrant/vagrant
root/vagrant

4.常见命令

命令 说明
vagrant box list 查看目前已有的box
vagrant box add 新增加一个box
vagrant box remove 删除指定box
vagrant init 初始化配置Vagrantfile
vagrant up 启动虚拟机
vagrant ssh ssh登录虚拟机
vagrant suspend 暂停虚拟机,虚拟机内存等信息将以状态文件的方式保存在本地,可以执行恢复操作后继续使用
vagrant reload 重启虚拟机
vagrant halt 关闭虚拟机
vagrant status 查看虚拟机状态
vagrant destroy 销毁(删除)当前虚拟机(除Vagrantfile中的配置所有数据都不会保留)
vagrant resume 恢复虚拟机,与前面的暂停相对应

5.打包分发

当你配置好开发环境后,退出并关闭虚拟机。在终端里对开发环境进行打包:

1
$ vagrant package

打包完成后会在当前目录生成一个package.box 的文件,将这个文件传给其他用户,其他用户只要添加这个box并用其初始化自己的开发目录就能得到一个一模一样的开发环境了。

注:如果网络模式中使用 private_network 的话,在打包之前需要清除一下private_network的设置,避免不必要的错误:
sudo rm -f /etc/udev/rule.d/70-persistent-net.rules
制作完成之后直接将box文件拿到其他计算机上配置即可使用。

更多内容请查阅官方文档
http://docs.vagrantup.com/

6.Vagrant 插件:

6.1 snapshot 插件

1
2
3
4
5
vagrant plugin install vagrant-vbox-snapshot

Installing the 'vagrant-vbox-snapshot' plugin. This can take a few minutes...
Fetching: vagrant-vbox-snapshot-0.0.10.gem (100%)
Installed the plugin 'vagrant-vbox-snapshot (0.0.10)'!

Vagrant建立快照备份

使用Vagrant的快照功能可以很方便快速的创建当前虚拟机的一个临时备份状态,在进行重要操作时可以先创建一个快照以便在操作失误后快速恢复。

1
2
3
4
5
6
7
8
9
10
11
12
$ vagrant snapshot
Usage: vagrant snapshot <command> [<args>]

Available subcommands:
back
delete
go
list
take

For help on any individual command run `vagrant snapshot <command> -h

使用方法:

  • 创建一个快照
1
vagrant snapshot take [vm-name] <SNAPSHOT_NAME>
  • 查看快照列表
1
vagrant snapshot list [vm-name]
  • 从指定快照中恢复
1
vagrant snapshot go [vm-name] <SNAPSHOT_NAME>
  • 删除一个快照
1
vagrant snapshot delete [vm-name] <SNAPSHOT_NAME>

6.2 vbguest 插件

自定义共享目录,有时候我们发现有些virtualbox无法使用自定义的共享目录,这时候就需要安装vbguest客户端(类似于VMware的client)

1
vagrant plugin install vagrant-vbguest

6.3 hostmanager 插件

用主机名访问,可以实现虚机之间用主机名互相访问,也可以实现宿主机用主机名访问虚机。

1
vagrant plugin install vagrant-hostmanager

6.4 vagrant-bindfs 支持多种共享模式

插件bindfs可以支持多种共享模式,如nfs,samba

命令行下输入:

1
vagrant plugin install vagrant-bindfs

修改Vgrantfile文件:

1
2
3
4
5
6
config.vm.define "node1" do |node1|
node1.vm.network "private_network", ip: "192.168.33.11"
node1.vm.hostname="node1.yulongjun.com"
node1.vm.synced_folder "./app" "/mnt/app-data", type: "nfs"
node1.bindfs.bind_folder "/mnt/app-data" "/app"
force_user: "root", force_group: "root", o: "noempty"