0
点赞
收藏
分享

微信扫一扫

vagrant 搭建虚拟机开发环境

书呆鱼 2022-02-11 阅读 97
vagrant

Vagrant 简介

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

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

官网:Vagrant by HashiCorp (vagrantup.com)

Vargant 的优点:

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

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

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

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

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

搭建步骤

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/

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

如 CentOS 7 下载: https://app.vagrantup.com/centos/boxes/7

用下载的文件添加 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

Ctr + 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 等远程工具传输文件。

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 客户端上导入这个私钥文件就可以登录。

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 . 

打包分发

清理磁盘

# 清除缓存
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 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

虚拟机快照备份

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

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

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

临时备份举例:

# 为虚拟机 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

参考资料

  • Documentation | Vagrant by HashiCorp (vagrantup.com)
  • 保姆级教程:Vagrant 从入门到超神玩法_LuciferLiu_DBA-CSDN博客 2021-10-30

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

举报

相关推荐

0 条评论