Vagrant是一个快速构建虚拟机的工具,通过简单的几条命令就能快速高效的构建虚拟主机。
安装工具
- 下载安装 Vagrant
- 下载安装 VirtualBox
构建CentOS8虚拟机
这里有常用的镜像下载 app.vagrantup.com/boxes/searc…
由于直接下载系统镜像会很慢,所以我们需要手动下载来添加box
在电脑任意地方新建一个目录vagrant,名字随便取都可以。
终端进入vagrant目录执行以下命令
vagrant init centos/8
会初始化生成一个Vagrantfile文件
然后执行vagrant up命令启动
vagrant up
如果当你执行vagrant up命令后,虚拟机文件下载非常的慢的话,可以使用手动下载系统的方式
在终端日志可以找到下载地址
Downloading: https://vagrantcloud.com/centos/boxes/对应的系统和版本路径
我们可以使用迅雷或其他的下载工具下载,然后讲下载的文件复制到刚刚创建的vagrant目录下,并重命名为centos8.box,删除vagrant目录下其他的文件和目录,包括隐藏的.vagrant目录
然后执行
vagrant box add --name 'centos/8' centos8.box
当看到box:Successfully added box 'cents/8' (v0) for 'airtualbox' ! 表示添加成功
添加成功后接着执行初始化命令
vagrant init centos/8
初始化成功后执行启动命令
vagrant up
创建成功,我们可以一开始安装的VirtualBox工具查看状态(其他的是我以前创建的)
连接虚拟机
-
直接连接
vagrant ssh -
通过第三方工具连接(推荐)
这里我是用国产的FinalShell
在我们创建的vagrant目录下会生成 .vagrant目录,这个目录默认是隐藏,在里面找到
private_key文件,这个是登录的私钥使用FinalShell导入私钥和填写信息
连接成功
Vagrant常用命令
| 命令 | 解释 |
|---|---|
| vagrant box list | 查看目前已有的box |
| vagrant box add | 新增加一个box |
| vagrant box remove | 删除指定box |
| vagrant init | 初始化配置vagrantfile |
| vagrant up | 启动虚拟机 |
| vagrant ssh | ssh登录虚拟机 |
| vagrant suspend | 挂起虚拟机 |
| vagrant resume | 恢复虚拟机 |
| vagrant reload | 重启虚拟机 |
| vagrant halt | 关闭虚拟机 |
| vagrant status | 查看虚拟机状态 |
| vagrant destroy | 删除虚拟机 |
共享目录
Vagrant的根目录(就是我们一开始创建的vagrant)和虚拟机里的/vagrant目录是共享的。我们在vagrant目录下新建一个hello.txt文件,内容为Hello Code:
执行vagrant reload 重启查看日志
然后连接虚拟机,查看虚拟机/vagrant目录下有什么内容:
说明同步成功。
我们也可以自定义共享路劲,编辑vagrant文件夹下的Vagrantfile文件:
在这行下面添加如下配置:
config.vm.synced_folder "./data", "/share", create:true, owner: "root", group: "root"
这个配置的意思是将当前路径下的data文件夹和虚拟机的/share目录共享,拥有者为root,群组为root,如果路径不存在则创建。
修改了Vagrantfile文件需要执行 vagrant reload重启。
在这途中,遇到了如下问题:
Vagrant was unable to mount VirtualBox shared folders. This is usually because the filesystem “vboxsf” is not available. This filesystem is made available via the VirtualBox Guest Additions and kernel module. Please verify that these guest additions are properly installed in the guest. This is not a bug in Vagrant and is usually caused by a faulty Vagrant box. For context, the command attempted was
…
The error output from the command was: mount: unknown filesystem type ‘vboxsf’
安装下面这个插件可解决问题:
vagrant plugin install vagrant-vbguest
网络配置
虚拟机私有网络
在Vagrantfile里打开下面这行配置:
然后使用命令vagrant reload重启虚拟机,重启后我们使用ping命令看是否可以在Mac上访问到这个ip:
访问成功,连接虚拟机,使用if addr查看其IP:
正是我们刚刚配置的那个IP。
虚拟机公有网络
编辑Vagrantfile,将我们刚刚开启的私有网络配置注释,然后开启下面这行配置:
然后重启虚拟机,重启过程中会然你根据当前网络环境选择:
因为我电脑连接的是wifi所以选择第一个选项,重启好后连接虚拟机,查看其IP:
ping 一下试试:
公有网络和私有网络的区别是,公有网络是无线路由器自动分配的IP地址,并且在同一个wifi网络下的其他设备也是可以访问这个IP地址的。
多主机配置
创建多台主机
使用Vagrant可以轻松地创建多台虚拟主机。下面我们开始通过Vagrant来创建两台新的虚拟主机“prod”和“dev”。
在vagrant目录下新建一个目录,名称为multi,然后通过现有的box来初始化一个Vagrantfile配置:
接着编辑multi目录下的Vagrantfile文件,新增下面两项配置:
config.vm.define "prod" do |prod|
end
config.vm.define "dev" do |dev|
end
执行vagrant status查看状态
可以看到多了两台状态为not created的虚拟机,名称分别为“prod”和“dev”。
我们可以使用vagrant up来启动两台主机,也可以通过vagrant up prod来单独启动“prod”这台虚拟主机。
启动后(第一次启动耗时可能比较长),使用vagrant status来查看它们的状态:
通过vagrant ssh 主机名就可以连接上它们了。
网络配置
接下来开始配置网络,让它们之间可以通讯。
我们按照上面介绍网络配置的方式来为这两台虚拟主机配置私有网络:
值得注意的是,在配置私有网络的时候,IP网段不能和Mac主机相同。
配置好后重启这两台虚拟机,然后分别连接这两台虚拟机,看是否能够ping通:
配置成功。
自定义主机名
编辑Vagrantfile,添加如下配置:
重启后,连接虚拟机,可以看到hostname已经修改为我们设置的名称了:
重启后,连接虚拟机,可以看到hostname已经修改为我们设置的名称了:
多主机的共享目录
默认的这两台虚拟主机的/vagrant和当前目录multi/是共享的。我们也可以分别为它们设置不同的共享目录。
编辑Vagrantfile,添加如下配置:
prod目录和dev目录要在Mac的multi目录下手动创建
然后重启这两台虚拟主机就好了。
更多Vagrant的配置可以查看官方文档:www.vagrantup.com/docs/
配置文件
# -*- mode: ruby -*-
# vi: set ft=ruby :
# All Vagrant configuration is done below. The "2" in Vagrant.configure
# configures the configuration version (we support older styles for
# backwards compatibility). Please don't change it unless you know what
# you're doing.
Vagrant.configure("2") do |config|
config.vm.box = "centos/8"
config.vm.define "prod" do |prod|
prod.vm.network "private_network", ip: "192.168.33.11"
prod.vm.hostname = "codelong-prod"
prod.vm.synced_folder "prod", "/vagrant"
end
config.vm.define "dev" do |dev|
dev.vm.network "private_network", ip: "192.168.33.12"
dev.vm.hostname = "codelong-dev"
dev.vm.synced_folder "dev", "/vagrant"
end
end