PHP項(xiàng)目在Docker(WSL2)中運(yùn)行緩慢的解決方法
環(huán)境
Windows 11
Docker Desktop 4.17.1(開啟WSL2)
WSL2(Ubuntu-22.04)
前言
最近在使用Docker容器運(yùn)行PHP項(xiàng)目的時(shí)候,發(fā)現(xiàn)特別緩慢。例如一個(gè)干凈的 ThinkPHP 5.1 框架,訪問首頁都需要1秒以上,如果再加上數(shù)據(jù)庫查詢、復(fù)雜的業(yè)務(wù)邏輯等代碼的話,那速度可想而知。
我的開發(fā)模式是,在Windows上使用 IDE 開發(fā),代碼也是存儲在Windows系統(tǒng)上,然后docker通過掛載的方式,將代碼目錄掛載到容器里去運(yùn)行。
后面查資料得知,是因?yàn)镈ocker是跑在 WSL2 里的,雖說 WSL2 相比 WSL1 更先進(jìn),但在跨系統(tǒng)文件讀寫性能方面是比 WSL1 差的,因此,跑在 WSL2 里的docker想要跨系統(tǒng)訪問Windows系統(tǒng)上的代碼文件的話,性能是很差的。
解決方法
第一種方法
讓docker不要使用WSL2,改為使用WSL1。方法很簡單,在設(shè)置里面關(guān)閉 WSL2 就可以:
但正如圖中描述所說,Windows Home版本只能使用 WSL2,不支持WSL1,我的正好是Home版本,因此這種方法行不通。
第二種方法
既然問題起因是跨系統(tǒng)文件讀寫性能差,那么我們不要跨系統(tǒng)讀寫不就可以了?
所以我不再把代碼存儲在Windows系統(tǒng)上,改為存儲在 WSL2 上。
1)首先要安裝一個(gè)WSL系統(tǒng),我選擇的是Ubuntu 22.04,在Microsoft Store中搜索Ubuntu安裝就可以:
因?yàn)槲乙呀?jīng)安裝好了,所以圖片中顯示的是“已擁有”。
2)在Docker Desktop中開啟WSL集成功能,并重啟Docker:
開啟WSL集成功能后,我們就可以在Ubuntu里使用docker命令了。
3)進(jìn)入U(xiǎn)buntu shell命令行界面,如下圖所示,搜索ubuntu,點(diǎn)擊就可以:
或者在Powershell中執(zhí)行 wsl -d Ubuntu-22.04 命令也可以。
4)進(jìn)入ubuntu命令行界面后,發(fā)現(xiàn)執(zhí)行docker命令會報(bào)錯(cuò):
這是因?yàn)楫?dāng)前用戶沒有足夠的權(quán)限,解決方法是,在前面加上sudo,即 sudo docker ps
就可以。
但我不想每次都加sudo,太麻煩了。還有另外一種方法,執(zhí)行 sudo usermod -aG docker ${USER}
命令將當(dāng)前用戶加入到docker用戶組就可以不用加sudo了。
注意:加入到docker用戶組后,要關(guān)閉當(dāng)前窗口,重新進(jìn)入ubuntu命令行才會生效!
5)在ubuntu中選一個(gè)路徑作為你項(xiàng)目的存儲目錄,我選的是 /home/workspace 目錄,因?yàn)槲业捻?xiàng)目有上傳到git倉庫,因此我使用 git clone 命令將代碼下載到 /home/workspace 目錄即可。
6)在ubuntu中啟動docker容器,將代碼目錄掛載到docker容器里去,命令參考:
docker run -d -v /home/workspace:/var/www/html --name {CONTAINER_NAME} {IMAGE_NAME}
/home/workspace
是宿主機(jī)路徑, /var/www/html
是容器路徑, {CONTAINER_NAME}
是容器名字, {IMAGE_NAME}
是鏡像名字,需自行替換。
7)現(xiàn)在我的代碼都存儲在ubuntu里了,那在Windows上我還怎么用IDE進(jìn)行開發(fā)?
不用急,在Windows上我們也是可以訪問ubuntu里的文件的。
例如下圖,在IDE里打開項(xiàng)目的時(shí)候,選擇 \\wsl$\Ubuntu-22.04\
,這個(gè)文件夾里的就是ubuntu系統(tǒng)里的文件目錄,然后選擇你代碼所在的文件夾打開就可以了:
8)將代碼改為存儲在ubuntu里后,再次運(yùn)行項(xiàng)目,速度已經(jīng)恢復(fù)正常~
到此這篇關(guān)于PHP項(xiàng)目在Docker(WSL2)中運(yùn)行緩慢的解決方法的文章就介紹到這了,更多相關(guān)PHP項(xiàng)目在Docker中運(yùn)行緩慢內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
php下關(guān)于Cannot use a scalar value as an array的解決辦法
已經(jīng)定義過的一個(gè)布爾型變量在下面被我直接當(dāng)數(shù)組來調(diào)用了,所以就出現(xiàn)錯(cuò)誤了2010-08-08php serialize()與unserialize() 不完全研究
這篇文章主要介紹了php serialize()與unserialize() 的一些區(qū)別,需要的朋友可以參考下2017-11-11PHP使用SOAP擴(kuò)展實(shí)現(xiàn)WebService的方法
這篇文章主要介紹了PHP使用SOAP擴(kuò)展實(shí)現(xiàn)WebService的方法,結(jié)合實(shí)例形式較為詳細(xì)的分析了SOAP擴(kuò)展的原理及實(shí)現(xiàn)WebService的相關(guān)技巧,需要的朋友可以參考下2016-04-04利用ThinkPHP內(nèi)置的ThinkAjax實(shí)現(xiàn)異步傳輸技術(shù)的實(shí)現(xiàn)方法
ThinkPHP的官方文檔沒有給出ThinkAjax的使用方法,令很多初學(xué)者使用起來有些不便,今天學(xué)到這里,也碰到了很多問題,花時(shí)間深究下,做個(gè)學(xué)習(xí)筆記,希望能對初學(xué)者有幫助2011-12-12PHP中將數(shù)組轉(zhuǎn)成XML格式的實(shí)現(xiàn)代碼
網(wǎng)上找的一段代碼! 然后我自己根據(jù)php DOMDocument又寫了一段代碼,需要的朋友可以參考下。2011-08-08php銀聯(lián)網(wǎng)頁支付實(shí)現(xiàn)方法
這篇文章主要介紹了php銀聯(lián)網(wǎng)頁支付實(shí)現(xiàn)方法,實(shí)例分析了php操作銀聯(lián)網(wǎng)支付接口的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-03-03php.ini save_handler 修改不生效的解決辦法
這篇文章主要介紹了php.ini save_handler 修改不生效的解決辦法,需要的朋友可以參考下2014-07-07