使用Vagrant快速搭建centos虚拟机

mac2026-08-20  2

Vagrant 是一个管理虚拟机环境的工具 。它能帮助开发人员迅速的构建一个开发环境,帮助测试人员构建测试环境。

Vagrant 底层支持VirtualBox、VMware甚至AWS作为虚拟机系统,这里使用VirtualBox来进行说明,所以第一步需要先安裝Vagrant和VirtualBox。

安装VirtualBox

VirtualBox是Oracle开源的虚拟化系统,到 VirtualBox 官网 下载 VirtualBox ,virtualBox 的安装十分简单,直接略过。

安装Vagrant

到 Vagrant官网 根据自己系统选择对应版本下载并安装,安装过程十分简单,直接下一步就ok了。

要想检测安装是否成功,可以打开终端命令行工具,输入vagrant -c,看看程序是不是已经可以运行了。如果不行,请检查一下$PATH里面是否包含vagrant所在的路径。

vagrant -v # Vagrant 2.2.6

如果看到输出,表示已经装好了,我这里安装的是2.2.6的版本。

如果下载速度比较慢,可以将下载链接复制到迅雷来下载

Box

当我们安装好 VirtualBox 和 Vagrant 后,我们要开始考虑在 VM 上使用什么操作系统了,一个打包好的操作系统在 Vagrant 中称为 Box, Box 是一个打包好的操作系统环境 。

box文件的后缀为 .box。包含了虚拟机配置、虚拟机硬盘镜像和 Vagrant 配置的压缩包。 Box相当于帮我们完成了下载 iso 安装镜像,新建虚拟机然后配置cpu、内存、光驱、网络等信息,再从光驱启动并安装,完成后还要安装虚拟机增强工具、配置系统、映射端口、映射磁盘目录等工作。 有了封装好的 Boxes,就可以快速的搭建所需要的系统环境了。

理解了box是什么东西之后,现在要开始安装操作系统了,在 app.vagrantup.com 上面有大家熟知的大多数操作系统,可以选择先下载或者使用的时候通过vagrant在线下载都可以。

如果下载速度比较慢,可以将下载链接复制到迅雷来下载

关于Vagrant也可以通过官方提供的 Getting Started 来学习。

开始

建立工作目录

我的开发机是linux,建立了如下的开发目录。

/home/User/vagrant

可以根据自己的操作系统创建合适的操作目录。

初始化

进入工作目录,打开终端执行vagrant初始化的命令。

vagrant init centos/7 # 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 会在工作目录下创建 Vagrantfile 配置文件,打开它在第15行可以看到下面config.vm.box="centos/7",作用是配置当前 Vagrant 环境使用哪个 Boxes。

centos/7 是一个公开 Boxes,更多公开 Boxes 可以在 这里 找到。

启动虚拟机
vagrant up

在工作目录中执行上面的命令,Vagrant 会尝试加载并启动这个虚拟机,但此时虚拟机还没创建。

Vagrant会根据 config.vm.box 配置查看本机是否已经存在 centos/7 对应的 Boxes,如果本机没有就去远端仓库下载。下载完成之后直接从本地加载就可以了。

vagrant up #/opt/vagrant/embedded/gems/2.2.6/gems/vagrant-2.2.6/lib/vagrant/util/which.rb:37: warning: Insecure world writable dir /opt/java/jdk1.8/bin in PATH, mode 040777 Bringing machine 'default' up with 'virtualbox' provider... #==> default: Box 'centos/7' could not be found. Attempting to find and install... # default: Box Provider: virtualbox # default: Box Version: >= 0 #==> default: Loading metadata for box 'centos/7' # default: URL: https://vagrantcloud.com/centos/7 #==> default: Adding box 'centos/7' (v1905.1) for provider: virtualbox # default: Downloading: https://vagrantcloud.com/centos/boxes/7/versions/1905.1/providers/virtualbox.box # default: Download redirected to host: cloud.centos.org # default: Progress: 16% (Rate: 1045k/s, Estimated time remaining: 0:04:47)

注意:如果速度很慢,可以复制出具体的 .box 文件 URL 并终止这次命令,改用其他工具(比如某迅某雷之类的)下载。 下载完成之后,可以通过两种方式来启动下载的box文件。(这里假设.box文件被下载到~/User/vagrant/centos/centos7.box)

