Laravel Homestead 簡介與入門

Kion
14 min readJun 30, 2020

--

http://codingfix.com/laravel-setup-homstead/

目次

1. Laravel Homestead 簡介
2. Virtual Machine & Docker
3. Vagrant
4. 實作與配置 Homestead
5. 運行程式與連接資料庫

Laravel Homestead 簡介

先前,我建立了一個簡單的 PHP 專案,並把實作的過程記錄了下來

同時,我也將程式碼開源在 這裏

在 README.md 中,我有一塊是 條件需求
寫這塊的目的是讓下載專案的人,逐一檢查自己是否有具備所需的環境
像是:PHP、Laravel、MySQL….等

如果今天,電腦沒有 Laravel 所需的環境
一想到要花一堆時間配置環境,還可能遇到一堆 bug 就頭痛
有沒有方法可以讓我能在不安裝的情況下,又能運行程式呢?

有的!其中一個方法就是利用虛擬機器!

虛擬機器 Virtual Machine 與 Docker

虛擬機器是一種模擬作業環境讓程式運行的工具,可以把它看成一個虛擬的電腦
且不只可以新增一部,我們可以在電腦新增多部的虛擬機器,安裝不同的作業系統測試、運行程式
擁有可提供與實體硬體功能相同的虛擬裝置執行作業系統和應用程式

我們可以任意設定這台電腦的規格
但他並不代表開多少規格,他就會有相對應的效能
虛擬機器是由 主機實體資源 支援的
因此開出高於主機的效能,也無法達到相對應的效果

那我們熟知的 Docker 呢?他又是什麼?

Docker 不是 VM 他是容器 Container
那 Container 和 VM 有什麼差別呢?

首先,先來看這張比較圖

https://www.docker.com/what-docker

從上面的圖解可以發現 Container 和 VM 最大的不同就在於 Guest OS
好處就是每個應用程式都能擁有獨立甚至相互不同的作業系統、環境

但今天我可能換了一個作業環境,我就得下載另一個映像檔,建一個新的 VM
這聽起來可能還好
事實上 VM 的映像檔通常落在數 GB 至數十 GB 都有
而容器映像檔一般最大也才數百 MB
相較於 VM, Docker 更加輕量級

聽起來好像沒有人要使用 VM 了
但 VM 還是有它的價值在
Docker 用於模擬某個環境下程式執行的結果,但它沒有建立自己的作業系統,所以只能依賴 Host OS
但 VM 是模擬整台電腦的配置,以及作業系統

因此若只是想要運行某個資料庫或程式環境,不在乎作業系統等
就很適合使用 Docker

Vagrant

Vagrant 為管理和配置 VM 的 CLI 工具,與 GUI 介面的 VM 管理軟體相互搭配
Vagrant 支援的 VM 管理軟體被稱作 Providers,目前總共支援:

  1. VirtualBox
    開源且免費,Vagrant將其作為預設的 Provider
    是我們這次會使用的軟體
  2. Hyper-V
  3. VMware

他同時也支援 Docker

Vagrant 與 VM 的管理軟體相互搭配,就像是 MySQL 之於 MySQL Workbench 的關係
透過指令可以控制 VM 的啟動或是執行一些配置指令碼
比如安裝一些必備的開發工具或作業系統,像是:Mysql、centos/7、ubuntu…..etc
而這些軟體或作業系統的映像檔,就稱為 Vagrant Boxes
我們就可以透過共用同一個 Boxes 運行在同一個環境以供測試和開發

也就是說,當我要給他人測試我的程式碼時
我可以下指令

vagrant package

打包我當前的環境,給他人下載
他就可以用我的環境去開發或測試程式
Vagrant 也有提供更版功能,並且透過設定可以讓協作者簡單快速的檢查並更新版本
當然也不是每個 Boxes 都要自己打包,Vagrant 有一個 Vagrant Boxes 的市集,可以讓大家在上面搜尋下載

Vagrant Boxes 還有一個叫 Vagrant File 的設定檔,主要是告訴 Vagrant 要去套用哪個Box作為環境,也可以設定 VM 與主機間的檔案共享…等等
當我們執行 vagrant up 啟動虛擬機器時,Vagrant 便會依據 Vagrant File 中的指令來搭建 VM 的環境

了解 VM 和 Vagrant 後,我們就來開始實作 Lavravel Homestead 吧

實作與配置 Homestead

須安裝工具

  1. VirtualBox(或是其他虛擬機器,例如: VMWare、Hyper-V)
  2. Vagrant
  3. laravel/homestead box(Vagrant Boxes)
  4. Homestead(Vagrant files)

