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. 下载安装包

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盘空间告急的最佳做法。修改后,新创建的虚拟机就会自动存放到你指定的新位置。

  1. 打开VirtualBox:运行Oracle VM VirtualBox管理器。

  2. 进入全局设置:点击菜单栏的 “管理” (Manager),然后选择 “全局设定” (Global Settings)246

  3. 更改默认路径

    • 在弹出的窗口中,切换到 “常规” (General) 选项卡。

    • 你会看到 “默认虚拟电脑位置” (Default Machine Folder) 的选项。

    • 点击右侧的文件夹图标,选择一个空间充裕的非系统盘分区(如D盘、E盘)下的文件夹,或直接输入路径(例如D:\VirtualBox VMs236

  4. 确认保存:点击 “确定” (OK) 保存设置。

5. 修改Vagrant默认存储路径

Vagrant 本身通过一个名为 VAGRANT_HOME 的环境变量来确定它的“家”目录(包括下载的盒子文件、全局配置等)。修改它的步骤如下:

  • 确定新的存储路径:首先在D盘(或其他非系统盘)创建一个你喜欢的目录,例如 D:\Vagrant\.vagrant.d

  • 设置系统环境变量

    • 在Windows搜索框输入“编辑系统环境变量”并打开。

    • 在打开的“系统属性”窗口中,点击下方的“环境变量”按钮。

    • 在“系统变量”区域,点击“新建”。

    • 变量名设置为 VAGRANT_HOME

    • 变量值设置为新路径,例如 D:\Vagrant\.vagrant.d

    • 依次点击确定保存所有窗口15

  • 移动现有文件(如果已有盒子):如果之前使用Vagrant下载过盒子,需要将原目录(通常是 C:\Users\[你的用户名]\.vagrant.d)下的所有文件和文件夹复制或移动到新设置的 D:\Vagrant\.vagrant.d

  • 验证设置:打开一个新的命令行窗口(重要,这样才能让新的环境变量生效),输入以下命令,检查输出是否为你的新路径:

    echo %VAGRANT_HOME%
    

三、 使用 Vagrant 来模拟 Docker Swarm 部署

1. 主要流程

  1. 创建一个任意目录(例如 D:\D:\Vagrant\vagrant-docker-swarm),用于存放Vagrantfile和后续项目文件。

  2. 创建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)。

  3. 启动虚拟机 在当前Vagrantfile所在目录执行: vagrant up 如果出现下载失败问题可以尝试set VAGRANT_SERVER_URL=https://vagrantcloud.com/api/v2/vagrant

  4. 查看状态

    # 输出如
    Current machine states:
    
    master                    running (virtualbox)
    node                      running (virtualbox)
    
  5. 在虚拟机里安装 Docker,vagrant ssh master vagrant 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
    
  6. 登录Master节点: Vagrantfile所在目录执行 vagrant ssh master master为上面定义的hostname。如果出现 Bad owner or permissions on C:\Users\xx/.ssh/config 可以绕过检查vagrant ssh master -- -F NUL

  7. 初始化Swarm集群:在Master(192.168.56.10)节点上执行初始化命令,指定其为主管理节点。sudo docker swarm init --advertise-addr 192.168.56.10

  8. 获取加入令牌: 初始化成功后,记录输出中给出的docker swarm join …命令。 类似:docker swarm join –token 192.168.56.10:2377

  9. 加入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.

  10. 验证集群: 回到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 的常用命令

  1. 初始化项目
    vagrant init generic/centos7
    
    会生成一个 Vagrantfile。
  2. 启动虚拟机
vagrant up
  • 第一次启动会下载 box 镜像并创建虚拟机。
  • 之后再 up 就会直接启动已有的虚拟机。
  1. 登录虚拟机
vagrant ssh
# 或者指定虚拟机名(多虚拟机场景)
vagrant ssh master
  1. 停止虚拟机
vagrant halt
# 或指定
vagrant halt master
  1. 重启虚拟机
vagrant reload
# 修改了 Vagrantfile 后常用,重新应用配置
  1. 删除虚拟机
vagrant destroy
  1. 查看虚拟机状态
vagrant status
  1. 查看虚拟机列表(全局)
vagrant global-status
  1. 运行自动化配置
vagrant provision
# 会重新执行 config.vm.provision 脚本。
  1. 打包当前虚拟机为 box
vagrant package --output mybox.box