cross platform

摆脱 Windows

EXM?虚拟机也能跨平台???

前几章教程中,我们介绍了在各个操作系统中搭建属于自己的开发环境,基本上可以满足很多初学者的使用要求。但是,如果你有两种办公环境:在公司用 Windows,在家里使用 Mac 或是 Linux,难道需要搭建两套或是多套环境吗?No!

或者,你手里只有 Windows 系统,而你在使用 PHP 开发某种对环境有特殊需求的功能(比如队列,Socket 或是 Workman)他们很难在 Windows 系统中安装,甚至根本不支持 Windows 系统。需要额外开一个 Linux 虚拟机,但是呢,我每次更新了代码难道都要再把代码复制到虚拟机里吗?显然不是很方便。(即使你可以使用自动化 FTP 上传等工具)

由此,HashiCorp 开发出了 Vagrant,来帮我们解决我们所遇到的困难,我们可以通过 Vagrant 封装一个 Linux 的开发环境,分发给团队成员。成员可以在自己喜欢的桌面系统(Mac/Windows/Linux)上开发程序,代码却能统一在封装好的环境里运行,非常霸气。下面我就为你详细介绍如何安装 Vagrant 并搭建好 PHP 开发环境!

install Vagrant

安装 Vagrant

一步一步跟我做

安装 VirtualBox

由于 Vagrant 是依赖于虚拟机的管理软件,所以在安装 Vagrant 之前,我们需要有一个可以运行的虚拟机软件。之所以推荐 VirtualBox,是因为它是免费的。当然你也可以选择收费的 VMware,那么它对应的 Vagrant 也是收费的。

VirtualBox 下载地址: https://www.virtualbox.org/wiki/Downloads

安装 Vagrant

安装完成 VirtualBox 后,就该安装 Vagrant 啦,下载地址: https://www.vagrantup.com/d... 选择好和您操作系统相同的版本,按照提示下一步下一步的安装,很简单。

选择一个合适的 box

在 Vagrant 中,所有的虚拟环境都被称之为 box,因为 Vagrant 已经为我们预备好了很多环境,然后被打包成一个包,我们下载之后就可以使用。 官方的包列表在这里:https://app.vagrantup.com/boxes 由于我们需要一个 Linux 的开发环境,所以我在这里选用 centos/7 这个环境作为演示。

Vagrant 的 Box 列表

导入(下载) box

挑选好需要的 Box 后,就可以开始初始化我们的环境了。正常的安装过程是这样的:


$ cd ~/dev  # 切换目录
$ vagrant init centos/7  # 用 centos/7 进行 box 初始化
$ vagrant up  # 启动虚拟环境
        

以上命令会前往 Vagrant 官网下载对应的 centos/7 的 box,保存到本地并初始化它。

但是,考虑到我国网络环境,除非你有特殊工具,否则裸连的话可以让你等到地老天荒...

所以,一般我们都会提前下载好安装包,然后使用以下命令自动导入至 Vagrant,之后就可以正常的初始化啦。如何获取 box 的下载链接呢?有一个小技巧,运行 vagrant init centos/7vagrant init 后,可以看到一个下载链接,如下图:

Vagrant 的 Box 下载链接

图中箭头标注的就是 下载地址 啦,你可以复制下来,利用迅雷等下载工具下载,亲测速度会有很大的提升。下载完成后,你可以使用如下命令让 vagrant 安装你指定的本地 box。


$ vagrant box add centos/7 ./dev/virtualbox/centos7.box # 第二个参数指定 box 文件的所在目录
$ vagrant init centos/7 # 用 centos/7 进行 box 初始化
$ vagrant up # 启动虚拟环境
        

如果你的操作正确,你会得到以下安装成功的输出:


# 省略部分输出
==> default: Successfully added box 'centos/7' (v1710.01) for 'virtualbox'!
==> default: Importing base box 'centos/7'...
==> default: Matching MAC address for NAT networking...
==> default: Checking if box 'centos/7' is up to date...
==> default: Setting the name of the VM: vagranrtboxtest_default_1513662757362_33324
==> default: Fixed port collision for 22 => 2222. Now on port 2200.
# 省略部分输出
==> default: Machine booted and ready!
==> default: Checking for guest additions in VM...
    default: No guest additions were detected on the base box for this VM! Guest
    default: additions are required for forwarded ports, shared folders, host only
    default: networking, and more. If SSH fails on this machine, please install
    default: the guest additions and repackage the box to continue.
    default:
    default: This is not an error message; everything may continue to work properly,
    default: in which case you may ignore this message.
