微軟的 wsl2 隨著 Windows10 20H1 版本一同釋出了,跟 wsl1 相比,wsl2 擁有了完整的 Linux 核心。基於 wsl2 執行的 Docker 可以得到原生 Linux 下的體驗。
我有一個基於 Dcat Admin 開發的管理後臺,將開發環境遷移到 Laravel Sail( Docker ) 後,開啟頁面的速度快了很多倍,再也沒有之前的卡頓感了(相信用過 Homestead 開發專案的小夥伴深有體會)。因虛擬機器與宿主機之間羸弱的跨 OS 檔案效能,導致 Homestead 中執行的專案在宿主機瀏覽器開啟時,給人的感覺總是很卡。而且每次啟動 Homestead 耗時也很長,每次 coding 前,光開啟 Homestead 這個「重量級」開發環境,就讓人頭疼。然而使用 Laravel Sail 後,幾秒鐘就能啟動 Docker 容器,馬上就能投入開發。即使是在膝上型電腦上,Laravel Sail 也顯得特別輕量,風扇不再像之前那樣狂轉了。是時候將我們的開發環境由「卡慢」的 Homestead 遷移到Docker下了。
注意:擺脫卡頓感的前提是專案程式碼放在linux子系統中,而不是放在宿主機上。IDE或編輯器通過網路位置來開啟專案,後面我會介紹。教程《搭建 Laravel Sail 開發環境 - Windows》中將專案程式碼放在
/mnt/c/code
或/mnt/d/code
這樣的宿主機目錄中,我認為是不恰當的,因為wsl2是執行在虛擬機器中的,所以 wsl2 跨 OS 檔案系統的效能同樣很差。將程式碼放到宿主機目錄,你的專案執行速度跟 Homestead 中執行一樣卡。
雖然Laravel China 釋出的《搭建 Laravel Sail 開發環境 - Windows》中介紹了基於 Laravel Sail 的開發環境搭建,但教程是基於建立一個新專案的實踐來進行。該教程是通過執行以下指令碼來構建新專案的:
curl -s https://laravel.build/example-app | bash
但是執行該命令由於要預先構建一個「先導映象」,再加上國內的網路問題,導致非常耗時而且非常容易安裝失敗。所以我自己在實踐中總結出了一條可行的方法,現在分享給大家。
基礎環境要求主要有以下幾點:
- windows 作業系統版本要達到要求
- 開啟 Hyperf-v 和 wsl2
- 安裝實用工具 Windows Terminal 和 Visual Studio Code
- 安裝 Ubuntu 子系統
- 安裝 Docker Desktop 並讓 Docker Desktop 基於 wsl2 來執行
基礎環境準備可以完全參照《搭建 Laravel Sail 開發環境 - Windows》來進行,我跟教程作者不同的是「六、建立測試專案 」及後面的部分,前面的部分都可以參照教程來進行。基礎環境準備方面我們就簡單的走一遍流程。windows作業系統版本
執行winver
命令檢視 Windows 版本,你的 Windows 版本不能低於 20H2 版本。
如果你的作業系統版本較低,可以使用 Windows 更新或者「微軟易升」來升級你的作業系統。而且我測試過了 Windows10 家庭版也可以滿足環境要求,不需要花錢升級到專業版。
啟用hyperf-v和wsl2
點選win10左下角的搜尋按鈕,輸入「功能」,開啟「 windows 功能」介面:
開啟以下功能:「適用於 Linux 的 Windows 子系統」、「虛擬機器平臺」、「Hyperf-v」(可選,當個虛擬機器軟體用)三項功能。Windows 家庭版沒有「Hyperf-v」,不需要開啟,不影響開發環境的搭建。等待電腦重啟後,就安裝好了。
安裝實用工具
- Windows 應用商店搜尋安裝 Windows Terminal;
- 安裝Visual Studio Code。
這裡就不再贅述
安裝 Ubuntu 子系統
Windows 應用商店搜尋 Ubuntu,選擇安裝 Ubuntu 或者 Ubuntu 20.04LTS,兩者二選一即可:
點選開始選單 Ubuntu 圖示,啟動 Ubuntu,按照提示設定使用者名稱、密碼,同時請記住自己設定的使用者名稱和密碼。啟動中如果遇到問題,請使用搜尋引擎搜尋,一般都有解決方案。
附: 使用 WSL2 出現“參考的物件型別不支援嘗試的操作”解決辦法:
- 下載此軟體:NoLsp;
如果無法訪問,使用百度網盤下載:
網盤地址:pan.baidu.com/share/init?surl=bVZ0...
提取碼:vjge
- 管理員身份執行 CMD,cd 到
NoLsp.exe
存放的目錄,然後執行命令:解決方法出處: 關於使用WSL2出現“參考的物件型別不支援嘗試的操作”的解決方法NoLsp.exe C:\windows\system32\wsl.exe
開啟 Windows Terminal( shell 工具選擇 Powershell),將 wsl2 設為預設的 Linux 子系統環境:
wsl --set-default-version 2
執行以下命令,檢視相關應用執行的 wsl 版本:
wsl --list --verbose
執行結果如下:
請確保你的 Ubuntu-20.04 是執行的 wsl 版本為 2,如果你的版本為1,請執行以下命令切換:
wsl --set-version Ubuntu-20.04 2
安裝 Docker Desktop
到 Docker 官網下載安裝 Docker Desktop,安裝完成後,開啟 Docker,開啟 WSL2 :
與 Ubuntu 進行整合:
如果沒看到Ubuntu選項,檢視部落格文章《搭建 Laravel Sail 開發環境 - Windows,docker選項設定 沒有 ‘ubuntu’選項》來解決。
接下來配置 Docker Hub 映象加速,按下圖開啟 Docker Desktop 配置介面:
將映象加速的配置貼上到相應位置:
"registry-mirrors": [
"https://mirror.baidubce.com",
"https://hub-mirror.c.163.com",
"https://docker.mirrors.ustc.edu.cn"
],
如果需要阿里雲的映象加速地址,需要自己去註冊一個阿里雲賬號,每個人的加速地址都不一樣。
登入阿里雲後點選控制檯,按照下圖指示找到映象加速地址:
至此,基礎的軟體工具都安裝配置好了,後面部分跟《搭建 Laravel Sail 開發環境 - Windows》有所不同。
在使用 Laravel Sail 前,我們需要先通過 Composer 來安裝它,所以需要基礎的 PHP 執行環境。
在 Windows Terminal 中啟動 Ubuntu
Ubuntu 更換國內源加速
備份原來的源:
sudo cp /etc/apt/sources.list sources.list.bak
使用 vim 編輯 sources.list
檔案,替換為以下內容:
deb http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
新增PPA源
sudo sh -c "echo 'deb https://launchpad.proxy.ustclug.org/ondrej/php/ubuntu focal main' > /etc/apt/sources.list.d/ppa_ondrej_php.list"
更新資源列表
sudo apt update
然後會產生以下錯誤:
W: GPG error: launchpad.proxy.ustclug.org/ondrej... focal InRelease: The following signatures couldn’t be verified because the public key is not available: NO_PUBKEY 4F4EA0AAE5267A6C
E: The repository ‘launchpad.proxy.ustclug.org/ondrej... focal InRelease’ is not signed.
N: Updating from such a repository can’t be done securely, and is therefore disabled by default.
N: See apt-secure(8) manpage for repository creation and user configuration details.
執行以下命令匯入你的公鑰即可( 4F4E...7A6C
這一串公鑰要換成你自己螢幕上輸出的那個):
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 4F4EA0AAE5267A6C
設定成功後,重新更新資源列表:
sudo apt update
安裝php8.0
sudo apt install -y php8.0-cli php8.0-dev php8.0-pgsql php8.0-sqlite3 php8.0-gd php8.0-curl php8.0-memcached php8.0-imap php8.0-mysql php8.0-mbstring php8.0-xml php8.0-zip php8.0-bcmath php8.0-soap php8.0-intl php8.0-readline php8.0-msgpack php8.0-igbinary php8.0-ldap php8.0-redis
安裝php7.4
sudo apt install -y php7.4-cli php7.4-dev php7.4-pgsql php7.4-sqlite3 php7.4-gd php7.4-curl php7.4-memcached php7.4-imap php7.4-mysql php7.4-mbstring php7.4-xml php7.4-zip php7.4-bcmath php7.4-soap php7.4-intl php7.4-readline php7.4-pcov php7.4-msgpack php7.4-igbinary php7.4-ldap php7.4-redis
需要其他版本的PHP請自行安裝。
你會發現我們並沒有安裝 php-fpm ,因為我們要使用 Docker 來構建開發環境,現在的 PHP 環境只要能夠在 CLI 執行環境下執行 Composer 就夠了。當然,由於 WSL2 中的 Ubuntu 擁有完整的核心,你可以直接在 Ubuntu 子系統中安裝 Nginx , php-fpm, Mysql, Redis等,包括 swoole 擴充套件, 可以直接基於 Ubuntu 子系統來構建開發環境。這裡我們就不再贅述。
切換PHP版本
由於很多擴充套件目前還不支援 PHP8.0,所以我們也同時安裝了 PHP7.4 版本。很多時候我們需要切換不同版本的 PHP,通過以下命令來切換 PHP 版本:
- 切換 cli 執行模式下預設的 PHP 版本
輸入對應PHP版本的數字,完成切換:sudo update-alternatives --config php
切換 phpize 版本:
sudo update-alternatives --config phpize
切換 php-config 版本
sudo update-alternatives --config php-config
確認現在的PHP版本:
php -v
安裝 Composer
複製以下命令貼上到 Ubuntu 子系統中執行,以安裝 composer ,並將 composer 映象配置為阿里雲映象:
sudo sh -c "curl -so /usr/bin/composer https://mirrors.aliyun.com/composer/composer.phar && chmod a+x /usr/bin/composer" \
&& composer --version \
&& composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ \
&& composer config -g -l | grep repositories.packagist.org.url
如果控制視窗顯示出了 Composer 版本和映象源地址,說明安裝成功了:
至此,我們的PHP基礎環境就安裝好了。
建立專案目錄
進入你的 Ubuntu 子系統的家目錄:
cd ~
注意: 這裡是進入 Ubuntu 子系統的家目錄,而不是Windows10的。
建立一個 projects
目錄,用於存放專案程式碼:
mkdir projects
用 VS Code 開啟家目錄:
code .
這裡要注意,由於 WSL2 跨OS的檔案效能很差,會導致專案執行速度很慢,所以我們的專案目錄是存放在 Ubuntu 子系統中的家目錄, 而不是 windows10 的家目錄。後面呼叫
code .
命令是為了用 VS Code 開啟我們的projects
目錄,以獲取projects
目錄的網路位置路徑,方便我們使用諸如phpStorm這樣的IDE開啟專案。
在 VS Code 介面,右鍵projects
目錄,選擇Reveal in Explorer
,也就是在 Windows檔案管理器
中開啟目錄:
在windows資源管理器
中,右鍵projects
目錄,選擇固定到快速訪問
和傳送到 -> 桌面快捷方式
,便於以後開啟專案目錄。
所以,即使我們的專案存放在 Ubuntu 子系統中,專案目錄也是可以通過網路位置訪問的,我第一次按照社群官方教程搭建 Laravel Sail 開發環境時,也是將專案存放在
/mnt/c/code
目錄下,這就產生了跨OS的檔案系統效能問題,專案的執行速度並沒有令我滿意。我也是在無意間在 Windows Terminal 中使用code
命令開啟 Ubuntu 子系統中的家目錄時,才發現了可以通過網路位置開啟專案目錄。
將專案存放目錄新增到 Windows Denfender 的白名單中
接下來,為了防止 Windows Defender 因安全原因,可能會阻止 IDE 掃描專案目錄,所以我們將 projects
目錄加入 Windows Defender 的白名單中。
在Windows資源管理器
中開啟projects
目錄,複製projects
目錄的路徑:
開啟Windows 安全中心
, 按下圖所示,開啟病毒和威脅防護設定介面:
點選“新增或刪除排除項”,點選“新增排除項”按鈕,選擇“資料夾”,將剛剛複製的projects
目錄的路徑新增到排除項中,同時,也可以將你的IDE程式也新增到排除項中(點選“新增排除項”按鈕,選擇“程式”):
拉取專案原始碼
回到 Windows Terminal 介面,進入專案存放目錄:
cd /home/myhui/projects
假設我們現在有一個專案,叫做 kkyn_dcat_admin,拉取你的專案原始碼(或者建立新的專案):
git clone git@gitee.com:kkyn_dcat_admin.git
這裡說明一下,如果你使用ssh協議拉取專案原始碼,由於 Ubuntu 子系統跟 Windows10 宿主系統是隔離的,所以你需要將 windows 10 的 SSH Key 拷貝到 Ubuntu 子系統中(注意不要完全複製貼上,
ASUS
和myhui
要改成你自己的。):cp /mnt/c/Users/ASUS/.ssh/id_rsa* /home/myhui/.ssh/
如果你還沒有SSH KEY,可以用
Git Bash
重新生成 SSH Key,並將生成的公鑰新增你的github或者gieee信任列表中。生成SSH Key使用命令,郵箱換成你自己的郵件地址:ssh-keygen -t rsa -C "your_email@example.com
具體步驟 不再贅述。
安裝Laravel Sail
使用 IDE 或者編輯器開啟專案:
編輯composer.json
檔案,新增"laravel/sail": "^1.5"
開發依賴:
回到 Windows Terminal 介面, 開啟 Ubuntu 選項卡,進入你的專案目錄:
cd ~/projects/kkyn_dcat_admin
釋出.env
檔案
cp .env.example .env
用IDE編輯.env檔案,配置你的mysql、redis選項:
# mysql
DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=kkyn
DB_USERNAME=root
DB_PASSWORD=password
# redis
REDIS_HOST=redis
REDIS_PASSWORD=null
REDIS_PORT=6379
REDIS_CLIENT=phpredis
執行命令安裝依賴:
composer install
注意:我們安裝在 Ubuntu 子系統中的php環境主要用來安裝依賴,如果你不想使用Docker來做開發環境,請自行在 Ubuntu 子系統中安裝諸如mysql、redis等的其他軟體。
釋出 Dockerfile 以便定製
由於國內的網路問題,我們需要對 Dockerfile 進行定製,以獲得更快的構建速度。執行下面的命令,釋出 Dockerfile 檔案
php artisan sail:publish
命令執行完成後,你可以看到專案目錄中,多了一個docker
目錄。
定製 Dockerfile
用 IDE 或編輯器開啟 kkyn_dcat_admin/docker/7.4/Dockerfile
檔案, 按照以下步驟進行定製。
在
kkyn_dcat_admin/docker/7.4
目錄下,建立一個sources.list
檔案,將以下內容貼上進去:deb http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
配置 Ubuntu 國內映象
回到Dockerfile檔案,在RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
這句程式碼後面,加入以下程式碼:ADD sources.list /etc/apt/
Ubuntu PPA 加速
在Dockerfile
檔案中,搜尋:
http://ppa.launchpad.net
將其替換為:
https://launchpad.proxy.ustclug.org
- 安裝Composer
在Dockerfile
檔案中,搜尋下面這行程式碼:
將其替換為以下程式碼:&& php -r "readfile('http://getcomposer.org/installer');" | php -- --install-dir=/usr/bin/ --filename=composer \
&& curl -so /usr/bin/composer https://mirrors.aliyun.com/composer/composer.phar \ && chmod a+x /usr/bin/composer \ && composer --version \ && composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ \
釋出docker-compose.yml
檔案
php artisan sail:install --with=mysql,redis
with選項可選的值有 mysql, pgsql, mariadb, redis, memcached, meilisearch, mailhog, selenium。自己根據情況選擇。如果執行php artisan sail:install
命令不帶--with
選項,會出現一個選擇框,選擇需要一同參與編排的映象列表。
定製docker-compose.yml
檔案
其他可定製項包括應用的埠、MySQL的埠等等,根據自己的需求定製。不熟悉 Docker 的朋友請自行學習。
構建映象並啟動容器
使用Windows Terminal,開啟 Ubuntu 標籤頁,通過 Ubuntu 進入你的專案目錄~/projects/kkyn_dcat_admin
,執行以下命令:
./vendor/bin/sail up
看到以下介面,說明已經啟動成功了
通過 Docker Desktop 介面可以看到容器的執行情況:
生成KEY:
./vendor/bin/sail artisan key:generate
執行資料遷移:
./vendor/bin/sail artisan migrate
注: 如果以上命令不生效,可以進入容器裡面執行命令
進入容器:docker exec -it kkyn_dcat_admin_kkadmin.test_1 /bin/bash
執行命令:
php artisan key:generate
php artisan migrate
如果你不知道自己的容器名叫什麼,可以執行以下命令檢視:
docker ps -a
見下圖,複製
NAMES
下對應的容器名,當然,建議你花 1 個小時學一下 Docker:
編輯 hosts 檔案,配置開發用的域名:
127.0.0.1 example.test
至此,整個Laravel Sail環境就搭建完成了,瀏覽器訪問example.test:
由於這種搭建方式不存在跨OS的檔案效能問題,所以執行速度比 Homestead 快多了。
開啟 Phpstorm,選擇 File
-> Settings
-> PHP
注:我這是最新版的 PhpStorm ,老版本的 PhpStorm 位置略有不同。
配置所依賴的 PHP 版本
配置 PHP CLI 介面
由於 Ubuntu 子系統有自己的許可權系統,很多時候與宿主機互動會遇到很多檔案許可權問題,所以建議將你的projects
目錄許可權改為777
:
sudo chmod -R 777 ~/projects/
到這裡我們的教程就結束了,有不完善的地方或者錯誤,歡迎大家指出,我也會在後續的實踐中不斷改進教程。
本作品採用《CC 協議》,轉載必須註明作者和本文連結