使用vagrant和vitrualBox搭建虚拟开发环境

在windows系统下搭建环境需要注意事项:

  • 安装软件前先检查电脑是否开启虚拟机的硬件加速技术, 开机进入BIOS选项 ,依次选Config –> CPU –> Intel Virtualization Technology,里面有个Intel VT-d Feature ,改成Enabled ,保存退出。

  • 安装软件顺序是先安装VirtualBox,再安装vagrant。


1 安装VirtualBox和vagrant工具

以下是在window系统搭建的虚拟开发环境。

(1) 安装VirtualBox

VirtualBox下载地址

如果安装过程中出现提示的错误是:VirtualBox Installation failed! Error,原因是有些服务未启动。

解决的方法: 我的电脑 –> 右键管理 –> 服务和应用程序 –> 服务 –> 启动Device Install Service和Device Setup Manager两个服务。


(2) 安装vagrant

vagrant下载地址

下载安装完后在终端输入命令vagrant version查看是否安装成功,如果找不到命令添加vagrant的bin目录到系统path中。


2 vagrant命令说明

命令 说明
vagrant init 名称 初始化box的操作
vagrant box add 虚拟机名 box文件名 添加box的操作
vagrant up 启动虚拟机的操作
vagrant ssh 登录拟机的操作,也可以指定ID号登陆
vagrant box list 显示当前已经添加的box列表
vagrant box remove 名称 删除相应的box
vagrant destroy 停止当前正在运行的虚拟机并销毁所有创建的资源
vagrant halt 关机
vagrant status 获取当前虚拟机的状态
vagrant suspend 挂起当前的虚拟机
vagrant resume 恢复前面被挂起的状态
vagrant reload 重新启动虚拟机,主要用于重新载入配置文件
vagrant global-status 查看所有虚拟机的ID号
vagrant plugin 用于安装卸载插件
vagrant ssh-config 输出用于ssh连接的一些信息
vagrant package 打包命令,可以把当前的运行的虚拟机环境进行打包
vagrant ssh-config 查看ssh登录信息,可以把这些信息 保存到.ssh文件下config中,先用vagrant ssh 登录,然后把宿主机的ssh公钥保存到虚拟机的authorized_keys文件里,然后在宿主机ssh <名称>就可以免密码登录


3 Vagrantfile配置文件说明

虚拟机镜像版本,如果本地不存在,会去官网拉取

config.vm.box = “centos/7”


设置虚拟机硬件资源

config.vm.provider "virtualbox" do |v|
    v.customize ["modifyvm", :id, "--memory", 1024]
    v.customize ["modifyvm", :id, "--cpus", 1]
end


设置端口映射

config.vm.network “forwarded_port”, guest: 80, host: 8080


设置网络

# (1) 设置虚拟机私有网络 不能和主机同一个网段,如果只设置private_network,除了主机,其他机器不能访问。
config.vm.network "private_network", ip: "172.17.0.100"

# (2) 设置公有网络桥接网络
    # 设置虚拟机Ip和宿主同一个网段
    config.vm.network :public_network,ip:"192.168.8.88"
    
    # 公有网络绑定网桥,使得除了主机以外可以访问虚拟机
    config.vm.network "public_network", bridge: "桥接网络名称", auto_config: true


设置provision任务

provision任务会在原生镜像的基础上,进行一些附加的操作,以改变虚拟机的环境,比如安装应用,发布程序等。可以编写一些命令,让vagrant在启动虚拟机的时候自动执行,节省手动配置环境的时间。

脚本什么时候会被执行?

  • 第一次执行vagrant up命令
  • 执行vagrant provision命令
  • 执行vagrant reload –provision或者vagrant up –provision命令
  • 你也可以在启动虚拟机的时候添加–no-provision参数以阻止脚本被执行

provision任务一些默认值:

  • 默认只执行一次,如果需要每次执行,添加参数run:“always”
  • 默认是sudo权限执行脚本,可以使用privileged: false改为非root权限执行。
  • 脚本分为行内脚本和外部脚本,外部脚本既可以是本地,也可以是网络地址,例如”https://example.com/provisioner.sh"
# (1) 外部脚本,Vagrant会上传这个脚本到虚拟机并执行。
config.vm.provision "shell", path: <脚本位置>