當然還有我們要運行的檔案
如果手邊沒有檔案可以試跑的話,可以拿我的檔案來使用

Vagrant

安裝 VirtualBox 完,我們就可以來安裝 Vagrant
下載、安裝完畢後,接著初始化 Vagrant

vagrant init

我們就可以透過 Vagrant 執行一些指令了
我也整理了一些常用指令如下:

  • 啟動 VM:vagrant up
  • 登入 VM:vagrant ssh
  • 登出 VM: logout
  • 暫停 VM:vagrant suspend
  • 將 VM 關機:vagrant halt
  • 查看 VM 狀態:vagrant status
  • 重啟 VM:vagrant reload --provision

Homestead

Vagrant Box

其實一開始調查時,在不清楚 Homestead 之前,我有點迷思
我一直以為 Homestead 就是某種框架
但其實不然
他是由官方提供的 Vagrant Box,整合了開發 Laravel 所需服務

  • Ubuntu 18.04
  • Git
  • PHP 7.4
  • PHP 7.3
  • PHP 7.2
  • PHP 7.1
  • PHP 7.0
  • PHP 5.6
  • Nginx
  • MySQL
  • lmm for MySQL or MariaDB database snapshots
  • Sqlite3
  • PostgreSQL
  • Composer
  • Node (With Yarn, Bower, Grunt, and Gulp)
  • Redis
  • Memcached
  • Beanstalkd
  • Mailhog
  • avahi
  • ngrok
  • Xdebug
  • XHProf / Tideways / XHGui
  • wp-cli

這些都是在開發 Laravel 中常用的軟體和環境!一應俱全

Homestead 的 Box 也很好找
在 Vagrant Cloud 市集就可以找到 Homestead
按照文檔,在終端機下指令

vagrant box add laravel/homestead

這個檔案超大的,要跑一段時間呢!

安裝好之後,我們就可以來啟動 VM 啦
但如果你下了 vagrant up 反而會出現錯誤

為什麼會有錯誤呢?
這是因為沒有 Vagrant File 的緣故,所以 Vagrant 不知道他要生成什麼樣環境的 VM
通常的解法是初始化 Boxes 生成 Vagrant File

vagrant init laravel/homestead

但今天我們不需要這樣,因為 Laravel 官方幫我們寫好了 Vagrant File
除了告訴 VM 指定環境外,還幫我們寫了許多細節涵蓋在內
讓我們的 Vagrant Box 能夠提供主機服務給 Laravel 專案

Homestead Library

其實在這邊我就沒有很理解,官方幫我們寫好 Vagrant File 很合理
但為什麼還有其他附加的檔案呢?
分兩次下載其他的檔案有什麼意義嗎?
而且說真的,我不去下載,初始化 box 一樣可以連進 Homestead
只是少了網路配置等等的,有點麻煩要自己寫
雖然看了源碼,但我仍然不明白,只見一堆 shell script
這就是所謂的知識文盲吧

文盲歸文盲,還是繼續按照文件繼續走下去
下載我們的 Homestead library

  1. 移至根目錄
cd ~/

2. Clone Homestead Repo

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

3. 切換資料夾

cd ~/Homestead

4. 檢查是否為最新版

git log --onelinegit checkout release

5. 初始化,來創建 Homestead.yaml 設定檔

bash init.sh

Homestead 為了方便大家修改、套用
有把虛擬機的硬體、網路、共享檔案等等的配置拉出來,放在 Homestead.yaml 配置檔
當我們執行 vagrant up,Homestead 的 Vagrant File 會去讀取它來做設定

現在就來配置 Homestead.yaml 吧!

Homestead.yaml

  1. 修改 ip:可以設定虛擬機拿到的 IP 位址,預設是 192.168.10.10,若沒有特別需求不用更改
ip: "192.168.10.10"

2. 設定虛擬機佔用的資源:預設是 1 CPU、2GB 的記憶體,若沒有特別需求不用更改

memory: 2048
cpus: 2

3. 定義 Provider:預設就是 VirtualBox

provider: virtualbox 

4. 綁定登入 VM的 SSH Key:預設會使用自己根目錄底下的金鑰

authorize: ~/.ssh/id_rsa.pubkeys:
- ~/.ssh/id_rsa

若沒有產過 SSH Key,指令下:

ssh-keygen -t rsa -C "(信箱)"

若想另產一個 Key 是專門給 VM 的也可以
只需確認設定檔有對應到相對應的檔名

