Vagrant 基本使用操作

Vagrant 基本使用操作OthersVagrant基本使用操作Vagrant是什么?Vagrant安装Vagrant快速上手安装CentOSVagrant基本命令小结Vagrantfile文件Vagrant基本使用操作Vagrant是什么?Vagrant是一款支持自动化虚拟机暗转、可配置流程的用于管理虚拟机的软件.主要的优势在于可以提供一个可配置、可移植和复用的虚拟机环境(通过定义Vagr…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

Vagrant 基本使用操作

Vagrant 是什么?

Vagrant 是一款支持自动化虚拟机暗转、可配置流程的用于管理虚拟机的软件. 主要的优势在于可以提供一个可配置、可移植和复用的虚拟机环境 (通过定义 Vagrantfile , 类似 Dockerfile ), 并且可以使用 shell、chef、puppet 等工具进行部署. 这里要注意, Vagrant 并不能单独使用, 必须要在自己的电脑里安装额外的虚拟机软件, 比如常见的虚拟机软件有: VirtualBox、VMWare 等.

Vagrant 安装

备注: 我安装的是 2.2.6 版本的 Vagrant , 与 6.0 版本之后的 VirtualBox 并不兼容, 所以安装的是 5.2 版本的 VirtualBox , 大家稍微注意一下~

Vagrant 快速上手安装 CentOS

这里通过 centos 7 来做个例子, 来快速安装一个 centos 7 的虚拟机.

  1. 首先可以通过 Vagrant Cloud 网站去查找需要的镜像, 展示出来的标题就是 box 名称, 比如 centos/7 就是一个 box (可以简单理解为镜像);
    在这里插入图片描述

  2. 新建一个目录 (比如: ~/virtual-os/centos7/) , 然后执行如下命令在当前目录初始化一个 Vagrantfile 配置文件.

    vagrant init centos/7
    

    Jetbrains全家桶1年46,售后保障稳定

  3. 执行如下命令, 启动虚拟机

    vagrant up
    

    在这一步的执行过程中, 若本地没有配置镜像的额外地址, 则会到 Vagrant Cloud 中去下载 box , 但是由于 Vagrant Cloud 在海外, 所以速度会比较慢. 可以在网上找到对应的镜像下载到本地, 再添加 box 的配置中去, 比如:

    vagrant box add --name=’centos/7’ { 
         mirrot_local_path}
    

    通过如下 status 命令可以查看当前虚拟机状态 (running 表示正在运行)

    vagrant status
    
  4. 虚拟机启动完成之后, 通过如下命令 ssh 登陆到虚拟机中 (默认的用户名和密码都是 vagrant)

    vagrant ssh
    
  5. 通过执行 halt 命令关闭虚拟机, destroy 命令销毁虚拟机

    vagrant halt
    vagrant destory
    

Vagrant 基本命令小结

上一部分其实我们已经把基本命令都操作了一遍了, 对于基本使用已经足够了, 这里来个汇总

command description
vagrant init centos/7 在当前目录初始化 Vagrantfile 文件
vagrant box add –name=centos/7 {local_path} 添加一个指定name的镜像获取路径(也可以是镜像获取URL)
vagrant up 根据当前路径 Vagrantfile 配置启动虚拟机
vagrant status 获取当前虚拟机的启动状态
vagrant ssh ssh 连接到当前虚拟机
vagrant halt 关闭当前虚拟机
vagrant reload 重启当前虚拟机
vagrant destory 删除当前虚拟机
vagrant provision 执行 Vagrantfile 中配置的 provision 操作指令

Vagrantfile 配置文件

常用相关配置说明

Vagrantfile 就相当于是启动虚拟机的配置文件, 常见的配置如下:

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

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

	# 定义 box 名称, 与 init 时指定的名称一致
	config.vm.box = "centos/7"
	
	# 定义虚拟机名字
	config.vm.hostname = "vagrant"
	
	# 定义 box 镜像位置, 默认不需要指定
	config.vm.box_url = "{filepath}"
	
	# 将主机共享的目录挂载到虚拟机中
	config.vm.synced_folder "/path/to/share/host", "path/to/mount/vm"
	
	# 设置虚拟机的网络模式
	# 此处指定为映射关系, 将虚拟机的 80 端口映射到主机的 8080 端口上
	config.vm.network "forwarded_port", guest: 80, host: 8080
	
	# 启动时执行 shell 命令(后面单独讲)
	config.vm.provision "shell", inline: "echo hello provisio."
	
	# 设置默认 ssh 用户(默认为 vagrant)
	config.ssh.username = "vagrant"
	
	# 设置默认 ssh 密码(默认为 vagrant)
	config.ssh.password = "vagrant"
	
	# 设置 ssh 的端口
	config.ssh.port = 22
	
	
	# 指定基于 virtualbox 的一些配置(资源相关)
	config.vm.provider "virtualbox" do |v|
	  v.gui = false       # 启动时, 不显示 virtualbox 的GUI界面
	  v.name = "my_vn"    # virtualbox 中虚拟机的名字
	  v.cpus = 2          # 指定虚拟机的CPU核数
	  v.memory = "1024"   # 指定虚拟机的内存, 单位为 Mb
	end
end

虚拟网络配置说明

Vagrantfile 里面我比较感兴趣的就是网络模式的设置, 也就是 config.vm.network 的设置, 这里需要首先说明一下 Vagrant 支持的几种网络模式的区别:

  • NAT 模式 (默认)
    NAT (Network Address Translation), 网络地址转换. Guest 访问网络的所有数据都是由主机提供的, Guest 并不真实存在于网络中, 主机与网络中的任何机器都不能查看和访问到 Guest 的存在. 所以只能 Guest 单向访问 Host , Host 和网络中的其他机器无法访问到 Guest . 就拿上面的例子来讲, Guest 是能够 ping 通主机, 但是主机是 ping 不通 Guest 的.

  • Bridged Adapter 网桥模式
    通过主机网卡, 架设了一条桥连入到网络中. 因此, Guest 能被分配到一个网络中独立的 IP , 所有网络功能和真实机器是一样的. 在网桥模式下的虚拟机, 可以认为是真实的计算机, 和主机是可以相互 ping 通的, 并且与网络中的其他主机也是可以相互访问的.

  • Host-only 模式
    该模式下只有主机才能访问 Guest, 其他机器都无法访问 Guest, 同样的, Guest 也能访问主机, 只有和宿主机是互通的, 其他机器无法访问.

几种配置方式大致列举一下:

# 映射 guest 端口到主机上
config.vm.network "forwarded_port", guest: 80, host: 8080

# 配置成 host-only 模式, 指定其在私有网络中的 ip
# 不同 Guest 之间可以通过该 ip 互通
config.vm.network "private_network", ip: "192.168.33.10"

# Bridge模式, 也可以指定 ip 或者桥接网卡
config.vm.network "public_network"
config.vm.network "public_network", ip: "10.1.2.61"
config.vm.netword "public_network", bridge: "en0: Wi-Fi (Wireless)"

Provision 配置说明

Provision 是预先设置的一些操作指令, 可实现的功能是在原生镜像的基础上, 进行一些附加的命令操作, 比如: 安装应用、发布程序等等, 只要是能通过 shell 脚本 (不仅限于 shell) 执行的操作.

# 比如: 执行打印 hello provision
config.vm.provision "shell", inline: "echo hello provision"

而 Provision 操作指令执行的时机主要有如下几个:

  1. VM 启动时自动执行, 默认任务只执行一次, 第二次启动就不会自动运行了. 如果需要每次启动都自动执行, 则需要设置 run: “always” 属性;
  2. vagrant up 和 vagrant reload 执行时加上 –provision 参数, 则会执行操作;
  3. VM 启动状态时, 执行 vagrant provison 命令执行;

执行顺序的问题, 根据vagrantfile的层次,分为:

  • configure级:它定义在 Vagrant.configure(“2”) 的下一层次,形如: config.vm.provision …
  • vm级:它定义在 config.vm.define “web” do |web| 的下一层次,web.vm.provision …

执行的顺序是: configure级任务 > vm级任务, 比如下面这个例子:

Vagrant.configure("2") do |config|
  config.vm.provision "shell", inline: "echo foo"

  config.vm.define "web" do |web|
    web.vm.provision "shell", inline: "echo bar"
  end

  config.vm.provision "shell", inline: "echo baz"
end

执行输出:

==> default: "foo"
==> default: "baz"
==> default: "bar"

Provision 执行 shell 脚本文件的配置方式:

# path 是基于当前 Vagrantfile 的相对路径, 与执行命令的操作是类似的
config.vm.provision "shell", path: "script.sh"

# path 可以使用 http/https 来访问远程脚本
config.vm.provision "shell", path: "https://example.com/provisioner.sh"

Vagrantfile 模拟多台虚拟机

这里就直接看一个配置文件吧, 如果看完前面的说明, 基本也知道这个配置文件是在做啥了~

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

  # 定义应用服务器
  config.vm.define :web do |web|
    web.vm.provider "virtualbox" do |v|
          v.customize ["modifyvm", :id, "--name", "web", "--memory", "512"]
    end
    web.vm.box = "centos7"
    web.vm.hostname = "web"
    web.vm.network :private_network, ip: "11.11.1.1"
  end

  # 定义DB服务器
  config.vm.define :db do |db|
    db.vm.provider "virtualbox" do |v|
          v.customize ["modifyvm", :id, "--name", "db", "--memory", "512"]
    end
    db.vm.box = "centos7"
    db.vm.hostname = "db"
    db.vm.network :private_network, ip: "11.11.1.2"
  end

  # 定义缓存服务器
  config.vm.define :redis do |redis|
    redis.vm.provider "virtualbox" do |v|
          v.customize ["modifyvm", :id, "--name", "redis", "--memory", "512"]
    end
    redis.vm.box = "centos7"
    redis.vm.hostname = "redis"
    reids.vm.network :private_network, ip: "11.11.1.2"
  end
end

这里定义的虚拟机都是互通的, 这样就可以在单机中模拟分布式机器的情况啦, 感觉如果有同学在学习 k8s 的话, 这种方式应该还是挺轻松的, 通过一个配置文件可以管理多台虚拟机.

参考文献

谢谢网络上各位大佬提供的资料啦, 这个整理也是不容易啊~
vagrant学习笔记 – provision
vagrant系列(2):使用Vagrantfile实现集成预安装

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/210001.html原文链接:https://javaforall.net

(0)
上一篇 2025年7月29日 下午9:43
下一篇 2025年7月29日 下午10:22


相关推荐

  • 国际私法自考总结复习大纲

    国际私法自考总结复习大纲

    2021年9月29日
    40
  • 卡尔曼滤波 — 从推导到应用(一)「建议收藏」

    卡尔曼滤波 — 从推导到应用(一)「建议收藏」前言卡尔曼滤波器是在估计线性系统状态的过程中,以最小均方差为目的而推导出的几个递推数学等式,也可以从贝叶斯推断的角度来推导。本文将分为两部分:第一部分,结合例子,从最小均方差的角度,直观地介绍卡尔曼滤波的原理,并给出较为详细的数学推导。第二部分,通过两个例子给出卡尔曼滤波的实际应用。其中将详细介绍一个匀加速模型,并直观的对比系统状态模型的建立对滤波的影响。

    2022年6月17日
    41
  • 科大讯飞:升级后的星火X1在知识问答等任务上效果显著提升

    科大讯飞:升级后的星火X1在知识问答等任务上效果显著提升

    2026年3月14日
    1
  • Sftp和ftp 区别

    Sftp和ftp 区别FTP 文件传输协议 工作原理 nbsp 目前在网络上 如果你想把文件和其他人共享 最方便的办法莫过于将文件放 FTP 服务器上 然后其他人通过 FTP 客户端程序来下载所需要的文件 1 FTP 架构 nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp 如同其他的很多通讯协议 FTP 通讯协议也采用客户机 服务器 Client Server 架构 用户可以通过各种不同的 FTP 客户端程序 借助 FTP 协议 来连接 FTP 服务器 以上传或者下载文件

    2026年3月17日
    2
  • 【JavaScript——牛客网算法No.HJ2】计算一个字符串中含有某个字符的个数[通俗易懂]

    【JavaScript——牛客网算法No.HJ2】计算一个字符串中含有某个字符的个数[通俗易懂]@No.HJ2@problemdescription:写出一个程序,接受一个由字母和数字组成的字符串,和一个字符,然后输出输入字符串中含有该字符的个数。不区分大小写。@inputdescription:第一行输入一个有字母和数字以及空格组成的字符串,第二行输入一个字符。@outputdescription:输出输入字符串中含有该字符的个数。示例@input:ABCDEFA@output:1varstr1=readline();varstr2=…

    2026年4月16日
    4
  • 函数WSAStartup[通俗易懂]

    函数WSAStartup一、WSAStartup函数               intWSAStartup                      (                         WORDwVersionRequested,                         LPWSADATAlpWSAData                      

    2022年4月7日
    120

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号