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

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

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

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


1 安装VirtualBox和vagrant工具

1.1 在window系统搭建的虚拟开发环境

(1) 安装VirtualBox

VirtualBox下载地址

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

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


(2) 安装vagrant

vagrant下载地址

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


1.2 在linux系统搭建的虚拟开发环境

sudo apt update

# 安装virtualBox虚拟机
sudo apt install virtualbox

# 安装vagrant
# 下载
curl -O https://releases.hashicorp.com/vagrant/2.2.9/vagrant_2.2.9_x86_64.deb
# 安装
sudo apt install ./vagrant_2.2.9_x86_64.deb
# 查看版本
vagrant --version



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 = “centos8.1”

如果指定的镜像名称不存在,会自动去官网找拉取,过程会但非常慢长,建议在国内镜像库 http://mirrors.ustc.edu.cn/centos-cloud/centos/8/vagrant/ 下载到本地。


设置虚拟机硬件资源

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) 设置公有网络绑定网桥,使得除了主机以外可以访问虚拟机
    config.vm.network "public_network", bridge: "宿主机的网络名称", adapter: 2, auto_config: false

# 其中adapter值1(nat)、2(hostonly)、3(bridged),必须选择bridged模式才能允许外网访问。

# 使用命令ifconfig查看宿主机网络名称为 eno1
eno1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.3.5  netmask 255.255.255.0  broadcast 192.168.3.255
        inet6 fe80::8455:4306:723e:a1d  prefixlen 64  scopeid 0x20<link>
        ether 54:bf:64:6d:a3:dc  txqueuelen 1000  (以太网)


设置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环境的虚拟机,因为第一次启动虚拟机时可以执行自定义脚本文件。

4 Vagrantfile配置文件模板示例

Vagrant.require_version ">= 1.6.0"

# 设置虚拟机参数
opts = {
      # 虚拟机名称
      :name => "mydemo",
      # 虚拟机内存大小
      :mem => "2048",
      # 虚拟机CPU核数
      :cpu => "2",
      # 虚拟机私有ip地址,不可以设置和宿主机在同一网段
      :host_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[:host_ip]
    # 设置桥接网络,使得除了主机以外可以访问虚拟机,如果指定ip值表示为静态ip,不指定ip值就随机分配
    #config.vm.network "public_network", bridge: opts[:bridge_network], ip: opts[:host_ip], adapter: 2, auto_config: false
    
    # 端口映射,映射端口个数根据设置而定
    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



5 创建一个已安装docker的虚拟机示例

(1) 下载镜像到本地

wget http://mirrors.ustc.edu.cn/centos-cloud/centos/8/vagrant/x86_64/images/CentOS-8-Vagrant-8.1.1911-20200113.3.x86_64.vagrant-virtualbox.box -O centos8.1.box


(2) 编辑Vagrantfile

修改主机名称、内存大小、cpu核数、宿主机网络名称,内容如下:

Vagrant.require_version ">= 1.6.0"

opts = {
      :name => "vbox",
      :mem => "2048",
      :cpu => "2",
      :bridge_network => "eno1",
      :script_path => "./setup.sh"
}

Vagrant.configure(2) do |config|
  config.vm.box = "centos8.1"
  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

    config.vm.network "public_network", bridge: opts[:bridge_network], adapter: 2, auto_config: false

    demo.vm.provision "shell", path: opts[:script_path]

  end
end

** (3) 编辑安装docker脚本文件 setup.sh,内容如下:**

#/bin/sh

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

# -------------------------安装docker-----------------------------
# 安装一些工具
yum install -y vim git yum-utils openssh-server device-mapper-persistent-data lvm2

# 添加yum源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

# 查看可安装的版本
yum list docker-ce --showduplicates | sort -r

# 安装最新版本docker
yum install -y docker-ce

# 把docker权限添加到当前用户中,避免每次使用添加sudo
sudo usermod -aG docker vagrant

# 镜像加速
sudo touch /etc/docker/daemon.json
sudo chmod 666 /etc/docker/daemon.json
echo '{"registry-mirrors": ["https://zrxnbavs.mirror.aliyuncs.com"]}' >> /etc/docker/daemon.json
sudo chmod 644 /etc/docker/daemon.json

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

# 查看docker版本信息
docker version


(4) 启动虚拟机

# 启动,启动完成后会在生成.vagrant目录
vagrant up

# 进入虚拟机终端
vagrant ssh

注:虚拟机默认帐号和密码为vagrant:vagrant


(5) 允许其他主机使用ssh登录

打开sshd配置文件 /etc/ssh/sshd_config,把字段PasswordAuthentication值no改为yes



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