大家好,又见面了,我是你们的朋友全栈君。
Others
- Vagrant 基本使用操作
- Vagrant 是什么?
- Vagrant 安装
- Vagrant 快速上手安装 CentOS
- Vagrant 基本命令小结
- Vagrantfile 配置文件
- 常用相关配置说明
- 虚拟网络配置说明
- Provision 配置说明
- Vagrantfile 模拟多台虚拟机
- 参考文献
Vagrant 基本使用操作
Vagrant 是什么?
Vagrant 是一款支持自动化虚拟机暗转、可配置流程的用于管理虚拟机的软件. 主要的优势在于可以提供一个可配置、可移植和复用的虚拟机环境 (通过定义 Vagrantfile , 类似 Dockerfile ), 并且可以使用 shell、chef、puppet 等工具进行部署. 这里要注意, Vagrant 并不能单独使用, 必须要在自己的电脑里安装额外的虚拟机软件, 比如常见的虚拟机软件有: VirtualBox、VMWare 等.
Vagrant 安装
- Vagrant 官网下载地址: https://www.vagrantup.com/downloads.html
- VirtualBox 官网下载地址: https://www.virtualbox.org/wiki/Downloads
备注: 我安装的是 2.2.6 版本的 Vagrant , 与 6.0 版本之后的 VirtualBox 并不兼容, 所以安装的是 5.2 版本的 VirtualBox , 大家稍微注意一下~
Vagrant 快速上手安装 CentOS
这里通过 centos 7 来做个例子, 来快速安装一个 centos 7 的虚拟机.
首先可以通过 Vagrant Cloud 网站去查找需要的镜像, 展示出来的标题就是 box 名称, 比如 centos/7 就是一个 box (可以简单理解为镜像);
新建一个目录 (比如: ~/virtual-os/centos7/) , 然后执行如下命令在当前目录初始化一个 Vagrantfile 配置文件.
代码语言:javascript复制vagrant init centos/7
执行如下命令, 启动虚拟机
代码语言:javascript复制vagrant up
在这一步的执行过程中, 若本地没有配置镜像的额外地址, 则会到 Vagrant Cloud 中去下载 box , 但是由于 Vagrant Cloud 在海外, 所以速度会比较慢. 可以在网上找到对应的镜像下载到本地, 再添加 box 的配置中去, 比如:
代码语言:javascript复制vagrant box add --name=’centos/7’ {
mirrot_local_path}
通过如下 status 命令可以查看当前虚拟机状态 (running 表示正在运行)
代码语言:javascript复制vagrant status
虚拟机启动完成之后, 通过如下命令 ssh 登陆到虚拟机中 (默认的用户名和密码都是 vagrant)
代码语言:javascript复制vagrant ssh
通过执行 halt 命令关闭虚拟机, destroy 命令销毁虚拟机
代码语言:javascript复制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 就相当于是启动虚拟机的配置文件, 常见的配置如下:
代码语言:javascript复制# -*- 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 也能访问主机, 只有和宿主机是互通的, 其他机器无法访问.
几种配置方式大致列举一下:
代码语言:javascript复制# 映射 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) 执行的操作.
代码语言:javascript复制# 比如: 执行打印 hello provision
config.vm.provision "shell", inline: "echo hello provision"
而 Provision 操作指令执行的时机主要有如下几个:
- VM 启动时自动执行, 默认任务只执行一次, 第二次启动就不会自动运行了. 如果需要每次启动都自动执行, 则需要设置 run: “always” 属性;
- vagrant up 和 vagrant reload 执行时加上 –provision 参数, 则会执行操作;
- VM 启动状态时, 执行 vagrant provison 命令执行;
执行顺序的问题, 根据vagrantfile的层次,分为:
- configure级:它定义在 Vagrant.configure(“2”) 的下一层次,形如: config.vm.provision …
- vm级:它定义在 config.vm.define “web” do |web| 的下一层次,web.vm.provision …
执行的顺序是: configure级任务 > vm级任务, 比如下面这个例子:
代码语言:javascript复制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
执行输出:
代码语言:javascript复制==> default: "foo"
==> default: "baz"
==> default: "bar"
Provision 执行 shell 脚本文件的配置方式:
代码语言:javascript复制# path 是基于当前 Vagrantfile 的相对路径, 与执行命令的操作是类似的
config.vm.provision "shell", path: "script.sh"
# path 可以使用 http/https 来访问远程脚本
config.vm.provision "shell", path: "https://example.com/provisioner.sh"
Vagrantfile 模拟多台虚拟机
这里就直接看一个配置文件吧, 如果看完前面的说明, 基本也知道这个配置文件是在做啥了~
代码语言:javascript复制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.cn/210001.html原文链接:https://javaforall.cn