Vagrant 基本使用操作

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

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
    
  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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • mysql经典50道练习题

    mysql经典50道练习题问题及描述:–1.学生表Student(SID,Sname,Sage,Ssex)–SID学生编号,Sname学生姓名,Sage出生年月,Ssex学生性别–2.课程表Course(CID,Cname,TID)–CID–课程编号,Cname课程名称,TID教师编号–3.教师表Teacher(TID,Tname)–TID教师编号,Tname教师姓名–4.成绩……

    2022年9月18日
  • java开发手册黄山版_码出高效java开发手册pdf

    java开发手册黄山版_码出高效java开发手册pdf一、编程规约(一)命名风格6.【强制】抽象类命名使用Abstract或Base开头;异常类命名使用Exception结尾;测试类命名以它要测试的类的名称开始,以Test结尾。8.【强

    2022年8月3日
  • SpringBoot自定义starters

    SpringBoot自定义startersSpringBoot自定义starters1、简介2、如何自定义starter1、简介SpringBoot最强大的功能就是把我们常用的场景 抽象成一个个starter(场景启动器),我们通过引入springBoot为我们提供这些场景启动器,我们再进行少量的配置就能使用相应的功能。但是,SpringBoot不能包含所有的场景,经常需要我们自定义starter,来简化我们对springBoot的使用。2、如何自定义starter…

    2022年10月23日
  • 串口数据读取和动态显示Tkinter+matplotlib+pyqtgraph(详细教程)

    串口数据读取和动态显示Tkinter+matplotlib+pyqtgraph(详细教程)

    2020年11月8日
  • 关于用户路径分析模型_spark用户行为分析

    关于用户路径分析模型_spark用户行为分析一、需求背景在互联网数据化运营实践中,有一类数据分析应用是互联网行业所独有的——路径分析。路径分析应用是对特定页面的上下游进行可视化展示并分析用户在使用产品时的路径分布情况。比如:当用户使用某APP时,是怎样从【首页】进入【详情页】的,用户从【首页】分别进入【详情页】、【播放页】、【下载页】的比例是怎样的,以及可以帮助我们分析用户离开的节点是什么。在场景对应到具体的技术方案设计上,我们将访问数据根据session划分,挖掘出用户频繁访问的路径;功能上允许用户即时查看所选节点相关路径,支持用户自定义设

    2022年8月24日
  • stringtokenizer是什么意思_keyfactory.getinstance

    stringtokenizer是什么意思_keyfactory.getinstanceStringTokenizer可以将一个字符串分解为一个一个的单词或者标记。常用方法如下:methodcontentintcountTokens()返回nextToken方法被调用的次数。booleanhasMoreTokens()返回是否还有分隔符。booleanhasMoreElements()返回是否还有分隔符。StringnextTo…

    2022年8月11日

发表回复

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

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