Vagarnt - Homestead Box使用

AI 摘要: Vagrant是一个简化开发环境的工具,可以与VirtualBox等Provider配合使用。Homestead是Vagrant的一个配置库,主要用于PHP的Laravel开发,提供了流行的Web开发工具支持。Vagrant与Cli工具、Docker和Terraform等工具相比有不同的特点和用途。

1. Vagrant相关组件介绍

1.1. Homestead 介绍

Laravel Homestead是一个官方的预打包Vagrant Box(流浪盒),同类型的Box还有很多:。

它提供了一个非常棒的开发环境,而不需要您在本地机器上安装PHP、web服务器和任何其他服务器软件。再也不用担心操作系统出问题了!流浪Box完全是一次性的。如果出了什么问题,你可以在几分钟内摧毁并重新创建这个盒子!

多系统支持:Homestead可以运行在任何Windows、Mac或Linux系统上。

携带配套软件支持:包括Nginx web服务器、PHP 7.3、MySQL、Postgres、Redis、Memcached、Node,以及开发惊人的Laravel应用程序所需的所有其他好东西。

1.2. Vagrant 介绍

Vagrant是一种在单个工作流程中构建和管理虚拟机环境的工具,旨在每个人创建虚拟化环境的最简单,最快捷的方式。

通过易于使用的工作流程并专注于自动化,Vagrant降低了开发环境的设置时间,提高了生产平价,并使“在我的机器上工作”成为过去的遗留物。

  • 开发人员:Vagrant将在一个一致的,一致的环境中隔离依赖关系及其配置,而不会牺牲您习惯使用的任何工具(编辑器,浏览器,调试器等),团队的其他成员使用相同的配置创建他们的开发环境,因此无论您是在Linux,Mac OS X还是Windows上工作,您的所有团队成员都在同一环境中运行代码,针对相同的依赖项,所有组件都配置相同办法。
  • 操作工程师或DevOps工程师:Vagrant为您提供一次性环境和一致的工作流程,用于开发和测试基础架构管理脚本。您可以使用VirtualBox或VMware等本地虚拟化快速测试shell脚本,Chef cookbook,Puppet模块等内容。

1.3. Vagrant与其他工具对比

