VirtualBox+Vagrant使用
一、 介绍
1. VirtualBox简介
VirtualBox是一个开源的 虚拟机管理软件,由 Oracle 开发。它的核心功能是允许你在一台物理机上运行多个虚拟机,每个虚拟机都可以装不同的操作系统。
特点:
跨平台:支持 Windows、Linux、macOS 主机上安装。
支持多种客操作系统:常见的 Linux 发行版(CentOS、Ubuntu)、Windows Server、BSD 等。
虚拟化功能:
配置虚拟 CPU、内存、磁盘、网卡等。
支持桥接网络、NAT、仅主机网络等多种网络模式。
GUI + CLI 管理:既可以用图形界面管理虚拟机,也可以用命令行
VBoxManage控制。适合个人和开发使用:开源免费,功能较全。
2. Vagrant简介
Vagrant 是一个虚拟机 自动化管理工具,它本身不提供虚拟化功能,而是调用 VirtualBox、VMware、Hyper-V、Docker 等“虚拟化提供者”(provider)来创建和管理虚拟机。
特点:
开发环境自动化:
通过Vagrantfile描述一台(或多台)虚拟机的配置,比如操作系统镜像、CPU/内存、网络、共享目录等。跨平台一致性:
不同开发者只要用相同的Vagrantfile,就能快速得到一模一样的开发环境,避免“在我机器上没问题”。支持多种 Provider:
默认支持 VirtualBox,也可以配合 VMware、Hyper-V、Libvirt、Docker。Provisioning(自动化配置):
可以在虚拟机启动时自动执行脚本(Shell、Ansible、Puppet、Chef)来安装软件和配置环境。命令行简单:
vagrant init→ 生成配置文件vagrant up→ 启动虚拟机vagrant ssh→ 进入虚拟机vagrant halt→ 关闭虚拟机vagrant destroy→ 删除虚拟机
3. VirtualBox 和 Vagrant 的关系
- VirtualBox 是虚拟机运行环境(相当于“底层引擎”)。
- Vagrant 是管理工具(相当于“遥控器”),它需要依赖 VirtualBox 来运行虚拟机。 比如:
- 如果只装 VirtualBox,你需要手动点 GUI,自己装系统、分配 CPU/内存、配网络。
- 如果用 Vagrant + VirtualBox,只需写个 Vagrantfile,执行 vagrant up,Vagrant 会调用 VirtualBox 自动完成虚拟机创建和配置。
二、 安装VirtualBox
1. 下载安装包:
去 VirtualBox 官网 下载 Windows 版本的安装程序。
去 Vagrant 官网 下载 Windows 版本的安装程序。
2. 运行安装程序:
双击下载的
VirtualBox-X.X.X-XXXXXX-Win.exe文件。基本上一直点击 “Next” (下一步)即可,所有默认选项都不需要改动。可能会短暂中断网络。(这里如果自定义非系统盘路径会出现一系列问题,建议默认路径直接安装)双击下载的
vagrant_X.X.X_windows_amd64.msi文件。同样,全程点击 “Next” (下一步),使用默认设置安装即可。
3. 验证安装:
安装完成后,打开你的 PowerShell 或 CMD 命令行。
输入
vagrant --version并回车。如果显示出版本号(如
Vagrant 2.3.7),说明安装成功。
4. 修改VirtualBox默认虚拟机存储位置
默认情况下,你创建的虚拟机(包括其磁盘镜像、配置文件等)确实通常会存放在C盘,具体位置一般在C:\Users[你的用户名]\VirtualBox VMs目录下。虚拟机镜像文件(.vdi、.vmdk等)通常体积庞大,很容易占用大量C盘空间。
修改默认虚拟机存储位置,是预防未来C盘空间告急的最佳做法。修改后,新创建的虚拟机就会自动存放到你指定的新位置。
打开VirtualBox:运行Oracle VM VirtualBox管理器。
进入全局设置:点击菜单栏的 “管理” (Manager),然后选择 “全局设定” (Global Settings)246。
更改默认路径:
确认保存:点击 “确定” (OK) 保存设置。
5. 修改Vagrant默认存储路径
Vagrant 本身通过一个名为 VAGRANT_HOME 的环境变量来确定它的“家”目录(包括下载的盒子文件、全局配置等)。修改它的步骤如下:
确定新的存储路径:首先在D盘(或其他非系统盘)创建一个你喜欢的目录,例如
D:\Vagrant\.vagrant.d。设置系统环境变量:
移动现有文件(如果已有盒子):如果之前使用Vagrant下载过盒子,需要将原目录(通常是
C:\Users\[你的用户名]\.vagrant.d)下的所有文件和文件夹复制或移动到新设置的D:\Vagrant\.vagrant.d。验证设置:打开一个新的命令行窗口(重要,这样才能让新的环境变量生效),输入以下命令,检查输出是否为你的新路径:
echo %VAGRANT_HOME%
三、 使用 Vagrant 来模拟 Docker Swarm 部署
1. 主要流程
创建一个任意目录(例如 D:\D:\Vagrant\vagrant-docker-swarm),用于存放Vagrantfile和后续项目文件。
创建Vagrantfile, 内容如:
Vagrant.configure("2") do |config| # 1. 定义一个通用的 CentOS 盒子 # 使用一个轻量且常见的 CentOS 7 镜像。Vagrant 会自动从互联网下载。 config.vm.box = "generic/centos7" # 2. 配置宿主机和虚拟机之间的共享目录(可选,按需启用) # config.vm.synced_folder "./data", "/vagrant_data" # 3. 配置主机管理器插件(可选但推荐) # 如果你安装了 'vagrant-hostmanager' 插件,它可以自动更新所有虚拟机的 /etc/hosts 文件 # 使用命令安装: `vagrant plugin install vagrant-hostmanager` # config.hostmanager.enabled = true # config.hostmanager.manage_host = true # config.hostmanager.ignore_private_ip = false # config.hostmanager.include_offline = true # 4. 定义 Master 节点 config.vm.define "master" do |master| master.vm.hostname = "master" # 设置主机名,在集群中很重要 master.vm.network "private_network", ip: "192.168.56.10" # 设置私有静态IP,用于节点间通信 # 配置虚拟机资源(根据你的电脑配置调整) master.vm.provider "virtualbox" do |vb| vb.memory = 2048 # 分配 2GB 内存 vb.cpus = 2 # 分配 2 个 CPU 核心 vb.name = "vagrant-master" # 在VirtualBox中显示的名称 end # (可选)Provisioning: 在首次启动时自动执行的脚本 # master.vm.provision "shell", inline: <<-SHELL # echo "Hello from Master!" # SHELL end # 5. 定义 Node (Worker) 节点 config.vm.define "node" do |node| node.vm.hostname = "node1" # 设置主机名 node.vm.network "private_network", ip: "192.168.56.11" # 设置私有静态IP,与Master在同一网段 # 配置虚拟机资源(Node节点可以稍弱一些) node.vm.provider "virtualbox" do |vb| vb.memory = 1024 # 分配 1GB 内存 vb.cpus = 1 # 分配 1 个 CPU 核心 vb.name = "vagrant-node1" end # (可选)Provisioning # node.vm.provision "shell", inline: <<-SHELL # echo "Hello from Node!" # SHELL end end确保Vagrantfile中定义了一台master(如master)和一台node(如node1),并配置了私有网络(如192.168.56.10和.11)。
启动虚拟机 在当前Vagrantfile所在目录执行:
vagrant up如果出现下载失败问题可以尝试set VAGRANT_SERVER_URL=https://vagrantcloud.com/api/v2/vagrant查看状态
# 输出如 Current machine states: master running (virtualbox) node running (virtualbox)在虚拟机里安装 Docker,
vagrant ssh mastervagrant ssh node进入两台虚拟机(master 和 node1) 都执行以下命令:# 更新 yum 源并安装依赖 sudo yum install -y yum-utils device-mapper-persistent-data lvm2 # 添加 Docker 官方仓库 sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo # 安装 Docker sudo yum install -y docker-ce docker-ce-cli containerd.io # 启动并开机自启 sudo systemctl start docker sudo systemctl enable docker登录Master节点: Vagrantfile所在目录执行
vagrant ssh mastermaster为上面定义的hostname。如果出现 Bad owner or permissions on C:\Users\xx/.ssh/config 可以绕过检查vagrant ssh master -- -F NUL初始化Swarm集群:在Master(192.168.56.10)节点上执行初始化命令,指定其为主管理节点。
sudo docker swarm init --advertise-addr 192.168.56.10获取加入令牌: 初始化成功后,记录输出中给出的docker swarm join …命令。 类似:docker swarm join –token
192.168.56.10:2377 加入Worker节点: 打开另一个终端,SSH登录到Node节点
$ vagrant ssh node,执行上一步获取的join命令。sudo docker swarm join --token <token> 192.168.56.10:2377成功输出如This node joined a swarm as a worker.验证集群: 回到Master节点的终端,查看节点列表。
sudo docker node ls正常输入类似如:1. ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS abc123... k8s-master Ready Active Leader def456... k8s-node1 Ready Active
说明集群成功。
2. 在Swarm集群中部署服务
Swarm集群搭建成功后,你就可以在Master节点上使用 docker service 命令来部署和管理跨节点的容器服务了。例如,部署一个Nginx服务:
# 在 Swarm 集群中创建一个名为 "web" 的 Nginx 服务,并映射端口 8080
# --replicas 2 表示运行两个实例,Swarm 会自动调度到可用节点上(包括 Master 和 Node1)
sudo docker service create --name web -p 8080:80 --replicas 2 nginx:alpine
查看服务运行情况:
sudo docker service ps web
测试访问: 在宿主机(Windows)上访问:
# master
http://192.168.56.10:8080
# node1
http://192.168.56.11:8080
都能访问到 nginx 欢迎页,说明 Swarm 负载均衡 已经生效。
四、Vagrantfile 的写法
Vagrantfile 是 Vagrant 的核心配置文件,里面用 Ruby DSL 来描述虚拟机的配置。
基本结构如:
Vagrant.configure("2") do |config|
# 1. 指定 box(基础镜像)
config.vm.box = "generic/centos7"
# 2. 设置主机名
config.vm.hostname = "k8s-master"
# 3. 网络配置
# NAT 模式(默认)
# config.vm.network "forwarded_port", guest: 80, host: 8080
# 私有网络(常用于集群通信)
config.vm.network "private_network", ip: "192.168.56.10"
# 公有网络(桥接)
# config.vm.network "public_network"
# 4. 共享目录
# 将宿主机目录映射到虚拟机中
config.vm.synced_folder "./data", "/vagrant_data"
# 5. Provider 配置(这里是 VirtualBox)
config.vm.provider "virtualbox" do |vb|
vb.name = "vagrant-master" # VirtualBox 中显示的名字
vb.memory = 2048 # 内存
vb.cpus = 2 # CPU 核心
end
# 6. Provision(自动化配置)
config.vm.provision "shell", inline: <<-SHELL
yum install -y epel-release
yum install -y nginx
echo "Hello Vagrant" > /usr/share/nginx/html/index.html
SHELL
end
常见配置项
config.vm.box → 指定基础镜像(box)
config.vm.hostname → 设置虚拟机主机名
config.vm.network → 设置网络(NAT/私有/公有/端口转发)
config.vm.synced_folder → 设置共享目录
config.vm.provider → 设置虚拟化提供者参数(CPU、内存等)
config.vm.provision → 定义自动执行的配置脚本
五、 Vagrant 的常用命令
- 初始化项目会生成一个 Vagrantfile。
vagrant init generic/centos7 - 启动虚拟机
vagrant up
- 第一次启动会下载 box 镜像并创建虚拟机。
- 之后再 up 就会直接启动已有的虚拟机。
- 登录虚拟机
vagrant ssh
# 或者指定虚拟机名(多虚拟机场景)
vagrant ssh master
- 停止虚拟机
vagrant halt
# 或指定
vagrant halt master
- 重启虚拟机
vagrant reload
# 修改了 Vagrantfile 后常用,重新应用配置
- 删除虚拟机
vagrant destroy
- 查看虚拟机状态
vagrant status
- 查看虚拟机列表(全局)
vagrant global-status
- 运行自动化配置
vagrant provision
# 会重新执行 config.vm.provision 脚本。
- 打包当前虚拟机为 box
vagrant package --output mybox.box