方式一:打开 VagrantFile,修改 config.vm.box 配置为本地文件config.vm.box = "~/User/vagrant/centos/centos7.box"。 现在再执行 vagrant up 就会从本地加载 Boxes,稍等片刻虚拟机就启动就好了。方式二:将下载的.box文件添加到vagrant中。使用vagrant box add 镜像别名 镜像path 命令来添加,这里执行 vagrant box add centos/7 ~/User/vagrant/centos/centos7.box 就可以完成添加了。 然后可以通过vagrant box list来查看当前拥有的box列表。 现在再执行 vagrant up 就会从本地加载 Boxes,稍等片刻虚拟机就启动就好了。

如上面的操作一切正常,vagrant会在virtualBox上自动的配置一个系统,然后自动后台启动,我们无需介入。

连接到虚拟机

Vagrant 环境创建并启动后,在工作目录下,可以通过 vagrant ssh 进入这个虚拟机环境。通常不需要输入帐号密码就可以登录,登录之后的用户名是 vagrant(可以通过登陆后,通过whoami命令查看),密码也是 vagrant。这个帐号执行 sudo 不需要输入密码,因为封装 Boxes 时已经做了相应处理。 这样我们就可以像连接到一台服务器一样进行操作了。

共享文件夹

虚拟机环境配好后,主机的 Vagrant 工作目录(Vagrantfile文件所在的目录)会被自动映射到虚拟机的 /vagrant 目录。所以当我们需要和虚拟机共享文件的时候,直接将文件放置到Vagrant 的工作目录即可。 这样在Vagrant工作目录操作本地文件,就相当于操作虚拟机,非常方便。

Vagrantfile配置文件详解

在我们的开发目录下有一个文件Vagrantfile,里面包含有大量的配置信息,主要包括虚拟机的配置、SSH配置、网络的配置等。

修改完Vagrantfile的配置后,记得要用vagrant reload命令来重启VM之后才能使用VM更新后的配置

box设置
config.vm.box = "base" # 设置 centos/7 box 的版本,如果不指定,下载最新的 config.vm.box_version = "20161209.0.0"

上面的配置用来展示Vagrant要启用那个box作为系统,也就是上面vagrant init BOX_NAME时所指定的box,如果沒有输入box名称的話,那么默认就是base。

网络设置

关于网络设置这块,在网上看到一篇文章写的很详细 参见这里

远程连接虚拟主机,参考这里 如何通过xshell等工具连接vagrant中的centos主机

hostname设置

hostname的设置非常简单,Vagrantfile中加入下面这行就可以了:

config.vm.hostname = "go-app"

设置hostname非常重要,因为当我们有很多台虚拟服务器的时候,都是依靠hostname來做识别的。

同步目录

/vagrant的同步目录默认就是当前的开发目录,这是在虚拟机开启的时候默认挂载同步的。 此外还可以通过配置来设置额外的同步目录,我这里在Vagrantfile的46行,打开注释修改一下即可。

config.vm.synced_folder "../data", "/vagrant_data",create:true, disabled:false,owner:"root",group:"root"

上面这个设定,第一个参数是主机的目录,第二个参数是虚拟机挂载的目录,create 表示如果主机目录不存在,则创建主机目录,默认为false,disable 表示是否禁用同步文件夹,默认为 false;owner 和 group 定义所有者/组

端口转发

下面两个配置,我这里在Vagrantfile的26和31行行,打开注释修改一下即可。

config.vm.network "forwarded_port", guest: 80, host: 8080

这一行的意思是把对宿主机器上8080端口的访问请求forward到虚拟机的80端口的服务上,这样Vagrant就会把这个请求转发到VM里面跑在80端口的nginx服务上,因此我们可以通过这个设置来帮助我们去设定host和VM之间,或是VM和VM之间的信息交互。

config.vm.network "forwarded_port", guest: 80, host: 8080, host_ip: "127.0.0.1"

默认映射到宿主机的端口是可以允许公众访问的,通过指定host_ip为127.0.0.1来禁止公众访问。极少用这个设置。

修改完Vagrantfile的配置后,记得要用vagrant reload命令来重启VM之后才能使用VM更新后的配置

