Vagrant笔记

1. Vagrant简介

1.1 是什么

vagrant是依赖于虚拟机软件进行工作的

vagrant是构建在虚拟机技术上的虚拟机运行环境管理工具

vagrant用于创建和部署虚拟机运行环境的

用VirtualBox举例,VirtualBox会开放一个创建虚拟机的接口,Vagrant会利用这个接口创建虚拟机,并且通过Vagrant来管理,配置和各种安装虚拟机。

好处是可以提供一个可配置,可移植和可复用的软件环境

Vagrant简单的配置,丰富的自动化脚本资源以及分享的便捷性都是我们应该学习的思想

1.2 能干啥

Vagrant是开发者的福音,摆脱了重复配置环境的处境,用它来方便快捷的管理自己的开发环境,自动部署无需人工参与

Vagrant可以统一开发环境

Vagrant是构建在虚拟机上的虚拟化运行环境管理工具

  • 建立和删除虚拟机
  • 配置虚拟机运行参数
  • 管理虚拟机运行状态
  • 自动化配置和安装开发环境
  • 打包和分发虚拟机运行环境

2. Vagrant安装

2.1 前提

在BIOS开启VT-x/AMD-v虚拟化技术支持

image-20201007184849576

Hypervisor是一种运行在物理服务器和操作系统之间的中间软件层,可允许多个操作系统和应用共享一套基础物理硬件,因此也可以看作是虚拟环境中的“元”操作系统,它可以协调访问服务器上的所有物理设备和虚拟机,也叫虚拟机监视器(Virtual Machine Monitor)。Hypervisor是所有虚拟化技术的核心。非中断地支持多工作负载迁移的能力是Hypervisor的基本功能。当服务器启动并执行Hypervisor时,它会给每一台虚拟机分配适量的内存、CPU、网络和磁盘,并加载所有虚拟机的客户操作系统。

Hypervisor是所有虚拟化技术的核心,软硬件架构和管理更高效,更灵活,硬件的效能能够更好的发挥出来。常见的产品有:VMware,KVM,Xen等等。

关闭hyper-v和沙箱

我电脑根本没这两个,所有更不要说关闭了…….

image-20201007181613912

2.2 下载

cmder

image-20201007183306333

vagrant

image-20201007183340348

vbox

可以选择哪个版本,个人还是比较喜欢新版本

image-20201007183502606

image-20201007183553873

2.3 安装

都是无脑下一步….

2.4 修改默认位置

虚拟机安装位置

默认是在C盘,可以换在别的盘下

打开virbox,点击左上角管理,选择第一个全局设定,或者直接Ctrk+G

image-20201007184007573

本地box库位置

设置VAGRANT_HOME环境变量

image-20201007184334553

因为vagrant up 命令会尝试访问%userprofile%.vagrant.d文件夹,到那时%userprofile%是以gbk命名的。

设置VAGRANT_HOME可以指向vagrant的ruby脚本可识别的路径,可以说vagrant不能识别中文路径(我的%userprofile%为C:\Users\zhangxin其实也是可以的但是主要还是不愿放在系统盘)

3. Vagrant概念

Box

盒子

Vagrant环境的软件包格式

Vagrant使用基础镜像来快速克隆虚拟机,而不是从头开始构建虚拟机。这些基础镜像在Vagrant中被称为“box”,并且指定用于Vagrant环境的box始终是创建新Vagrantfile后的第一步

Vagrant支持的任何平台上的任何人都可以使用盒子来建立相同的工作环境

https://app.vagrantup.com/boxes/search

image-20201007185504425

provider

供应者,提供者,譬如:Virtualbox,VMware等

虚拟机

指vbox上的系统

宿主机

本机,自己的电脑

简单启动

vagrant init hashicorp/bionic64

vagrant up

本地没有这个name的box会从官方库下载

4. Vagrant命令

帮助

