ToThePoint--Vagrant

  1. 1. 资源
  2. 2. 使用
    1. 2.1. 加载box
    2. 2.2. 建立一个虚拟机
    3. 2.3. 打包分发
  3. 3. Options
    1. 3.1. 虚拟化增强
      1. 3.1.1. Hyper-V
      2. 3.1.2. virtual box
    2. 3.2. 修改网卡模式
      1. 3.2.1. private_network
      2. 3.2.2. public_network
    3. 3.3. Vagrantfile

说重点系列–Vagrant:

这个东西本质上,是你电脑上要装一个虚拟机,然后通过命令行,可以很简单的生成和配置虚拟机。

很多人说这个东西是统一开发环境的神器。
不过我一般用于测试环境。过去我测试一个程序,要找一台电脑或者vps,部署好Linux,然后跑一跑,这么一个流程下来,少说2个小时完了,有了vagrant,我可能只需要十分钟就完事了。

资源

客户端下载:https://www.vagrantup.com/downloads.html

CentOS box下载:https://cloud.centos.org/centos/7/vagrant/x86_64/images/

手册:https://www.vagrantup.com/docs/index.html

使用

加载box

1
vagrant box add ${title} $url}

title为自己起的名字,url为box地址,可以在线也可以本地。eg:

1
vagrant box add CentOS-7-x86_64-Vagrant-1809_01 D:\boxes\CentOS-7-x86_64-Vagrant-1809_01.HyperV.box

建立一个虚拟机

1
2
3
4
5
6
7
8
9
10
11
cd ${project}

# 下面这个步骤,本质上是在指定的目录生成一个用于配置的Vagrantfile,实际上这时候还并没有真正意义上生成一个虚拟机。
# 同样的道理,如果你想修改Vagrantfile,在这个步骤之后去执行。
vagrant init CentOS-7-x86_64-Vagrant-1809_01

# 下面这个步骤,是根据Vagrantfile配置一台虚拟机
vagrant up

# 登陆&使用
vagrant ssh

打包分发

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

1
$ vagrant package

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

如果你只是一般使用,那么以上的操作,从新建一个”box”,到使用”box”创建一个虚拟开发环境,到将这个环境分发使用你已经没问题了。
那么我们还差什么?是的,查找和删除

1
2
3
4
5
6
7
8
9
# 查看所有已经保存并生效的box,
vagrant box list

# 查看所有已经生成的虚拟机
vagrant gloal-status

# 删除虚拟及
# ps:这一步中的虚拟机id,你可以简写,比如你只有一个虚拟机。这个虚拟机的id是32547698,那么你可以直接输入一个32,会自动匹配的。
vagrant destroy ${上一步生成的ID}

好了,你已经学会了。

Options

~/dev 目录对应虚拟机中的目录是 /vagrant

虚拟化增强

其实这个没啥大用,我都准备删掉都东西。

Hyper-V

Windows需管理员权限运行

virtual box

centos

1
yum install -y gcc kernel-devel

ubuntu

1
sudo apt install -y gcc make perl
1
sh ./VBoxLinuxAdditions.run

修改网卡模式

private_network

Vagrant 默认是使用端口映射方式将虚拟机的端口映射本地从而实现类似 http://localhost:80 这种访问方式。

这种方式比较麻烦,新开和修改端口的时候都得编辑。相比较而言,host-only 模式显得方便多了。打开 Vagrantfile,将下面这行的注释去掉(移除 #)并保存:

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

重启虚拟机,这样我们就能用 192.168.33.10 访问这台机器了,你可以把 IP 改成其他地址,只要不产生冲突就行。

public_network

事实上,这种模式,在配合VirtualBox使用的时候,会创建一个eth1网卡桥接,然后默认网卡依然是那张eth0。
所以,很多时候,我们要自己设置一下默认网卡,比如我们可以在Vagrantfile中添加类似于这么一行:

1
2
3
cat <<EOF >> /etc/sysconfig/network
GATEWAYDEV=eth1
EOF

Vagrantfile

集成预安装
就是让你在初次运行 vagrant up 后,虚拟机创建过程众自动运行的初始化命令。
打开 Vagrantfile 文件末尾处有下面被注释的代码。
就是让你在初次运行 vagrant up 后,虚拟机创建过程众自动运行的初始化命令。

1
2
3
4
config.vm.provision "shell", inline: <<-SHELL
apt-get update
apt-get install -y apache2
SHELL

如果你不是初次运行,同时又修改了这里的命令,想让系统再次运行这里面的命令,你可以使用 vagrant reload –provision 进行重载。

所以在这种情况下,你只要将 Vagrantfile 共享给团队的其他成员就可以了。

你还可以把要运行的命令单独写在一个文件里存放在相同的目录下,比如 bootstrap.sh:

1
2
3
4
5
6
7
8
#!/usr/bin/env bash

apt-get update
apt-get install -y apache2
if ! [ -L /var/www ]; then
rm -rf /var/www
ln -fs /vagrant /var/www
fi

然后在 Vagrantfile 里这样添加:

1
2
3
4
5
6
Vagrant.configure("2") do |config|
config.vm.box = "hashicorp/precise64"
...

config.vm.provision "shell", path: "bootstrap.sh" # 添加这行
end

效果和直接写在 Vagrantfile 是一样的。

注意事项
使用 Apache/Nginx 时会出现诸如图片修改后但页面刷新仍然是旧文件的情况,是由于静态文件缓存造成的。需要对虚拟机里的 Apache/Nginx 配置文件进行修改:

1
2
3
4
5
# Apache 配置(httpd.conf 或者 apache.conf)添加:
EnableSendfile off

# Nginx 配置(nginx.conf)添加:
sendfile off;