Vagrant 简介

vagrant 是一个操作虚拟机的工具,基于 Ruby,用于创建和部署虚拟化开发环境。通过命令和配置文件来管理虚拟机,很快就能完成一套开发环境的部署,并可以打包传播,统一了开发环境,也解决了重复配置环境的麻烦。

支持 VirtualBox, Hyper-V, and Docker, VMware

官网:Vagrant by HashiCorp (vagrantup.com)

vagrant 的优点:

  1. 统一开发环境。一次配置打包,统一分发给团队成员,解决诸如“编码问题”,“缺少模块”,“配置文件不同”带来的问题。

  2. 避免重复搭建环境。新员工加入,快速加入开发,减少时间成本的浪费;

  3. 多个相互隔离开发环境。可以在不同的 box 里跑不同的语言,或者编译安装同一语言不同版本,卸载清除时也很快捷。

  4. Vagrant 支持单机模拟多台机器,且支持一个配置文件 Vagrantfile 就可以跑分布式系统。

  5. Vagrant 可以使用 puppet、chref 等管理工具进行自动化配置部署。

搭建步骤

本文环境:
Windows 10 64位 2004(OS 内部版本 19041.264)

1、安装 VirtualBox

VirtualBox 是一个免费开源的虚拟机,相对 VMware 来说更加小巧。

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

VirtualBox 6.1.xx platform packages

文件:VirtualBox-6.1.xx-xxxxxx-Win.exe

注:虽然 Vagrant 也支持 VMware,不过 VMware 是收费的,对应的 Vagrant 版本也是收费的。

修改虚拟机路径:启动 VirtualBox 程序,“管理 → 全局设定(Ctrl+G) → 常规 → 默认虚拟电脑位置(M)”,改为自定义路径。

虚拟机占用空间较大,建议选个剩余空间大的分区,如有固态盘读写速度更快。

2、安装 Vagrant

下载地址:Downloads | Vagrant by HashiCorp (vagrantup.com)

文件:vagrant_2.2.xx_x86_64.msi

安装后在终端中执行:

vagrant -v

显示版本号则表示安装成功。

box 中的镜像默认存放路径:
Window:C:\Users\当前用户名\.vagrant.d\boxes\
Linux :/Users/当前用户名/.vagrant.d/boxes/

通过设置环境变量 VAGRANT_HOME 修改此默认路径:

Windows

setx VAGRANT_HOME "D:\Users\.vagrant.d" /M
# /m 表示全局环境变量

3、添加 box 镜像

官方 box 仓库:https://app.vagrantup.com/

第三方仓库:http://www.vagrantbox.es
推荐选择 minimal + guest additions + puppet|chef 的 box
理由:

  • minimal,资源占用少;
  • GuestAdditions,相当于一个模拟设备驱动层,使得运行于虚拟机中的操作系统知道自己运行在一套模拟及其环境中(知道自己被虚拟化),Virtualbox 共享目录需要;
  • puppet|chef, 并非必选。它们对未来提升 VM 配置自动化有好处,本身不大。

Ubuntu 官方仓库:http://cloud-images.ubuntu.com/
Ubuntu 清华大学镜像仓库:https://mirror.tuna.tsinghua.edu.cn/ubuntu-cloud-images/

Centos 官方仓库:http://cloud.centos.org/centos/

下载对应平台的 package.box 文件。新手推荐用官方仓库的 box。

Ubuntu 2004 下载地址:https://app.vagrantup.com/generic/boxes/ubuntu2004
CentOS 7 下载地址: https://app.vagrantup.com/centos/boxes/7

(CentOS Linux 7/x86_64 Vagrant images updated to 2020-04-30 and based on CentOS 7.8.2003.)版本号 v2004.01
Centos 官方下载:https://cloud.centos.org/centos/7/vagrant/x86_64/images/CentOS-7-x86_64-Vagrant-2004_01.VirtualBox.box

用下载的文件添加 box:

$ vagrant box add centos7 "D:\vagrant_box\CentOS-7-x86_64-Vagrant-2004_01.VirtualBox.box"
# 注:centos7 是我们给这个 box 的命名,后面是 box 文件路径,没指定路径会从官网下载。
==> box: Box file was not detected as metadata. Adding it directly...
==> box: Adding box 'centos7' (v0) for provider:
box: Unpacking necessary files from: file://D:/centos_vagrant/CentOS-7-x86_64-Vagrant-2004_01.VirtualBox.box
box:
==> box: Successfully added box 'centos7' (v0) for 'virtualbox'!

