使用 Vagrant 快速创建虚拟机

 

安装 Vagrant

macOS
brew install vagrant
Windows

从官方网站下载

Box 操作

vagrant box list

vagrant box update

vagrant box remove generic/centos8 --box-version=`3.5.0` --provider='virtualbox'

安装插件

代理插件 vagrant-proxyconf

# Install
vagrant plugin install vagrant-proxyconf

# Update
vagrant plugin update vagrant-proxyconf

# Uninstall
vagrant plugin uninstall vagrant-proxyconf

配置代理

  • 全局配置,对所有虚拟机生效,在 $HOME/.vagrant.d/Vagrantfile 文件中配置
  • 单一配置,对某一虚拟机生效,在虚拟机特定的 Vagrantfile 文件中配置
Vagrant.configure("2") do |config|
  if Vagrant.has_plugin?("vagrant-proxyconf")
    config.proxy.http     = "http://192.168.0.2:3128/"
    config.proxy.https    = "http://192.168.0.2:3128/"
    config.proxy.no_proxy = "localhost,127.0.0.1,.example.com"
  end
  # ... other stuff
end

环境变量 http_proxyhttps_proxy 将被写入虚拟机系统的下列文件中

  • /etc/profile.d/proxy.sh
  • /etc/environment

创建 Vagrantfile

vagrant init generic/centos8

VirtualBox provider

# -*- mode: ruby -*-
# vi: set ft=ruby :

ENV["LC_ALL"] = "en_US.UTF-8"
ENV["LANG"] = "en_US.UTF-8"

Vagrant.configure("2") do |config|

  config.vm.box = "generic/centos8"

  # NAT and Host-only network
  config.vm.network "private_network", ip: "192.168.33.10"

  # NAT and public network to bridge to WIFI network interface
  # Set the ip address to match the local network
  # config.vm.network "public_network", bridge: "en0", ip: "192.168.1.10"

  config.vm.hostname = "centos8-1"
  config.vm.define "centos8-1"
  config.vm.synced_folder "~/Downloads", "/home/vagrant/Downloads"

  # VirtualBox
  config.vm.provider "virtualbox" do |vb|
    vb.name   = "centos8-1"
    vb.memory = "4096"
  end

  if Vagrant.has_plugin?("vagrant-proxyconf")
    config.proxy.http      = "http://192.168.33.1:7890/"
    config.proxy.https     = "http://192.168.33.1:7890/"
    config.proxy.no_proxy  = "localhost,127.0.0.1,.example.com"
    config.yum_proxy.http  = "DIRECT"
  end

    config.vm.provision "shell", path: 'https://raw.githubusercontent.com/iguoli/provision/main/centos8-provision.sh'
end

说明:

  • config.vm.hostname 设置虚拟机系统的主机名
  • config.vm.define 设置 Vagrant 环境中的虚拟机名称
  • vb.name 设置 VirtualBox 中的虚拟机名称
  • centos8-provision.sh

启动虚拟机

  • 默认情况下,只有第一次启动虚拟机时,才会对虚拟机进行 provision,也可以通过 --provision 参数,强制在启动时进行 provision。
  • 可以设置 http_proxyhttps_proxy 环境变量来让 vagrant 命令使用代理。
vagrant up

# 使用 Hyper-V 作为 provider
vagrant up --provider hyperv

# 强制启动虚拟机时进行 provision
vagrant up --provision

删除虚拟机

vagrant destroy 5beb3f1

SSH 到虚拟机

vagrant ssh 5beb3f1

虚拟机状态

vagrant global-status
id       name      provider   state   directory
---------------------------------------------------------
5beb3f1  centos8-1 virtualbox running /Vagrant/centos8-1
b70aca5  centos8-2 virtualbox running /Vagrant/centos8-2

清理虚拟机状态

vagrant global-status --prune

虚拟机网络

VirtualBox network

  VM ↔ VM VM → Host VM ← Host VM → Internet VM ← Internet
Not attached
NAT Port Forward Port Forward
NAT Network Port Forward Port Forward
Bridged
Internal Network
Host-only

Vagrant network

Vagrant 与 VirtualBox 的网络对应如下

Vagrant network VirtualBox network
forwarded_port NAT
private_network Host-only
public_network Bridged
注意: NAT 网络将被隐含地创建

如果配置文件只有一个 private_network,Vagrant 会创建一个 NAT 网络和一个 Host-only 网络

# Create a NAT and a Host-only network in VirtualBox
config.vm.network "private_network", ip: "192.168.33.10"
  VM ↔ VM VM → Host VM ← Host VM → Internet VM ← Internet
NAT and Host-only Port Forward

如果配置文件有两个以上的 private_network,Vagrant 不再自动创建 NAT 网络,只有多个 Host-only 网络

# Create two Host-only networks in VirtualBox
config.vm.network "private_network", ip: "192.168.9.10"
config.vm.network "private_network", ip: "192.168.33.10"

系统清理

Windows 10

Vagrant 在 Windows 10 系统上安装虚拟机失败的话,vagrant destroy -f 并不能将虚拟机完全清理干净,需要检查并清理以下几个地方,

  • 系统中遗留 VirtualBox 创建的虚拟网络设备
# 检查是否还有 VirtualBox 创建的虚拟网络设备
Get-NetAdapter 'VirtualBox*'

# 删除虚拟网卡
vboxmanage hostonlyif remove "VirtualBox Host-Only Ethernet Adapter"
vboxmanage hostonlyif remove "VirtualBox Host-Only Ethernet Adapter #2"

如果没找到 vboxmanage 命令,需在系统环境变量 PATH 中设置 VirtualBox 的路径。

  • ~/'VirtualBox VMs' 目录下还有虚拟机残留文件夹
cd ~/'VirtualBox VMs'`
rm -rf <your vm name>

如果显示文件正在使用无法删除,需要进入 Task Manager 找到 VirtualBox Headless 进程,点击 End Task 结束该进程。

参考文档