1
2
vagrant -h 
vagrant xxx -h

box

-h 查看

添加box

1
2
3
vagrant box add <name> xxx.box
vagrant box add --name <name> xxx.box
#添加到哪里 VAGRANT_HOME指定的地方

查看box

1
vagrant box list

provider参数

1
指定provider的box,默认是virtualbox

version参数

1
指定一个版本,默认是0

json文件方式添加

删除box

1
vagrant box remove <name>

初始化

1
2
3
4
-h 查看

vagrant init
vagrant init <box-name>

init会生成一个vagrantfile文件

里面是ruby语言的语法

你可以根据一定的语法和vagrant官方提供的api接口说明,自定义修改配置这个文件,达到更加个性化自由化的符合你的虚拟机环境

image-20201007200316236

启动

1
2
3
4
-h 查看
vagrant up
vagrant up 机器名 # 多机器的时候使用
provider 参数 # 如果要启动有多个provider的(同名)box,需要在使用vagrant up命令时添加--provider 选项 譬如vmware和vbox的centos都有需要指定

重启

1
2
-h 查看
vagrant reload

privision

1
2
3
4
-h 查看
vagrant reload
常结合重启使用:vagrant reload --provision
# reload重启时,如果修改了vagrantfile中部分代码不会重新加载,需要结合--provision

ssh

1
2
3
4
-h 查看
vagrant ssh
vagrant ssh -config

其他

1
2
3
4
5
6
vagrant suspend   # 暂停
vagrant resume # 恢复
vagrant destroy # 销毁
vagrant package # 打包

#使用-h 查看就行了 很多命令都是不常用的

使用JSON导入box

1
2
3
4
5
6
7
8
9
10
11
// metadata.json
{
"name":"docker_centos",
"versions":[{
"version":"1.0.0",
"providers":[{
"name":"virtualbox",
"url":"./docker.box"
}]
}]
}
1
vagrant box add metadata.json

centos案例:自定义启动

5. Vagrant插件

5.1 查看

1
vagrant plugin list

5.2 snapshot插件

1
2
# 保存快照功能 目前vagrant官方默认已经集成可此插件
vagrant plugin install vagrant-vbox-snapshot

image-20201007210057363

5.3 vbguest插件

有时候我们发现有些virtualbox无法使用自定义共享目录,这时候就需要安装vbguet客户端(类似于Vmware的client)

插件实现了vbguest客户端会在虚拟机启动的时候实现添加的。其实如果不去添加,下次虚拟机启动的时候会默认去添加的。

每次启动虚机都会检查vbguest插件的更新,如果不想更新,修改Vgrantfile的文件,加上这样一条(因为检查更新是访问外网的还是比较慢的)

1
config.vbguest.auto_update = false
1
2
3
通过插件自动安装 Virtualbox Guest Additions 实现自定义
vagrant plugin install vagrant-vbguest
手动执行vbguest

image-20201007210823712

1
2
#在vagrantfile中通过下面的命令配置共享文件夹
config.vm.synced_folder "./data", "/mydata"
1
config.vm.synced_folder "./data", "/mydata",create: true, owner: "root",group: "root"

5.4 hostmanager插件

1
2
用主机名访问,可以实现虚机之间用主机名互相访问,也可实现宿主机用主机名访问虚机
vagrant plugin install vagrant-hostmanager

5.5 bindfs插件

1
2
插件bindfs可以支持共享模式,如nfs,samba
vagrant plugin install vagrant-bindfs

6. Vagrant自定义

6.1 自定义名称

1
2
3
#修改vagrantfile
vb.name="docker1" #虚拟名
config.vm.hostname="docker1"

资源优化

1
2
3
4
5
config.vm.provider "virtualbox" do |vb|
vb.name="docker"
vb.cpus=2
vb.memory="2048"
end

端口转发

1
2
3
#一般都是自定义ip 不用这个

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

自定义ip

