安装 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_proxy
和 https_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_proxy
和https_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 结束该进程。