==> default: Rsyncing folder: /cygdrive/f/www/vagranrtboxtest/ => /vagrant
		

你可以看到最后一行,是 vagrant 的实时同步目录:默认是我的安装目录指向虚拟机中根目录下的 vagrant 目录。那么也就意味着,我在 Windows 下的 vagranrtboxtest 目录中的任何文件只要发生 增删改查,都会实时同步到虚拟机中,我们只需要在虚拟机中安装好 LNMP 环境后(可以参考这节课: Linux 下搭建 LNMP 开发环境 ),就可以把本地的开发环境平滑升级为虚拟机的开发环境。然而我们需要做的就只有把 host 指向虚拟机,就是这么简单!

下面,我将介绍如何自定义同步目录,指定代码目录到虚拟机下 Nginx 的 www 目录。

config Vagrant

配置 Vagrant

如何让虚拟机像本地开发环境一样运行

Vagrant 初始化成功后,会在初始化的目录里生成一个 Vagrantfile 的配置文件,可以修改配置文件进行个性化的定制。

配置 IP 地址

Vagrant 默认是使用端口映射方式将虚拟机的端口映射本地从而实现类似 http://localhost:80 这种访问方式,这种方式比较麻烦,新开和修改端口的时候都得编辑。相比较而言, host-only 模式显得方便多了。打开 Vagrantfile,将下面这行的注释去掉(移除 #)并保存:


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

其中ip 就是这台虚拟机的 IP 地址,你可以改为任何本地地址(格式为 192.168.*.*), private_network 表示这台虚拟机与宿主机之间的连接方式。

修改完完成重启虚拟机,这样我们就能用 192.168.33.10 访问这台机器了,你可以把 IP 改成其他地址,只要不产生冲突就行。

配置同步目录

上节说到,Vagrant 默认的同步目录是当前的安装目录和虚拟机根目录下的 vagrant 目录。但我们想要自定义同步目录就需要改一下配置文件了,同样打开 Vagrantfile,找到:


# config.vm.synced_folder "../data", "/vagrant_data"
		

改为你想要同步的文件夹即可,如果你用的是 Windows 系统,需要注意目录的表达方式 / 和 \ 不太一样。比如我想把本地的 www 目录同步到 Vagrant 的 /data/wwwroot 下面,就需要改成这样:


# 以 Windows 系统为例
config.vm.synced_folder "F:\www", "/data/wwwroot"
# 以 UNIX 系统为例
config.vm.synced_folder "~/data/www", "/data/wwwroot"
		

改好之后,运行 vagrant reload 重启虚拟机就生效啦!

常见命令
命令 作用
vagrant box add 添加box的操作
vagrant init 初始化box的操作,会生成vagrant的配置文件Vagrantfile
vagrant up 启动本地环境
vagrant ssh 通过 ssh 登录本地环境所在虚拟机
vagrant halt 关闭本地环境
vagrant suspend 暂停本地环境
vagrant resume 恢复本地环境
vagrant reload 修改了 Vagrantfile 后,使之生效(相当于先 halt,再 up)
vagrant destroy 彻底移除本地环境
vagrant box list 显示当前已经添加的box列表
vagrant box remove 删除相应的box
vagrant package 打包命令,可以把当前的运行的虚拟机环境进行打包
vagrant plugin 用于安装卸载插件
vagrant status 获取当前虚拟机的状态
vagrant global-status 显示当前用户Vagrant的所有环境状态
use homestead

Laravel Homestead

什么?上面那些操作你都觉得麻烦?我再推荐一个更简单的!

Laravel Homestead 是一个官方预封装的 Vagrant Box,它为你提供了一个完美的开发环境,你无需在本地安装 PHP 、web 服务器或任何服务软件。 也就是说,安装好 Laravel Homestead 这个 box 后,你不必在手动搭建 LNMP 环境,直接可以上手写代码啦!

虽然这个 box 是专门给 Laravel 框架使用的,但是我们依然可以搭建任何框架的运行环境,如果你是初学者,装好这个再合适不过了,因为你不再需要装任何 PHP 扩展,缓存等一系列服务。

安装 Homestead Box

当安装完 VirtualBox/VMware 以及 Vagrant 后,你可以在终端使用下面的命令将 laravel/homestead Box 添加到 Vagrant 中安装:


vagrant box add laravel/homestead
        

