前言
在本地搭建開發環境我好像沒幾年就要折騰一次,因為本地開發電腦使用的是windows,早些年的時候,用過很多類似WAMP之類的東西,但最終都有或多或少不滿意的地方,前兩年的時候,還折騰過WSL,但也是有這樣那樣的問題,不過后來終于是win版寶塔更新了, 基本能和linux版的保持一致了,雖然有些東西在windows上要不沒有,要不用不了;
最近又換了電腦,本地的環境需要重新配置,借此機會,其實我一直想試試docker,前兩年折騰wsl2的時候,發現其實wsl2的io已經沒有那么差了。 而且Docker Desktop for windows 也已經支持基于wsl2來創建使用了。
(至于為什么要換,因為我老機器上跑的nginx好像內存泄露了一樣,啟動四到五個小時候內存占用就會跑到90%以上;啟動一天,遠程都連不上,鼠標都不會動了;老機器的環境是win版寶塔)
所以,花了幾天的時間,現在終于是弄通了,本文記錄下流程,以做沉淀。
安裝Docker Desktop
Docker Desktop: The #1 Containerization Tool for Developers | Docker
訪問上述鏈接即可下載,訪問不了的話可能需要想想辦法;
至于具體安裝, 這個網上有很多教程,不是本文要記錄的重點,所以暫且路過,不過有一點要說明的是,要使用wsl2;wsl2要求應該是win10某個版本以上,目前你能下載到的新一點的win10鏡像肯定都是沒問題的;wsl2的啟用可能也會有些小步驟,這個也建議去看下資料看看怎么安裝使用,本文略過;
選擇鏡像
假設上面的必備條件都已經準備妥當。
接下來就是選擇鏡像來啟動了, 其實在一開始我是打算全部單獨啟動容器,比如我需要用到的php,mysql,nginx等等,我原計劃打算一個php版本就啟動一個容器,然后以后需要的時候就再用需要的php版本鏡像再啟動一個容器就好了;
但實際操作中,需要自己修改調試的東西還是很多,不僅要先理解docker的基本語法來進行端口映射和卷映射,還需要了解在nginx中怎么配置才能將請求轉發到php進程進行處理,這些坑其實我都已經踩過了,但最后為什么放棄呢?
因為在我的實際開發中,雖然并不是外包公司,但是內部其實還是有很多大大小小的項目的,所以需要經常創建站點部署新項目,每配置一個新項目,我就需要去修改nginx的配置文件來配置代理,中間也記錄了一些操作筆記,也自己盡量劃分好了文件夾等等來實現nginx.conf自動加載某個目錄下的文件來實現快速的新增站點,但這個問題解決完后又發現,在一些項目中,還需要為php安裝特定擴展等等,我還想把php的配置文件映射到本地來隨時修改并保證刪除容器也不會對我做過的修改造成影響等等,更不用說還有mysql等等,這一系列操作,可能熟練了,或者專業的運維人員應該問題不大,但讓我來一個個去配置確實很難受。
后來我還試過利用docker-compose來編排服務依賴等等,在某種程度上來說,確實減少了一些操作步驟等,但我在對docker不是很熟練的情況下, 寫了很多很多個版本,都沒有一次性的成功啟動并完美運行,前前后后也是折騰了兩三天,到了最后還是繞不過手動配置站點以及其它的問題。再加上,需要端口映射,啟動過的容器好像是不能修改端口映射了。 這就很煩,網絡是host模式我這邊僅僅成功了一次,之后就直接失靈再也沒正常過了;
所以,最后最后最后,我還是妥協了,我選擇使用寶塔;
當然,我這次選擇使用docker版的寶塔,相比于win版寶塔,linux版的寶塔要好用的多;
使用寶塔鏡像
其實在以前我是知道在docker hub上是有大佬制作過baota鏡像的,但是因為當時不知道docker具體指令是干什么用的,一知半解下啟動的容器后來因為不懂把卷給刪了,自己可算是把自己給坑到哭了;
這次發現寶塔官方有提供docker鏡像,看了下版本也還算新(8.05);于是就直接拿來使用了;
拉取鏡像: docker pull btpanel/baota:lib
,我建議拉lib標簽的,你可以先看一下官方的docker hub介紹: hub.docker.com/r/btpanel/baota ,介紹里給的例子是拉取lnmp標簽, 本身做php開發確實要這個就剛剛好,但是我啟動后,發現里面的nginx,mysql,php什么的,都是掛掉的, 反正是不能用。試了兩次都不行,最后是卸載了重新安裝才可以,所以與其如此,我覺得直接拉取lib標簽的鏡像就好了,啟動進入后自己需要什么再單獨安裝吧;
啟動容器
docker run --name baota -v E:/www/wwwroot:/www/wwwroot -v E:/www/mysql_data:/www/server/data -v E:/www/vhost:/www/server/panel/vhost -p 22:22 -p 443:443 -p 80:80 -p 888:888 -p 8888:8888 -p 3306:3306 --restart=unless-stopped -d btpanel/baota:lib
上面是我的指令,簡單解釋下:
--name
是給容器起名,我這里就起做baota了;
-v
是卷映射,:
符號作為分隔,前面的是你本地的路徑,后面的是容器內的實際路徑,映射分幾種不同的模式,我這里就是把本機(windows)下的目錄映射到了容器里的具體路徑,比如這里的wwwroot目錄,做完映射就實現了代碼在我本地宿主機上,我可以隨時用windows來編輯修改;最重要的是不會隨著容器刪除等對我的代碼造成影響;以上映射的三個目錄也是遵循官方說明來做的, 一個站點目錄,一個mysql數據目錄,一個是虛擬域名的配置目錄;
-p
是端口映射,因為我本地測試給容器使用host網絡模式失敗,所以最后只能采用bridge模式,bridge模式就必須做端口映射了,不然本地可能就訪問不了你容器內的服務了,語法上,同樣是:
做分隔,前面是本地(宿主機)端口,后面是容器內具體服務的端口,例如我這里有80(nginx),8888(該寶塔鏡像面板默認端口),以及mysql等等;按需做映射,或者如果你可以使用host模式,就不需要做映射了,但是要注意host模式下,是直接占用了宿主機的端口的,要注意這些端口是不是已經被占用;
--restart=unless-stopped
這個意思是僅在非正常停止的情況下自動重啟容器,也有其它選項,可自行查詢按需配置
-d
表示在后臺運行,我想大概就是守護模式運行一個意思;
btpanel/baota:lib
這個是鏡像名稱,要指定使用哪個鏡像來啟動容器;
一般是可以正常啟動的,啟動后訪問 http://localhost:8888/btpanel 就可以進入后臺了,這個地址是官方鏡像默認的地址,你可以自己使用docker進入容器,輸入bt
就可以調出寶塔的指令,可自行進行修改端口,路徑,賬號,密碼等;
進入后版本為8.05,當前最新版本為8.20,我試過直接升級,目前沒發現什么問題;但是要注意,你在容器中做的操作,除了映射到本地的文件夾外,其它內容都會隨著容器的刪除等等丟失!(該問題可以考慮先啟動容器后把環境配置到自己滿意的程度,然后把容器打包為新的鏡像后期備用,同時鏡像也是可以保存為文件的,可以保存為文件方便更換設備時使用)
附加:使用docker中的php來配置vscode中的php驗證等
環境已經使用docker搭建了,其它一些依賴php的服務如果再讓去本地再裝一個php環境就本末倒置了,這點也有解決方案,但是有沒有未知的問題我還不清楚;后續使用中如果有發現我再更新說明;
創建php.bat文件
自己找個目錄,比如我放在了E:/www目錄下,新建php.bat文件,命名隨意;
內容如下,請根據備注釋義按需修改:
@echo offrem 啟用延遲變量擴展setlocal enabledelayedexpansionrem 設置 Docker 容器名稱和 PHP 路徑set CONTAINER_NAME=bt82lnmprem 設置php在docker中的執行路徑set PHP_PATH=phprem 設置Windows映射盤符set WIN_DRIVE=E:\rem 設置要替換為的windows盤符內容set WIN_DRIVE_REPLACE=\rem 原始文件路徑set FILE_PATH=%1if exist "%FILE_PATH%" (rem 將 Windows 路徑轉換為容器內的路徑set "FILE_PATH=!FILE_PATH:%WIN_DRIVE%=%WIN_DRIVE_REPLACE%!"rem 將 Windows 路徑轉換為linux的路徑set FILE_PATH=!FILE_PATH:\=/!)rem 使用 Docker 容器中的 PHP 運行傳遞的 PHP 文件docker exec %CONTAINER_NAME% %PHP_PATH% !FILE_PATH!rem 結束局部化變量的作用域endlocal
以上命令因為有注釋,所以不過多解釋,其中有個修改路徑的操作,是因為我vscode中安裝了code runner插件, 經常直接在php文件中執行某行代碼測試用,這一塊兒代碼專門針對不能使用code runner的問題進行的處理;
配置php路徑等
如上,創建完php.bat文件后,它的路徑假如是這樣: E:/www/php.bat
那么在vscode的配置文件中,路徑就直接這樣寫: E://www//php.bat
,配置完后可以測試一下是否可用
打包容器為鏡像
docker commit bt82lnmp baota
bt82lnmp是新鏡像名稱,baota是當前容器的名稱;
保存鏡像為文件
docker save -o bt82lnmp.tar bt82lnmp
bt82lnmp.tar是文件名稱,可以帶上路徑,像我這樣不帶的話,那就看當前命令行是在哪個目錄下,保存好的文件就直接在這個目錄下了,后面的bt82lnmp是鏡像名稱;
(PS:打包格式好像必須是.tar)
加載鏡像文件
docker load -i PATHFILE
在其它機器上加載鏡像文件,這里的PATHFILE自行更換,填寫你鏡像.tar文件的具體路徑
結語
至此,基本流程全部結束,間斷的折騰了近一周,寫文章寫了快兩個小時,寫到后邊的時候有些內容已經沒有心思寫的更詳細了。但我總體看了下,基本流程應該已經沒問題了;除了可能在實際操作中會碰到的一些亂七八糟的問題,但是基本都可以搜索解決;