查询已安装的 box 列表

$ vagrant box list centos7
centos7     (virtualbox, 0)

4、新建虚拟机

  1. 新建一个开发环境目录,进行初始化
mkdir centos7_dev
cd centos7_dev

# 初始化,生成 Vagrantfile 文件
vagrant init centos7 
# centos7 是要使用的box
  1. 启动虚拟机
$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
...
default: SSH address: 127.0.0.1:2222
default: SSH username: vagrant
default: SSH auth method: private key
...
==> default: Machine booted and ready!
...
==> default: Rsyncing folder: /cygdrive/d/vagrant_boxes/centos7_dev/ => /vagrant

安装完成,使用 ssh 连接虚拟机:

$ vagrant ssh
[vagrant@localhost ~]$

连接成功后会进入到虚拟机的 bash 中,默认用户名和密码都是 vagrant

Ctrl + D 退出虚拟机连接。

配置虚拟机

常用配置

编辑 Vagrantfile 文件,修改:

  #config.vm.hostname:主机名
  #config.ssh.username:默认的用户是vagrant
  #config.vm.provision:自定义任务,如安装一些工具包
  # net
  config.vm.network "private_network", ip: "192.168.1.120"
  config.vm.provider "virtualbox" do |vb|
  # Customize the amount of memory on the VM:
    vb.memory = "2048"
    vb.cpus = 2
  end

修改完配置重启虚拟机生效:

$ vagrant reload

网络配置

单人开发推荐用"私有网络",团队协作推荐"公有网络"。

1)端口映射 (Forwarded port),把宿主计算机的端口映射到虚拟机的某一个端口上,访问宿主计算机端口时,请求实际是被转发到虚拟机上指定端口的。Vagrantfile 中设定语法为:

config.vm.forwarded_port 80, 8080

以上将访问宿主机 8080 端口的请求转发到虚拟机的 80 端口。

默认只转发 TCP 包,UDP 需要额外添加以下语句:

config.vm.forwarded_port 80, 8080, protocol: "udp"

优点:

简单易理解。

容易实现外网访问虚拟机。

缺点:

如果有有很多端口,比如 MySQL,MongoDB,tomcat 等服务,端口比较多时,比较麻烦。

不支持在宿主机器上使用小于 1024 的端口来转发。比如:不能使用 SSL 的 443 端口来进行 https 连接。

2)私有网络(Private network),只有主机可以访问虚拟机,如果多个虚拟机设定在同一个网段也可以互相访问,当然虚拟机是可以访问外部网络的。设定语法为:

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

优点:

安全,只有自己能访问。

缺点:

团队成员其他人不能和你协作。

3)公有网络(Public network),虚拟机享受实体机器一样的待遇,一样的网络配置,vagrant 1.3 版本之后也可以设定静态 IP。设定语法如下:

config.vm.network "public_network", ip: "192.168.1.120"

公有网络中还可以设置桥接的网卡,语法如下

config.vm.network "public_network", :bridge => 'en1: Wi-Fi (AirPort)'

优点:

方便团队协作,别人可以访问你的虚拟机。

缺点:

需要有网络,有路由器分配 IP。

同步文件夹

启动是时有如下提示:

==> default: Rsyncing folder: /cygdrive/d/vagrant_boxes/centos7_dev/ => /vagrant

默认情况下,虚拟机 /vagrant 目录与宿主机的项目根目录同步。出现 /cygdrive 是因为 Vagrant 程序用到了 Cygwin,它是在 Windows 系统中兼容 Linux/POSIX 的模拟层。可以把 /cygdrive 看成是虚拟的根目录。

官方说明:Synchronize Local and Guest Files | Vagrant - HashiCorp Learn

要手动指定,可以修改 Vagrantfile ,如下:

# 前面是宿主机路径,后面是虚拟机内的路径
config.vm.synced_folder "../data", "/vagrant_data"

然后重启虚拟机。

默认同步方式是 Rsync 单向同步,即只能 宿主机→虚拟机。

同步只在启动虚拟机的时候执行,也就是说文件修改需要重启虚拟机。

双向同步需要安装客户机增强包 VirtualBox Guest Additions,比较麻烦,这里不做操作。

