快速搭建虚拟机环境
用过VMware或者VirtualBox安装虚拟机之后,深感操作麻烦,容易出错。。。
有没有类似于docker这样的工具,只要配置好docker-compose.yml这个文件,就可以帮我搭建出一套需要的环境?
Vagrant就是这样的工具!
以下基于win10系统操作,生成CentOS虚拟机(Vagrant也有mac版),当然也可以生成Ubuntu、Debin等虚拟机。
安装工具
- VirtualBox(选择active maintenance版本的就好)
- Vagrant(win的选择msi,mac的选择dmg)
下载并安装它们。如果Vagrant安装到了其它目录,把安装目录下的bin目录配置到系统环境变量中。
为了不让Vagrant和VirtualBox占用太多的系统盘:
- 打开VirtualBox的管理界面,选择菜单栏上的管理->全局设定->默认虚拟电脑位置,在这里改成其它的非系统盘位置
- 在系统环境变量中加入VAGRANT_HOME,设置.vagrant.d目录保存到其它非系统盘位置(如果是想通过命令操作,win可以通过管理员打开pw,执行setx VAGRANT_HOME “xxpath” /M)
打开powershell(可以在任务栏的搜索框中搜索;或者任意目录下,鼠标不要点击文件,按住shift+鼠标右键,就可以选择powershell进入),执行以下命令:
PS C:\Users\lh_dd> vagrant -v
Vagrant 2.2.6
如果输出了对应版本,说明你的vagrant安装成功了。
后续操作遇到问题,请查看错误处理小节内容。
创建虚拟机
创建一个目录并进入:
PS E:\VagrantMachine\Centos8> vagrant init centos/8
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.
这里的vagrant init centos/8,表示将会创建一个基于CentOS8的虚拟机,如果希望创建其它的系统,参考init语法、boxes文档、boxes平台。
命令执行完成之后,会生成一个Vagrantfile文件在这个目录。
PS E:\VagrantMachine\Centos8> vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Box 'centos/8' could not be found. Attempting to find and install...
default: Box Provider: virtualbox
default: Box Version: >= 0
==> default: Loading metadata for box 'centos/8'
default: URL: https://vagrantcloud.com/centos/8
==> default: Adding box 'centos/8' (v1905.1) for provider: virtualbox
default: Downloading: https://vagrantcloud.com/centos/boxes/8/versions/1905.1/providers/virtualbox.box
default: Download redirected to host: cloud.centos.org
==> default: Waiting for cleanup before exiting...
在国内下载box镜像会比较慢,由于跑去下载default: Downloading:后面这个url的资源,所以我们可以ctrl+c中断它,用其它专业的下载工具来下载会快很多。
把这个centos8的box下载好之后,继续:
PS E:\VagrantMachine\Centos8> vagrant box add centos/8 E:\HashiCorp\VagrantBox\CentOS-7-x86_64-Vagrant-1905_01.VirtualBox.box
==> box: Box file was not detected as metadata. Adding it directly...
==> box: Adding box 'centos/8' (v0) for provider:
box: Unpacking necessary files from: file:///E:/HashiCorp/VagrantBox/CentOS-7-x86_64-Vagrant-1905_01.VirtualBox.box
box:
==> box: Successfully added box 'centos/8' (v0) for 'virtualbox'!
PS E:\VagrantMachine\Centos8> vagrant box list
centos/8 (virtualbox, 0)
PS E:\VagrantMachine\Centos8>
box add命令格式通常是:vagrant box add 自定义box名称 本地的box资源path。
把box添加成功之后,通过up的方式会给我们完成安装:
PS E:\VagrantMachine\Centos8> vagrant up
PS E:\VagrantMachine\Centos8> vagrant status
Current machine states:
default running (virtualbox)
The VM is running. To stop this VM, you can run `vagrant halt` to
shut it down forcefully, or you can run `vagrant suspend` to simply
suspend the virtual machine. In either case, to restart it again,
simply run `vagrant up`.
PS E:\VagrantMachine\Centos8> vagrant ssh
[vagrant@localhost ~]$ whoami
vagrant
[vagrant@localhost ~]$ exit
PS E:\VagrantMachine\Centos8> vagrant halt
首次执行vagrant up,会去创建虚拟机,执行成功就创建好虚拟机了,可以在VirtualBox中看到这个虚拟机!
常用vagrant命令
-
vagrant up // 启动虚拟机,如果虚拟机没有创建则会去创建
-
vagrant status // 查看虚拟机的状态
-
vagrant ssh [虚拟机名称] // 通过ssh连接虚拟机,用户是vagrant;如果只有一台虚拟机可以不指定虚拟机名称
-
vagrant halt // 关闭虚拟机
更多的命令查看vagrant help,或者参考文档。
配置虚拟机
-
配置ip
-
共享本地文件
在Vagrantfile文件中查找以下配置并设置:
config.vm.network “private_network”, ip: “自定义ip”
config.vm.synced_folder “本地文件目录”, “虚拟机中目录”
配置完成之后重新启动虚拟机就好!
进入虚拟机我们就看到成功的配置了这个ip,然后在本地也是可以正常ping通这个ip的。
我们在本地共享目录下新增文件,在虚拟机的映射目录也是能看到新增文件的,反过来一样,说明这个共享是成功的。
共享文件不需要通过samba的方式就实现了,也是很方便。
虚拟机有了ip地址之后,就可以通过xshell之类的ssh工具连接了,不会的可以参考这篇文章操作。
如果共享文件不生效,则进行如下操作:
- 先关闭虚拟机vagrant halt
- 在VitrualBox的工具界面的设置->存储,把VitrualBox安装目录下的VBoxGuestAdditions.iso给挂载进来
- 启动虚拟机vagrant up
- 执行以下命令:
[vagrant@centos-node1 ~]$ sudo mount /dev/cdrom /media/cdrom/
[vagrant@centos-node1 ~]$ cd /media/cdrom/
[vagrant@centos-node1 cdrom]$ sudo yum install kernel-devel elfutils-libelf-devel -y
[vagrant@centos-node1 cdrom]$ sudo ./VBoxLinuxAdditions.run
[vagrant@centos-node1 cdrom]$ cd ~
[vagrant@centos-node1 ~]$ sudo umount -v /media/cdrom
退出重启虚拟机就好。
如果想多创建一台或者多台机器,怎么办?
这里给个参考:
# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.require_version ">= 1.6.0"
boxes = [
{
:name => "name1", # 虚拟机名称 可以再VirtualBox中看到
:eth1 => "ip1", # ip地址
:mem => "1024", # 内存大小 这里配置的是1G 根据需要配置
:cpu => "1", # cpu核数
},
{
:name => "name2",
:eth1 => "ip2",
:mem => "1024",
:cpu => "1"
},
# 以上配置会创建2台虚拟机,需要更多可以再配置
]
Vagrant.configure(2) do |config|
config.vm.box = "centos/8"
# config.vm.box_version = "2004.01" # 如果是本地的vbox 这里要注释掉 否则还是会跑去下载vbox资源!
boxes.each do |opts|
config.vm.define opts[:name] do |config|
config.vm.hostname = opts[:name]
config.vm.provider "vmware_fusion" do |v|
v.vmx["memsize"] = opts[:mem]
v.vmx["numvcpus"] = opts[:cpu]
end
config.vm.provider "virtualbox" do |v|
v.customize ["modifyvm", :id, "--memory", opts[:mem]]
v.customize ["modifyvm", :id, "--cpus", opts[:cpu]]
end
# ip
config.vm.network :private_network, ip: opts[:eth1]
# 文件共享
config.vm.synced_folder "本地目录", "虚拟机中目录"
end
end
end
更多的配置参数,请看文档。
错误处理
- vagrant up卡住,提示:
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
- base: mirrors.cqu.edu.cn
- extras: mirrors.cqu.edu.cn
- updates: mirrors.cqu.edu.cn
此时可以不必等待,按ctrl+c强制中断,然后通过vagrant ssh直接连进去操作
[vagrant@localhost ~]$ sudo rm -f /var/run/yum.pid
[vagrant@localhost ~]$ sudo yum -y update