配置VirtualBox内存、CPU等

进入虚拟机后,用 free -hm 命令查看虚拟机内存大小及使用情况。 可以看到虚拟机的默认内存还不到500M,可以通过一下配置来修改虚拟机占用的内存。我这里在配置文件的第52~57行。

config.vm.provider "virtualbox" do |vb| # vagrant up启动时,是否自动打开virtual box的窗口,缺省为false # vb.gui = true #指定vm-name,也就是virtualbox管理控制台中的虚机名称 vb.name = "centos7" #指定vm内存,单位为MB vb.memory = "700" #设置CPU个数 vb.cpus = 2 end

集成预执行

有时候,我们希望vagrant启动后,可以自动执行一些任务,这些任务也是可以通过Vagrantfile来定义的。打开 Vagrantfile 文件末尾处有下面被注释的代码:

config.vm.provision "shell", inline: <<-SHELL echo ${SHELL} echo "hello Vagrant" SHELL

这段代码是用来预定义在vagrant up后,自动执行的任务的,配置方式时通过shell命令。 完成设置之后执行vagrant up --provision或者 vagrant reload --provision 就可以生效了。 还可以将要运行的命令单独写一个脚本文件,比如 init.sh,并保存在和Vagrantfile同目录。

#!/usr/bin/env bash echo "以下是 vagrant provision 输出的内容" echo ${SHELL} echo "hello Vagrant"

然后修改 Vagrantfile 。

Vagrant.configure("2") do |config| config.vm.box = "centos/7" ... # 修改为这样 config.vm.provision "shell", path: "init.sh" end

完成修改后执行 vagrant reload --provision 。

打包并分发自定义的box

当你配置好需要的环境后,退出并关闭虚拟机。

vagrant halt

在终端里对开发环境进行打包。

vagrant package --output first-docker-centos7.box

打包完成后会在当前目录生成一个 first-docker-centos7.box 的文件,将这个文件传给其他用户,其他用户只要添加这个 box 。

vagrant box add first-docker-centos7 first-docker-centos7.box

并用其初始化自己的开发目录就能得到一个一模一样的环境了。

vagrant init first-docker-centos7 vagrant up # 此时可以得到和之前一模一样的环境,但是网络要重新配置

也可以通过 vagrant package --vagrantfile Vagrantfile 将 VagrantFile 也打包进去 通过 vagrant package --base NAMA 命令可以打包一个由 VirtualBox 管理的虚拟机,NAME应该是VirtualBox界面中的计算机名称或者 UUID,目前支持 VirtualBox 虚拟机的导出

常用的命令

命令列表很无聊,记性很不靠谱!

命令功能vagrant validate验证 Vagrantfilevagrant box add NAME URL添加一个 boxvagrant box list查看本地box列表vagrant box remove NAME virtualbox删除本地已添加的 boxvagrant init NAME初始化,实质应是创建 Vagrantfile 文件vagrant global-status获取所有虚拟机的状态vagrant status获取当前虚拟机的状态vagrant up [name|id]启动虚拟机vagrant halt关闭虚拟机vagrant suspend [name|id]挂起当前的虚拟机vagrant resume [name|id]恢复前面被挂起的状态vagrant destroy停止当前正在运行的虚拟机并销毁所有创建的资源vagrant reload [name|id]重新启动虚拟机,主要用于重新载入配置文件vagrant package当前正在运行的 VirtualBox 虚拟环境打包成一个可重复使用的 boxvagrant ssh [name|id]进入虚拟环境vagrant ssh-config [name|id]读取ssh配置文件的有效配置vagrant plugin install [PLUGIN_NAME | /path/to/my-plugin.gem]安装插件,--local仅将插件安装到本地项目vagrant plugin update [<PLUGIN_NAME>]更新插件,如果有名字,则只更新指定名称的插件vagrant plugin expunge删除所有用户安装的插件,参数有--force、--global-only、--reinstall(删除后尝试重新安装插件)等vagrant plugin uninstall <plugin_name1> [<plugin_name2 <plugin_name3> ...]移除插件PLUGIN_NAMEvagrant plugin list插件列表

参考

官方 Getting Started 开始使用 Vagrant Vagrant的安装及使用

最新回复(0)