1
config.vm.network "private_network", ip: "192.168.56.10"

公有网络

1
2
3
# 在varantfile中将公有网络注释打开

config.vm.network "public_network"
1
2
3
4
5
6
7
config.vm.provision "shell", inline: <<-SHELL
sudo yum install -y git wget net-tools curl vim
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install -y docker-ce docker-ce-cli containerd.io
sudo systemctl start docker
SHELL

7. 多节点

先定义两台主机

修改vagrantfile

1
2
3
4
5
6
config.vm.box = "ninghao"
config.vm.define "development" do |development|
end

config.vm.define "production" do |production|
end

配置私有网络

1
2
3
4
5
6
7
8
9
config.vm.box = "ninghao"

config.vm.define "development" do |development|
development.vm.network "private_network", ip: "192.168.33.11"
end

config.vm.define "production" do |production|
production.vm.network "private_network", ip: "192.168.33.22"
end

配置主机名

1
2
3
4
5
6
7
8
9
10
11
config.vm.box = "ninghao"

config.vm.define "development" do |development|
development.vm.network "private_network", ip: "192.168.33.11"
production.vm.hostname = "ninghao-dev"
end

config.vm.define "production" do |production|
production.vm.network "private_network", ip: "192.168.33.22"
production.vm.hostname = "ninghao-prod"
end

设置同步目录

1
2
3
4
5
6
7
8
9
10
11
12
13
config.vm.box = "ninghao"

config.vm.define "development" do |development|
development.vm.network "private_network", ip: "192.168.33.11"
development.vm.hostname = "ninghao-dev"
development.vm.synced_folder "development", "/vagrant"
end

config.vm.define "production" do |production|
production.vm.network "private_network", ip: "192.168.33.22"
production.vm.hostname = "ninghao-prod"
production.vm.synced_folder "production", "/vagrant"
end

新建三个虚拟机的完整Vagrantfile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
boxes = [
{
:name => "manager-node",
:eth1 => "192.168.8.11",
:mem => "1024",
:cpu => "1"
},
{
:name => "worker01-node",
:eth1 => "192.168.8.12",
:mem => "1024",
:cpu => "1"
},
{
:name => "worker02-node",
:eth1 => "192.168.8.13",
:mem => "1024",
:cpu => "1"
}
]

Vagrant.configure(2) do |config|

config.vm.box = "centos/7"

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]]
v.customize ["modifyvm", :id, "--name", opts[:name]]
end

config.vm.network :public_network, ip: opts[:eth1]
end
end

end

Vagrant操作

Vagrant是一个基于Ruby的工具,用于创建和部署虚拟化开发环境。它 使用Oracle的开源 VirtualBox虚拟化系统,使用 Chef创建自动化虚拟环境。

首先需要安装 VirtualBox

image-20200704100140863

https://app.vagrantup.com/boxes/search vagrant官方镜像地址

https://www.vagrantup.com/downloads vagrant下载

image-20200704100045290

打开window cmd窗口 运行vagrant init centos/7,即可初始化一个centos7 系统

运行vagrant up 即可启动虚拟机。系统root用户的密码是vagrant

vagrant ssh:自动使用vagrant 用户连接虚拟机

密码登录

vim /etc/ssh/sshd_config

修改PasswordAuthentication yes/no

直接当前目录输入passwd修改密码,比如abc123

重启服务 service sshd restart systemctl restart sshd

默认网络地址转换-端口转发

image-20200706113456773

每装一个软件都需要端口映射

image-20200706113719662

我们给虚拟机设置一个固定的ip地址 这样直接访问就好了

我创建vagrant是在C:\Users\zhangxin 修改Vagrantfile

1
# config.vm.network "private_network", ip: "192.168.33.10"

将注释打开 查看ipconfig VirtualBox中ip地址 192.168.56.xx 使其在同一网段

image-20200706180627852

修改完成后vagrant reload 重启即可