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