1.3.1. 与Cli工具(比如virtualbox

Vagrant以多种方式构建在这些实用程序之上,Vagrant支持多个同步文件夹类型,多个配置程序来设置机器,自动SSH设置,在您的开发环境中创建HTTP隧道等等。

1.3.2. 与Docker容器对比

Vagrant是一个专注于跨多个操作系统提供一致的开发环境工作流的工具。Docker是一种容器管理,只要存在容器化系统,就可以始终如一地运行软件。

容器通常比虚拟机更轻,因此启动和停止容器非常快。Docker在macOS,Linux和Windows上使用本机容器化功能。

目前,Docker缺乏对某些操作系统(如BSD)的支持。如果您的目标部署是这些操作系统之一,Docker将不会提供与Vagrant之类的工具相同的生产奇偶校验。Vagrant还允许您在Mac或Linux上运行Windows开发环境。

对于微服务繁重的环境,Docker可能很有吸引力,因为您可以轻松启动单个Docker VM并快速启动多个容器。这是Docker的一个很好的用例。Vagrant也可以使用Docker提供程序执行此操作。Vagrant的主要好处是一致的工作流程,但在很多情况下,纯Docker工作流程确实有意义。

Vagrant和Docker都拥有庞大的社区贡献“图像”或“盒子”库供您选择。

1.3.3. 与Terraform对比

Vagrant和Terraform都是HashiCorp的项目。Vagrant是一个专注于管理开发环境的工具,Terraform是一个用于构建基础架构的工具。

Vagrant提供了许多Terraform没有的更高级功能。同步文件夹,自动网络,HTTP隧道等是Vagrant提供的功能,可以简化开发环境的使用。由于Terraform专注于基础架构管理而非开发环境,因此这些功能超出了该项目的范围。

Vagrant适用于开发环境。Terraform用于更一般的基础架构管理。

1.4. VirtaulBox - 作为Vagrant的Provider

VirtualBox是一款免费的跨平台消费者虚拟化产品,在Vagrant中,使用VirtualBox作为入门指南的提供者(Provider),因此需要先安装它

VirtualBox是一款功能强大的x86和AMD64 / Intel64 虚拟化产品,适用于企业和家庭用户。

同类型的Provier还有很多,例如VMware, Hyper-V等。

更多Provider参见:https://www.vagrantup.com/intro/getting-started/providers.html

2. Homestead 目录说明

2.1. 基本使用

  1. 安装VirtualBox: https://www.virtualbox.org/
  2. 安装Vagrant: https://www.vagrantup.com/docs/installation/
  3. 克隆~/Homestead:
1
2
cd ~/Homestead
git clone https://github.com/laravel/homestead.git
  1. vagrant启动: vagrant up
  2. 进入虚拟机: vagrant ssh

2.2. 关键配置介绍

  • Vagrantfile:vagrant配置
  • Homestead.yaml:Homestead配置,最终是被vagrant引用(Web开发人员专注这块即可)
  • after.shuser-customizations.sh:这两个脚本主要是作为相关自定义shell使用
  • aliases:在vgarnt启动的guest主机上面的相关alais别名
  • scripts目录:
    • scripts/homestead.rb: 关键的配置文件脚本,其中涉及大量的从Homestead.Yaml中读取的配置,基于provider的相关命令进行操作(比如shell、file等)
    • features: 其他相关特性,很多流行软件都有涉及:
1
2
3
4
$ ls scripts/features
blackfire.sh     couchdb.sh       elasticsearch.sh grafana.sh       minio.sh         neo4j.sh         pm2.sh           solr.sh
cassandra.sh     crystal.sh       gearman.sh       influxdb.sh      mongodb.sh       ohmyzsh.sh       python.sh        webdriver.sh
chronograf.sh    docker.sh        golang.sh        mariadb.sh       mysql8.sh        openresty.sh     rabbitmq.sh

2.2.1. Vagrantfile

vagrant读取的配置文件,涉及Homestead基础配置与脚本执行相关:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
AGRANTFILE_API_VERSION ||= "2"
confDir = $confDir ||= File.expand_path(File.dirname(__FILE__))

homesteadYamlPath = confDir + "/Homestead.yaml"
homesteadJsonPath = confDir + "/Homestead.json"
afterScriptPath = confDir + "/after.sh"
customizationScriptPath = confDir + "/user-customizations.sh"
aliasesPath = confDir + "/aliases"

require File.expand_path(File.dirname(__FILE__) + '/scripts/homestead.rb')

2.2.2. Homestead.yaml

Homestead配置,最终是被vagrant引用(Web开发人员专注这块即可,比如provider设置、virtualbox vm设置,ssh认证、文件夹共享、站点相关设置等

 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
---
ip: "192.168.10.10"
memory: 2048
cpus: 2
provider: virtualbox

authorize: ~/.ssh/id_rsa.pub

keys:
    - ~/.ssh/id_rsa

folders:
    - map: ~/code
      to: /home/vagrant/code

sites:
    - map: homestead.test
      to: /home/vagrant/code/public

databases:
    - homestead

features:
    - mariadb: false
    - ohmyzsh: false
    - webdriver: false

2.2.3. script脚本相关

配置文件脚本目录,主要的配置文件脚本为homestead.rb,其中涉及大量的从Homestead.Yaml中读取的配置,基于provider的相关命令进行操作(比如shell、file等)

homestead.rb脚本会基于homestead.yaml配置调用其他相关脚本(比如开启指定Mysql、Mongo、ES服务等)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
$ tree -L 1 ./scripts
./scripts
├── clear-nginx.sh
├── clear-variables.sh
├── create-certificate.sh
├── create-couch.sh
├── create-ecosystem.sh
├── create-influxdb.sh
├── create-minio-bucket.sh
├── create-mongo.sh
├── create-mysql.sh
├── create-ngrok.sh
├── create-postgres.sh
├── cron-schedule.sh
├── features
├── flip-webserver.sh
├── homestead.rb
├── hosts-add.sh
├── hosts-reset.sh
├── install-load-balancer.sh
├── install-xhgui.sh
└── site-types

2.2.4. scripts/homestead.rb

可以看到在homestead.rb配置脚本文件中,大都都是基于provider的shellfile操作,以及调用相关provider的配置命令:

 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
def self.configure(config, settings)
    # Set The VM Provider
    ENV['VAGRANT_DEFAULT_PROVIDER'] = settings['provider'] ||= 'virtualbox'

    # Configure Local Variable To Access Scripts From Remote Location
    script_dir = File.dirname(__FILE__)
    ...

    # Configure The Box
    config.vm.define settings['name'] ||= 'homestead'
    config.vm.box = settings['box'] ||= 'laravel/homestead'
    config.vm.box_version = settings['version'] ||= '>= 8.0.0'
    config.vm.hostname = settings['hostname'] ||= 'homestead'
    ...

    # Add Custom Ports From Configuration
    if settings.has_key?('ports')
      settings['ports'].each do |port|
        config.vm.network 'forwarded_port', guest: port['guest'], host: port['host'], protocol: port['protocol'], auto_correct: true
      end
    end
    ...

    # Copy User Files Over to VM
    if settings.include? 'copy'
      settings['copy'].each do |file|
        config.vm.provision 'file' do |f|
          f.source = File.expand_path(file['from'])
          f.destination = file['to'].chomp('/') + '/' + file['from'].split('/').last
        end
      end
    end

    # Configure The Public Key For SSH Access
    if settings.include? 'authorize'
      if File.exist? File.expand_path(settings['authorize'])
        config.vm.provision 'shell' do |s|
          s.inline = "echo $1 | grep -xq \"$1\" /home/vagrant/.ssh/authorized_keys || echo \"\n$1\" | tee -a /home/vagrant/.ssh/authorized_keys"
          s.args = [File.read(File.expand_path(settings['authorize']))]
        end
      end
    end
    ...

3. Vagrant基本命令

3.1. box环境命令

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
// box查看
$ vagrant box list
laravel/homestead (virtualbox, 8.0.0)
// 版本查看
$ vagrant version
Installed Version: 2.2.5
Latest Version: 2.2.5

You're running an up-to-date version of Vagrant!
// 运行状态查看
$ vagrant status
// 当前机器vagrant环境查看,可以基于`vagrant global-status --prune`清除过期的vagrant环境
$ vagrant global-status
id       name        provider   state   directory
----------------------------------------------------------------------------
5557cd8  homestead-7 virtualbox saved   /Users/Terry/Homestead
c570011  homestead   virtualbox running /Users/Terry/Homestead

3.2. box配置初始化

1
2
3
4
// 初始化一个vagrant环境
$ vagrant init
// 配置检测
$ vagrant validate

3.3. box启动&更新

  • up 启动和提供一个vagrant环境
  • provision 动态配置,针对正在运行vagrant机器(可指定的provider),运行指定的配置
  • reload 重启vagrant机器,加载新的Vagrantfile配置
  • halt 停止vagrant机器

3.4. 进入vagrant

1
2
3
4
// 在Homestead目录下
$ vagrant ssh
// 或者基于ssh指定ip(通常默认指定为192.168.10.10,用户为vagrant,支持sudo)
$ ssh vagrant@192.168.10.10

3.5. box杂项

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
// 环境保存与恢复
$ vagrant suspend
$ vagrant resume
// 端口转发
$ vagrant port
    22 (guest) => 2222 (host)
 27017 (guest) => 27017 (host)
  3306 (guest) => 33060 (host)
  4040 (guest) => 4040 (host)
   443 (guest) => 44300 (host)
  5432 (guest) => 54320 (host)
    80 (guest) => 8000 (host)
  8025 (guest) => 8025 (host)
  9600 (guest) => 9600 (host)

4. 总结

Vagrant是一个开发环境标准化的好工具,有利于研发团队的开发环境一致,但相比Docker它需要依托于VirtualBox类似的Provider,会引起一定的资源开销(相比于Docker等工具)。

Homestead是一个Vagrant针对PHP的Laravel指定的Box配置库,主要用于PHP的Laravel开发为主,同时也方便提供研发和运维部署和测试。同时Homestead支持很多流行的Web开发工具,诸如搜索、时序数据库、消息队列等,可以让研发专注于开发,而无需过渡关注开发的依赖环境。

对Homestead的配置脚本的了解,可以适当性的做一些调整,比如过滤一些不必要的检测,这样可以加速privoder脚本的初始化。