建议使用 scp 等远程工具传输文件。

vagrant 使用

SSH 登录

默认的镜像只支持 private_key 的方式登录,用户 vagrant/vagrant 只能在 VirtualBox 上登录系统,远程登录会被拒绝。

使用 vagrant ssh-config 命令查看 SSH 的配置:

Host default

HostName 127.0.0.1

User vagrant

Port 2222

UserKnownHostsFile /dev/null

StrictHostKeyChecking no

PasswordAuthentication no

IdentityFile D:/vagrant_boxes/centos7_dev/.vagrant/machines/default/virtualbox/private_key

IdentitiesOnly yes

LogLevel FATAL

其中的 IdentityFile 就是私钥文件。固定在 VAGRANT_HOME 下的相关目录下。

直接在 SSH 客户端上导入这个私钥文件就可以登录。

常用命令

vagrant init  # 初始化
vagrant up  # 启动虚拟机
vagrant suspend # 挂起虚拟机(休眠)
vagrant halt  # 关闭虚拟机
vagrant reload  # 重启虚拟机

vagrant ssh  # SSH 至虚拟机
vagrant status  # 查看虚拟机运行状态
vagrant destroy  # 停止运行的虚拟机并销毁创建的资源(不会删除添加的box)

vagrant box list # 查看已有的box
vagrant box remove # 删除指定box

upload 上传文件

vagrant upload - Command-Line Interface | Vagrant by HashiCorp

将宿主机的文件上传到虚拟机:

vagrant upload source [destination] [name|id]

scp 传输文件

默认情况下,vagrant 使用 ssh 端口为 2222

将宿主机文件复制到虚拟机。

$ scp -P 2222 your_file vagrant@127.0.0.1:. 
  • -r,拷贝文件夹

将虚拟机文件复制到宿主机。

$ scp -P 2222 vagrant@127.0.0.1:/PATH/filename . 

如果 scp 时遇到错误提示:ECDSA host key for [127.0.0.1]:2222 has changed and you have requested strict checking.

需清除缓存的公钥信息:

$ ssh-keygen -R [127.0.0.1]:2222

然后重新执行命令,提示密码时输入 vagrant,即可。

打包分发

清理磁盘

# 清除缓存
yum clean all
# 删除日志
rm -f /home/vagrant/.bash_history

# 查看swapfile是否有占用
du -h /swapfile   
swapoff -a     # 关闭 SWAP
rm -f /swapfile

# 查看磁盘空间
df -h

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

vagrant package --output name.box

注意:因为默认启动虚机时本地目录会 rsync 到虚机中,占用虚机磁盘。打包前要清除同步文件夹不需要的文件。

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

虚拟机快照备份

vagrant 支持为虚拟机拍摄快照来保存当前状态,以后可以方便地恢复到指定的快照。

$ vagrant snapshot -h
Usage: vagrant snapshot <subcommand> [<args>]

Available subcommands:
     delete  # 删除快照
     list    # 列出已有的快照
     pop     # 恢复到最近一个快照并删除该快照
     push    # 创建一个快照
     restore # 恢复到指定快照
     save    # 创建一个快照,并指定快照名

官方提示pushpopsaverestore,要配对使用,混用不安全。

临时备份举例:

# 为虚拟机 vm1 创建一个快照,名称自动分配
$ vagrant snapshot push vm1

# 使用 pop 恢复到最近一个快照,默认会同时删除该快照
$ vagrant snapshot pop vm1

# --no-start 可指定恢复快照后不启动虚拟机
$ vagrant snapshot pop vm1 --no-start

# --no-delete 可指定 pop 恢复快照时不删除该快照
$ vagrant snapshot pop vm1 --no-delete

长期备份举例:

# 为虚拟机 vm1 创建一个快照,快照名为 vm1_save1
$ vagrant snapshot save vm1 vm1_save1

# 使用 restore 恢复到指定快照,不会删除任何快照
$ vagrant snapshot restore vm1 vm1_save1

# --no-start 可指定恢复快照后不启动虚拟机
$ vagrant snapshot restore vm1 vm1_save1 --no-start

# 删除指定快照
# 有些providers(如 VirtualBox), 必须按快照保存的相反顺序删除快照。
$ vagrant snapshot delete vm1 vm1_save1

注:本文在笔者实际操作后进行记录,部分资料整理自网络。

参考资料


Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