目次
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 有什麼差別呢?
首先,先來看這張比較圖
從上面的圖解可以發現 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,目前總共支援:
- VirtualBox
開源且免費,Vagrant將其作為預設的 Provider
是我們這次會使用的軟體 - Hyper-V
- 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
須安裝工具
- VirtualBox(或是其他虛擬機器,例如: VMWare、Hyper-V)
- Vagrant
- laravel/homestead box(Vagrant Boxes)
- 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
其實一開始調查時,在不清楚 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 專案
其實在這邊我就沒有很理解,官方幫我們寫好 Vagrant File 很合理
但為什麼還有其他附加的檔案呢?
分兩次下載其他的檔案有什麼意義嗎?
而且說真的,我不去下載,初始化 box 一樣可以連進 Homestead
只是少了網路配置等等的,有點麻煩要自己寫
雖然看了源碼,但我仍然不明白,只見一堆 shell script
這就是所謂的知識文盲吧
文盲歸文盲,還是繼續按照文件繼續走下去
下載我們的 Homestead library
- 移至根目錄
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
- 修改 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 上成功測試檔案呢?
單元測試
由於我在檔案裡就有簡單的寫了一個測試腳本
那我們就連進主機試試看吧
- 切換至
~/Homestead
目錄:要在這個目錄啟動 VM 才找得到 Vagrant File - 啟動 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。
- 修改檔案中
.env
config/database.php
的資料庫帳密 - 切換至
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
若之後有機會再來試試看吧
拍個手讓我知道,這個文章對你們有幫助 ♥(´∀` )人