如果上面的命令下载速度非常慢,你可以参考上面装 centos/7 所说的本地安装方法安装。

安装 Homestead

你可以简单使用 Git 克隆代码库来安装 Homestead,挑一个你喜欢的目录,在这里克隆 Homestead 代码:


git clone https://github.com/laravel/homestead.git Homestead
        

这样 clone 出来的 master 分支的代码不是很稳定,所以我们一般都会切到打过标签的稳定版本,你可以 在这里 查看目前发布的最新版本是什么,我们以 v7.0.1 为例:


cd Homestead
// Clone the desired release...
git checkout v7.0.1
        

克隆 Homestead 代码库后,从 Homestead 目录中运行 bash init.sh(Mac / Linux 系统) init.bat(Windows 系统) 命令来创建 Homesstead.yaml 配置文件。 Homesstead.yaml 文件会被放置在你的 Homestead 目录中:


// Mac / Linux...
bash init.sh

// Windows...
init.bat
        
配置 Homestead

Homestead 的配置文件就在安装目录下的 Homestead.yaml, 打开看看,是不是比直接看 Vagrantfile简单多?下面我就来简单介绍下 Homestead 的配置:

配置提供器

由于我们使用的是 VirtualBox 来提供虚拟机服务,所以在配置文件的 provider 中切换为 virtualbox,当然你如果安装了其他的虚拟机服务软件,可以在 vmware_fusionvmware_workstationparallels 之间选择。


provider: virtualbox
        
配置共享文件夹

Homestead.yaml 文件的 folders 属性里列出所有与 Homestead 环境共享的文件夹。这些文件夹中的文件若有变更,它们会保持本地机器与 Homestead 环境之间同步。你可以根据需要配置多个共享文件夹:


folders:
    - map: ~/Code
      to: /home/vagrant/Code
        
配置 Nginx 站点

对 Nginx 不熟悉吗?没关系。 sites 属性可以帮助你可以轻松地将 域名 映射到 homestead 环境中的文件夹。 Homestead.yaml 文件中已包含示例站点配置。同样的,你也可以增加多个站点到你的 Homestead 环境中。 Homestead 可以同时为多个 PHP 应用提供虚拟化环境:


sites:
    - map: master.app
      to: /home/vagrant/Code/master/public
   	- map: test.app
      to: /home/vagrant/Code/test
        

如果你在配置 Homestead Box 之后更改了 sites 属性,那么应该重新运行 vagrant reload --provision 来更新虚拟机上的 Nginx 配置。

将域名指向虚拟机

你必须将在 Nginx 站点中所添加的「域名」也添加到你机器的 hosts 上。 hosts 文件会将 Homestead 站点的请求重定向到 Homestead Box 中。在 Mac 或 Linux 上,该文件位于 /etc/hosts。在 Windows 上,它位于 C:\Windows\System32\drivers\etc\hosts。添加的内容如下所示:


192.168.10.10  master.app
192.168.10.10  test.app
        

这里的 IP 就是你在 Homestead.yaml 文件中配置的 IP 地址。配置完成后启动虚拟机,就可以通过 master.app 来访问你的虚拟机了!

登录虚拟机

当虚拟机一切就绪后,我们就可以使用 vagrant ssh 进入虚拟机环境中了,他会自动帮我们使用 public key 以 vagrant 身份登入。

成功登入 Homestead

端口

默认情况下,以下端口会被转发至 Homestead 环境:

命令 作用
SSH: 2222 发送到 22
HTTP: 8000 发送到 80
HTTPS: 44300 发送到 443
MySQL: 33060 发送到 3306
Postgres: 54320 发送到 5432
Mailhog: 8025 发送到 8025
多个 PHP 版本

从 Homestead 6 开始,开始支持在同一个虚拟机上引入多个版本的 PHP。你可以在 Homestead.yaml 文件中为给定站点指定使用哪个版本的 PHP。 可用的 PHP 版本有:「5.6」、「7.0」、「7.1」


sites:
    - map: homestead.app
      to: /home/vagrant/Code/Laravel/public
      php: "5.6"
        

此外,你还可以通过 CLI 使用任何受支持的 PHP 版本:


$ php5.6 -v
$ php7.0 -v
$ php7.1 -v
        

以上就是 Homestead 的全部安装过程和配置方法啦,感觉对您有用的话,就在下面为我点个赞吧~

请登录

WOWPHP 账号登录 GitHub 账号登录

还没有账号?现在去注册一个~