5. 設定掛載的虛擬目錄:預設是將根目錄底下的 code 資料夾掛載到 VM vagrant 帳號根目錄底下的 code 資料夾
由於我們還沒有這個資料夾,請執行 mkdir ~/code 指令建立
然後把我們要運行的專案資料夾丟進 code 資料夾中

map:本機路徑
to:Vagrant 測試機路徑

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

6. 設定訪問路徑
Homestead 是使用 Nginx 做為網頁伺服器
這邊的設定是將 http://homestead.test 這個網址,對應到 /home/vagrant/code/php-practice/public 這個目錄

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

這樣我們的 Homestead.yaml 設定檔就完成了!

若你在執行 VM 之後,又有更動設定的話,記得要執行

vagrant reload --provision

這個指令會更新虛擬機器中的 Nginx 設定檔

/ect/hosts

接著我們要修改 hosts 檔案
每台電腦都有一個內部使用的 hosts 檔案,功能如同 DNS,只是它只能在本機上運作
我們要修改它來連接我們自訂的網址 http://homestead.test

sudo vim /etc/hosts

在最後一行加上

192.168.10.10   homestead.test

如此一來,當我們在本機瀏覽器上輸入 http://homestead.test
它就會連入 192.168.10.10 這個內部 IP,而這個 IP 指向的正是 Homestead 的 VM
VM 中的 Nginx 接到請求後,便執行對應的 sites 中的目錄中的 Laravel 程式,並回傳結果給瀏覽器
就可以在本機瀏覽器上看到在 VM 運作但存放於本機的 Laravel 程式的回應結果了!

運行程式與連接資料庫

由於範例檔有寫了幾個 API
那我們就來藉此確定,是不是能在 VM 上成功測試檔案呢?

單元測試

由於我在檔案裡就有簡單的寫了一個測試腳本
那我們就連進主機試試看吧

  1. 切換至 ~/Homestead 目錄:要在這個目錄啟動 VM 才找得到 Vagrant File
  2. 啟動 VM
vagrant up

3. 連進 VM

vagrant ssh

4. 查看目錄結構: 可以發現我們的 php-practice 居然不是在 code 內!

ls

5. 切換到 php-practice 資料夾

cd php-practice

6. 執行測試腳本

php artisan test

測試成功!!!!!

7. 登出 VM

logout

8. 關閉 VM

vagrant halt

輸入網址拿資料

第二種方式就是直接在網址列上輸入: http://homestead.test/api/user/
我們預期他會抓出所有的使用者資料

但,在虛擬機器上,我們的 MySQL 中還是一張白紙
沒有資料庫、沒有資料表和資料
因此我們得連進 VM 中的 MySQL 創建資料表

但特別要注意的是:
要連接 MySQL,必須得修改 MySQL 的帳密,不然驗證會不過
帳號密碼分別是 homestead / secret。

  1. 修改檔案中 .env config/database.php 的資料庫帳密
  2. 切換至 Homestead 資料夾
cd ~/Homestead

3. 連進 VM

vagrant up

4. 連進 Homestead

vagrant ssh

5. 登入 mysql

mysql -u homestead -p 

6. 輸入密碼:secret

7. 創建資料庫

CREATE DATABASE test CHARACTER SET utf8;

8. 離開 mysql

quit

9. 進入 php-pratice 資料夾

cd php-pratice

10. 建立資料表以及倒入假資料

php artisan migrate:refresh --seed

11. 在網址列輸入:http://homestead.test/api/user
成功抓取資料

12. 登出 VM

logout

13. 關閉 VM

vagrant halt

如此一來,我們就能確定程式可以順利運行,也會連接到資料庫了!
若不想在電腦上安裝環境
只須啟動 VM 裝上 Vagrant Box 和配置 Vagrant File
就能直接在 VM 上進行開發和測試
豈不美哉!

當然,Laravel 不只讓開發者在 VM 上開發更順利
也有支援 Docker 的叫 Laradock
若之後有機會再來試試看吧

拍個手讓我知道,這個文章對你們有幫助 ♥(´∀` )人

參考資料

  1. Laravel 開發環境使用 Homestead
  2. Laravel Homestead 官方文件
  3. Vagrant Documentation
  4. Laravel — Homestead
  5. Vagrant 介紹
  6. 什麼是Vagrant盒子
  7. 使用Vagrant練習環境佈署
  8. LARAVEL HOMESTEAD 新增站台

--

--

Kion

程式就是利用自動化與排程的特性解決問題 文章分類總覽: https://hackmd.io/@Kion/SyvyEks0L