# (2) 行内脚本
    # 单行脚本
    config.vm.provision "shell",inline: "echo Hello World"

    # 对于多行命令脚本,需要明确命令边界
    config.vm.provision "shell" do |s|
      s.inline = <<-SHELL
        # 更改时区
        cp -f /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
      SHELL
    end


设置上传文件

# 将host主机的./config上传到 vm虚拟机的目标文件./Vagrantfile。
config.vm.provision "file", source: "./config", destination: "Vagrantfile"


通过Vagrantfile配置可以很方便一次创建一个或多个自定义环境的虚拟机,例如启动一个安装有docker环境的虚拟机,因为第一次启动虚拟机时可以执行自定义脚本文件。

一个通用的Vagrantfile配置文件示例:

Vagrant.require_version ">= 1.6.0"

# 设置虚拟机参数
opts = {
      # 虚拟机名称
      :name => "mydemo",
      # 虚拟机内存大小
      :mem => "2048",
      # 虚拟机CPU核数
      :cpu => "2",
      # 虚拟机私有ip地址,不可以设置和宿主机在同一网段
      :private_ip => "192.168.6.100",
      # 如果需要,可以连接网桥
      :bridge_network => "en0: Wi-Fi (AirPort)",
      # 宿主机共享文件夹路径,虚拟机共享文件夹在/home/vagrant
      #:synced_folder => "./synced_folder",   
      # 第一次启动虚拟机执行外部脚本    
      :script_path => "./setup.sh",
      # 端口映射,可以添加多个端口,
      # 然后在虚拟机configure添加demo.vm.network :"forwarded_port", guest: opts[:guest_portN], host: opts[:host_portN] 
      :guest_port1 => "80",
      :host_port1 => "8080",
      :guest_port2 => "3306",
      :host_port2 => "13306"
}

# 如果需要创建多个虚拟机,复制上面参数列表改名并设置参数


Vagrant.configure(2) do |config|
  # 虚拟机镜像版本,如果本地不存在,会去官网拉取
  config.vm.box = "centos/7"

  # 起始---------------------------------------------------------------------
  config.vm.define opts[:name] do |demo|
    # 虚拟机名称
    demo.vm.hostname = opts[:name]

    # 虚拟机硬件资源
    demo.vm.provider "virtualbox" do |v|
      v.customize ["modifyvm", :id, "--memory", opts[:mem]]
      v.customize ["modifyvm", :id, "--cpus", opts[:cpu]]
    end
  
    # 虚拟机私有网络, 不能和主机同一个网段,如果只设置private_network,除了主机,其他机器不能访问。
    demo.vm.network "private_network", ip: opts[:private_ip]
    # 设置桥接网络,使得除了主机以外可以访问虚拟机
    #config.vm.network "public_network", bridge: opts[:bridge_network], auto_config: true
    
    # 端口映射,映射端口个数根据设置而定
    demo.vm.network :"forwarded_port", guest: opts[:guest_port1], host: opts[:host_port1]
    demo.vm.network :"forwarded_port", guest: opts[:guest_port2], host: opts[:host_port2] 
    
    # 设置共享目录,注意:如果使用了最小化centos系统,是没有安装VirtualBox增强功能的,
    # 可以在外部脚本或进入添加"yum update -y"、"yum install -y kernel-devel"这两条命令,
    # 然后取消注释共享命令,重新加载Vagrantfile启动虚拟机。
    #demo.vm.synced_folder opts[:synced_folder], "/home/vagrant"
    
    # 执行外部脚本
    demo.vm.provision "shell", path: opts[:script_path]

  end
# 结束---------------------------------------------------------------------

# 如果有多个虚拟机,复制上面信息创建一个新虚拟机

end


一个虚拟机启动时安装docker环境的外部脚本文件setup.sh示例:

#/bin/sh

# 设置时区
cp -r /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

# centos如果需要共享文件夹需要安装VirtualBox增强功能,不需要注释掉,使用最小化虚拟机
#yum update -y
#yum install -y kernel-devel

# 安装一些工具
yum install -y git vim gcc glibc-static telnet bridge-utils net-tools

# 安装docker
yum -y install docker

# 把用户vagrant添加docker用户组
groupadd docker
gpasswd -a vagrant docker

# 设置开机启动docker和启动docker
systemctl enable docker
systemctl start docker

重新打包的虚拟环境,下载,密码:0j33



专题「工具」的其它文章 »