Vagrant 是⼀款⽀持⾃动化虚拟机安装、可配置流程的⽤于管理虚拟机的软件. 主要的优势在于可以提供⼀个可配置、可移植和复⽤的虚拟机环境 (通过定义 Vagrantfile , 类似 Dockerfile ), 并且可以使⽤shell、chef、puppet 等⼯具进⾏部署. 这⾥要注意, Vagrant 并不能单独使⽤, 必须要在⾃⼰的电脑⾥安
装额外的虚拟机软件, ⽐如常⻅的虚拟机软件有: VirtualBox、VMWare 等。
Vagrant 官⽹下载地址: https://www.vagrantup.com/downloads.html
VirtualBox 官⽹下载地址: https://www.virtualbox.org/wiki/Downloads
官⽅镜像地址 https://app.vagrantup.com/boxes/search
不想装在C盘的话,按照如下方法改变路径。
打开 VirtualBox 程序,点击 管理/全局设定 菜单项(Ctrl+G), 将 常规 栏⾥的 默认虚拟电脑位置(M) 改为其他磁盘下的路径将原路径C:\Users\user_name.VirtualBox\VirtualBox VMs 下的⽂件移动到新路径下。
重新启动VirtualBox程序,在虚拟机列表⾥,以前建⽴的虚拟机虽然都还在,但已经不可⽤了,将他们全部删除。
双击打开新路径各个⽂件夹⾥的vbox⽂件,将建⽴的虚拟机重新导⼊。
将 C:\Users\user_name.vagrant.d 移动到新的位置
新建环境变量 VAGRANT_HOME ,并指向新路径
下载好box以后一路默认安装下去就行了。
这⾥通过 centos 7 来做个例⼦, 来快速安装⼀个 centos 7 的虚拟机
2. 新建⼀个⽬录 (⽐如: ~/virtual-os/centos7/) , 然后执⾏如下命令在当前⽬录初始化⼀个 Vagrantfile
配置⽂件
vagrant init centos/7
执⾏如下命令, 启动虚拟机
vagrant up
通过如下 status 命令可以查看当前虚拟机状态 (running 表示正在运⾏
vagrant status
虚拟机启动完成之后, 通过如下命令 ssh 登陆到虚拟机中 (默认的⽤户名和密码都是 vagrant,如上图中有的
通过执⾏ halt 命令关闭虚拟机, destroy 命令销毁虚拟机
vagrant halt
vagrant destory
这是win11的界面,win10 找也是差不多的,类似这个。
修改Vagrantfile
config.vm.network "private_network", ip: "192.168.56.20"
修改完成后,重启启动vagrant
vagrant reload
检查宿主机和virtualBox之间的通信是否正常
[vagrant@localhost ~]$ ping 本机地址
开启远程登陆,修改“/etc/ssh/sshd_config”
用root账号去改。root 密码是 vagrant
可以看到现在是root
再次输入
vi /etc/ssh/sshd_config
PermitRootLogin yes
PasswordAuthentication yes
然后重启SSHD
systemctl restart sshd
使⽤Xshell或SecureCRT进⾏远程连接即可
常⽤相关配置说明
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)"
这⾥就直接看⼀个配置⽂件吧, 如果看完前⾯的说明, 基本也知道这个配置⽂件是在做啥了~
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 = "centos/7"
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 = "centos/7"
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 = "centos/7"
redis.vm.hostname = "redis"
reids.vm.network :private_network, ip: "11.11.1.2"
end
end
这⾥定义的虚拟机都是互通的, 这样就可以在单机中模拟分布式机器的情况啦, 这样我们在学习 k8s 的话,这种⽅式应该还是挺轻松的, 通过⼀个配置⽂件可以管理多台虚拟机。